diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc index 0c0c474b02..430f05f94c 100644 --- a/src/writer/hlsl/generator_impl.cc +++ b/src/writer/hlsl/generator_impl.cc @@ -2212,6 +2212,35 @@ std::string GeneratorImpl::builtin_to_attribute(ast::Builtin builtin) const { 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) { auto* func_sem = builder_.Sem().Get(func); @@ -2737,10 +2766,8 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) { auto* ty = mem->Type(); auto out = line(); - if (!EmitTypeAndName(out, ty, ast::StorageClass::kNone, - ast::Access::kReadWrite, name)) { - return false; - } + + std::string pre, post; for (auto* deco : mem->Declaration()->decorations()) { if (auto* location = deco->As()) { @@ -2752,16 +2779,16 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) { if (pipeline_stage_uses.count( sem::PipelineStageUsage::kVertexInput)) { - out << " : TEXCOORD" + std::to_string(location->value()); + post += " : TEXCOORD" + std::to_string(location->value()); } else if (pipeline_stage_uses.count( sem::PipelineStageUsage::kVertexOutput)) { - out << " : TEXCOORD" + std::to_string(location->value()); + post += " : TEXCOORD" + std::to_string(location->value()); } else if (pipeline_stage_uses.count( sem::PipelineStageUsage::kFragmentInput)) { - out << " : TEXCOORD" + std::to_string(location->value()); + post += " : TEXCOORD" + std::to_string(location->value()); } else if (pipeline_stage_uses.count( sem::PipelineStageUsage::kFragmentOutput)) { - out << " : SV_Target" + std::to_string(location->value()); + post += " : SV_Target" + std::to_string(location->value()); } else { TINT_ICE(Writer, diagnostics_) << "invalid use of location decoration"; @@ -2772,13 +2799,25 @@ bool GeneratorImpl::EmitStructType(const sem::Struct* str) { diagnostics_.add_error(diag::System::Writer, "unsupported builtin"); return false; } - out << " : " << attr; - } else if (deco->Is()) { - TINT_UNIMPLEMENTED(Writer, diagnostics_) << "interpolate decoration"; + post += " : " + attr; + } else if (auto* interpolate = deco->As()) { + 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 << ";"; } } diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h index fd3c6bdbec..77f2bcfa82 100644 --- a/src/writer/hlsl/generator_impl.h +++ b/src/writer/hlsl/generator_impl.h @@ -353,6 +353,14 @@ class GeneratorImpl : public TextGenerator { /// @returns the string name of the builtin or blank on error 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 /// @param prefix the name prefix /// @returns a unique name diff --git a/test/shader_io/interpolate_input_parameters.wgsl.expected.hlsl b/test/shader_io/interpolate_input_parameters.wgsl.expected.hlsl index 3cd1e7f452..e65399084f 100644 --- a/test/shader_io/interpolate_input_parameters.wgsl.expected.hlsl +++ b/test/shader_io/interpolate_input_parameters.wgsl.expected.hlsl @@ -1,10 +1,22 @@ -SKIP: FAILED - -../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration -******************************************************************** -* The tint shader compiler has encountered an unexpected error. * -* * -* Please help us fix this issue by submitting a bug report at * -* crbug.com/tint with the source program that triggered the bug. * -******************************************************************** +struct tint_symbol_1 { + 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_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; +} diff --git a/test/shader_io/interpolate_input_struct.wgsl.expected.hlsl b/test/shader_io/interpolate_input_struct.wgsl.expected.hlsl index 3cd1e7f452..694807bb3c 100644 --- a/test/shader_io/interpolate_input_struct.wgsl.expected.hlsl +++ b/test/shader_io/interpolate_input_struct.wgsl.expected.hlsl @@ -1,10 +1,25 @@ -SKIP: FAILED - -../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration -******************************************************************** -* The tint shader compiler has encountered an unexpected error. * -* * -* Please help us fix this issue by submitting a bug report at * -* crbug.com/tint with the source program that triggered the bug. * -******************************************************************** +struct In { + float none; + float flat; + float perspective_center; + float perspective_centroid; + float perspective_sample; + float linear_center; + 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; +} diff --git a/test/shader_io/interpolate_return_struct.wgsl.expected.hlsl b/test/shader_io/interpolate_return_struct.wgsl.expected.hlsl index 3cd1e7f452..e7d0604a3f 100644 --- a/test/shader_io/interpolate_return_struct.wgsl.expected.hlsl +++ b/test/shader_io/interpolate_return_struct.wgsl.expected.hlsl @@ -1,10 +1,28 @@ -SKIP: FAILED - -../../src/writer/hlsl/generator_impl.cc:2862 internal compiler error: TINT_UNIMPLEMENTED interpolate decoration -******************************************************************** -* The tint shader compiler has encountered an unexpected error. * -* * -* Please help us fix this issue by submitting a bug report at * -* crbug.com/tint with the source program that triggered the bug. * -******************************************************************** +struct Out { + float4 pos; + float none; + float flat; + float perspective_center; + float perspective_centroid; + float perspective_sample; + 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; +}