writer/hlsl: Implement interpolate attributes

Bug: tint:746
Change-Id: I3133a756d1fe830c0baf45a1251acea9511d92b1
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56246
Kokoro: Kokoro <noreply+kokoro@google.com>
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
James Price 2021-06-28 23:04:43 +00:00
parent f8e0b7dbf1
commit 0dd41c62cf
5 changed files with 131 additions and 39 deletions

View File

@ -2212,6 +2212,35 @@ std::string GeneratorImpl::builtin_to_attribute(ast::Builtin builtin) const {
return ""; return "";
} }
std::string GeneratorImpl::interpolation_to_modifiers(
ast::InterpolationType type,
ast::InterpolationSampling sampling) const {
std::string modifiers;
switch (type) {
case ast::InterpolationType::kPerspective:
modifiers += "linear ";
break;
case ast::InterpolationType::kLinear:
modifiers += "noperspective ";
break;
case ast::InterpolationType::kFlat:
modifiers += "nointerpolation ";
break;
}
switch (sampling) {
case ast::InterpolationSampling::kCentroid:
modifiers += "centroid ";
break;
case ast::InterpolationSampling::kSample:
modifiers += "sample ";
break;
case ast::InterpolationSampling::kCenter:
case ast::InterpolationSampling::kNone:
break;
}
return modifiers;
}
bool GeneratorImpl::EmitEntryPointFunction(ast::Function* func) { bool GeneratorImpl::EmitEntryPointFunction(ast::Function* func) {
auto* func_sem = builder_.Sem().Get(func); auto* func_sem = builder_.Sem().Get(func);
@ -2737,10 +2766,8 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
auto* ty = mem->Type(); auto* ty = mem->Type();
auto out = line(); auto out = line();
if (!EmitTypeAndName(out, ty, ast::StorageClass::kNone,
ast::Access::kReadWrite, name)) { std::string pre, post;
return false;
}
for (auto* deco : mem->Declaration()->decorations()) { for (auto* deco : mem->Declaration()->decorations()) {
if (auto* location = deco->As<ast::LocationDecoration>()) { if (auto* location = deco->As<ast::LocationDecoration>()) {
@ -2752,16 +2779,16 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
if (pipeline_stage_uses.count( if (pipeline_stage_uses.count(
sem::PipelineStageUsage::kVertexInput)) { sem::PipelineStageUsage::kVertexInput)) {
out << " : TEXCOORD" + std::to_string(location->value()); post += " : TEXCOORD" + std::to_string(location->value());
} else if (pipeline_stage_uses.count( } else if (pipeline_stage_uses.count(
sem::PipelineStageUsage::kVertexOutput)) { sem::PipelineStageUsage::kVertexOutput)) {
out << " : TEXCOORD" + std::to_string(location->value()); post += " : TEXCOORD" + std::to_string(location->value());
} else if (pipeline_stage_uses.count( } else if (pipeline_stage_uses.count(
sem::PipelineStageUsage::kFragmentInput)) { sem::PipelineStageUsage::kFragmentInput)) {
out << " : TEXCOORD" + std::to_string(location->value()); post += " : TEXCOORD" + std::to_string(location->value());
} else if (pipeline_stage_uses.count( } else if (pipeline_stage_uses.count(
sem::PipelineStageUsage::kFragmentOutput)) { sem::PipelineStageUsage::kFragmentOutput)) {
out << " : SV_Target" + std::to_string(location->value()); post += " : SV_Target" + std::to_string(location->value());
} else { } else {
TINT_ICE(Writer, diagnostics_) TINT_ICE(Writer, diagnostics_)
<< "invalid use of location decoration"; << "invalid use of location decoration";
@ -2772,13 +2799,25 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
diagnostics_.add_error(diag::System::Writer, "unsupported builtin"); diagnostics_.add_error(diag::System::Writer, "unsupported builtin");
return false; return false;
} }
out << " : " << attr; post += " : " + attr;
} else if (deco->Is<ast::InterpolateDecoration>()) { } else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
TINT_UNIMPLEMENTED(Writer, diagnostics_) << "interpolate decoration"; auto mod = interpolation_to_modifiers(interpolate->type(),
interpolate->sampling());
if (mod.empty()) {
diagnostics_.add_error(diag::System::Writer,
"unsupported interpolation");
return false;
}
pre += mod;
} }
} }
out << ";"; out << pre;
if (!EmitTypeAndName(out, ty, ast::StorageClass::kNone,
ast::Access::kReadWrite, name)) {
return false;
}
out << post << ";";
} }
} }

View File

