GLSL: fix Position built-in variable.
Position maps to gl_Position in vertex shaders, and gl_FragCoord in
fragment shaders.
Bug: tint:1296
Change-Id: I22069af2c82bb03521f2721d16c29ba98c85f3f2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/69280
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/writer/glsl/generator_impl.cc b/src/writer/glsl/generator_impl.cc
index df24aaa..7668b28 100644
--- a/src/writer/glsl/generator_impl.cc
+++ b/src/writer/glsl/generator_impl.cc
@@ -1758,10 +1758,20 @@
}
}
-const char* GeneratorImpl::builtin_to_string(ast::Builtin builtin) const {
+const char* GeneratorImpl::builtin_to_string(ast::Builtin builtin,
+ ast::PipelineStage stage) {
switch (builtin) {
case ast::Builtin::kPosition:
- return "gl_Position";
+ switch (stage) {
+ case ast::PipelineStage::kVertex:
+ return "gl_Position";
+ case ast::PipelineStage::kFragment:
+ return "gl_FragCoord";
+ default:
+ TINT_ICE(Writer, builder_.Diagnostics())
+ << "position builtin unexpected in this pipeline stage";
+ return "";
+ }
case ast::Builtin::kVertexIndex:
return "gl_VertexID";
case ast::Builtin::kInstanceIndex:
@@ -1959,10 +1969,10 @@
return false;
}
out << "(";
- out << builtin_to_string(builtin->builtin);
+ out << builtin_to_string(builtin->builtin, func->PipelineStage());
out << ")";
} else {
- out << builtin_to_string(builtin->builtin);
+ out << builtin_to_string(builtin->builtin, func->PipelineStage());
}
} else {
out << name;
@@ -1992,7 +2002,7 @@
out << " ";
if (auto* builtin = ast::GetDecoration<ast::BuiltinDecoration>(
member->Declaration()->decorations)) {
- out << builtin_to_string(builtin->builtin);
+ out << builtin_to_string(builtin->builtin, func->PipelineStage());
} else {
out << name;
}
diff --git a/src/writer/glsl/generator_impl.h b/src/writer/glsl/generator_impl.h
index 6155f0b..85522b8 100644
--- a/src/writer/glsl/generator_impl.h
+++ b/src/writer/glsl/generator_impl.h
@@ -347,8 +347,9 @@
std::string generate_builtin_name(const sem::Intrinsic* intrinsic);
/// Converts a builtin to a gl_ string
/// @param builtin the builtin to convert
+ /// @param stage pipeline stage in which this builtin is used
/// @returns the string name of the builtin or blank on error
- const char* builtin_to_string(ast::Builtin builtin) const;
+ const char* builtin_to_string(ast::Builtin builtin, ast::PipelineStage stage);
/// Converts a builtin to a sem::Type appropriate for GLSL.
/// @param builtin the builtin to convert
/// @returns the appropriate semantic type or null on error.
diff --git a/src/writer/glsl/generator_impl_function_test.cc b/src/writer/glsl/generator_impl_function_test.cc
index 9f82acb..2324dd1 100644
--- a/src/writer/glsl/generator_impl_function_test.cc
+++ b/src/writer/glsl/generator_impl_function_test.cc
@@ -208,7 +208,7 @@
}
void main() {
tint_symbol_1 inputs;
- inputs.coord = gl_Position;
+ inputs.coord = gl_FragCoord;
tint_symbol_2 outputs;
outputs = frag_main(inputs);
gl_FragDepth = outputs.value;
@@ -320,7 +320,7 @@
tint_symbol_2 inputs;
inputs.col1 = col1;
inputs.col2 = col2;
- inputs.pos = gl_Position;
+ inputs.pos = gl_FragCoord;
frag_main(inputs);
}
diff --git a/src/writer/glsl/generator_impl_test.cc b/src/writer/glsl/generator_impl_test.cc
index 3075885..c89041f 100644
--- a/src/writer/glsl/generator_impl_test.cc
+++ b/src/writer/glsl/generator_impl_test.cc
@@ -59,7 +59,7 @@
auto params = GetParam();
GeneratorImpl& gen = Build();
- EXPECT_EQ(gen.builtin_to_string(params.builtin),
+ EXPECT_EQ(gen.builtin_to_string(params.builtin, ast::PipelineStage::kVertex),
std::string(params.attribute_name));
}
INSTANTIATE_TEST_SUITE_P(