@ -353,6 +353,14 @@ class GeneratorImpl : public TextGenerator {
/// @returns the string name of the builtin or blank on error /// @returns the string name of the builtin or blank on error
std::string builtin_to_attribute(ast::Builtin builtin) const; std::string builtin_to_attribute(ast::Builtin builtin) const;
/// Converts interpolation attributes to a HLSL modifiers
/// @param type the interpolation type
/// @param sampling the interpolation sampling
/// @returns the string name of the attribute or blank on error
std::string interpolation_to_modifiers(
ast::InterpolationType type,
ast::InterpolationSampling sampling) const;
/// Generate a unique name /// Generate a unique name
/// @param prefix the name prefix /// @param prefix the name prefix
/// @returns a unique name /// @returns a unique name

View File

@ -1,10 +1,22 @@
SKIP: FAILED struct tint_symbol_1 {
float none : TEXCOORD0;
../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration nointerpolation float flat : TEXCOORD1;
******************************************************************** linear float perspective_center : TEXCOORD2;
* The tint shader compiler has encountered an unexpected error. * linear centroid float perspective_centroid : TEXCOORD3;
* * linear sample float perspective_sample : TEXCOORD4;
* Please help us fix this issue by submitting a bug report at * noperspective float linear_center : TEXCOORD5;
* crbug.com/tint with the source program that triggered the bug. * noperspective centroid float linear_centroid : TEXCOORD6;
******************************************************************** noperspective sample float linear_sample : TEXCOORD7;
};
void main(tint_symbol_1 tint_symbol) {
const float none = tint_symbol.none;
const float flat = tint_symbol.flat;
const float perspective_center = tint_symbol.perspective_center;
const float perspective_centroid = tint_symbol.perspective_centroid;
const float perspective_sample = tint_symbol.perspective_sample;
const float linear_center = tint_symbol.linear_center;
const float linear_centroid = tint_symbol.linear_centroid;
const float linear_sample = tint_symbol.linear_sample;
return;
}

View File

@ -1,10 +1,25 @@
SKIP: FAILED struct In {
float none;
../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration float flat;
******************************************************************** float perspective_center;
* The tint shader compiler has encountered an unexpected error. * float perspective_centroid;
* * float perspective_sample;
* Please help us fix this issue by submitting a bug report at * float linear_center;
* crbug.com/tint with the source program that triggered the bug. * float linear_centroid;
******************************************************************** float linear_sample;
};
struct tint_symbol_2 {
float none : TEXCOORD0;
nointerpolation float flat : TEXCOORD1;
linear float perspective_center : TEXCOORD2;
linear centroid float perspective_centroid : TEXCOORD3;
linear sample float perspective_sample : TEXCOORD4;
noperspective float linear_center : TEXCOORD5;
noperspective centroid float linear_centroid : TEXCOORD6;
noperspective sample float linear_sample : TEXCOORD7;
};
void main(tint_symbol_2 tint_symbol_1) {
const In tint_symbol = {tint_symbol_1.none, tint_symbol_1.flat, tint_symbol_1.perspective_center, tint_symbol_1.perspective_centroid, tint_symbol_1.perspective_sample, tint_symbol_1.linear_center, tint_symbol_1.linear_centroid, tint_symbol_1.linear_sample};
return;
}

View File

@ -1,10 +1,28 @@
SKIP: FAILED struct Out {
float4 pos;
../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration float none;
******************************************************************** float flat;
* The tint shader compiler has encountered an unexpected error. * float perspective_center;
* * float perspective_centroid;
* Please help us fix this issue by submitting a bug report at * float perspective_sample;
* crbug.com/tint with the source program that triggered the bug. * float linear_center;
******************************************************************** float linear_centroid;
float linear_sample;
};
struct tint_symbol {
float none : TEXCOORD0;
nointerpolation float flat : TEXCOORD1;
linear float perspective_center : TEXCOORD2;
linear centroid float perspective_centroid : TEXCOORD3;
linear sample float perspective_sample : TEXCOORD4;
noperspective float linear_center : TEXCOORD5;
noperspective centroid float linear_centroid : TEXCOORD6;
noperspective sample float linear_sample : TEXCOORD7;
float4 pos : SV_Position;
};
tint_symbol main() {
const Out tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
const tint_symbol tint_symbol_2 = {tint_symbol_1.none, tint_symbol_1.flat, tint_symbol_1.perspective_center, tint_symbol_1.perspective_centroid, tint_symbol_1.perspective_sample, tint_symbol_1.linear_center, tint_symbol_1.linear_centroid, tint_symbol_1.linear_sample, tint_symbol_1.pos};
return tint_symbol_2;
}