summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 6e164b958..6f10002fe 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -32,6 +32,19 @@ std::string_view InputArrayDecorator(Stage stage) {
32 } 32 }
33} 33}
34 34
35bool StoresPerVertexAttributes(Stage stage) {
36 switch (stage) {
37 case Stage::VertexA:
38 case Stage::VertexB:
39 case Stage::Geometry:
40 case Stage::TessellationControl:
41 case Stage::TessellationEval:
42 return true;
43 default:
44 return false;
45 }
46}
47
35std::string OutputDecorator(Stage stage, u32 size) { 48std::string OutputDecorator(Stage stage, u32 size) {
36 switch (stage) { 49 switch (stage) {
37 case Stage::TessellationControl: 50 case Stage::TessellationControl:
@@ -137,7 +150,7 @@ std::string_view OutputPrimitive(OutputTopology topology) {
137} 150}
138 151
139void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) { 152void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
140 if (stage != Stage::VertexA && stage != Stage::VertexB && stage != Stage::Geometry) { 153 if (!StoresPerVertexAttributes(stage)) {
141 return; 154 return;
142 } 155 }
143 header += "out gl_PerVertex{"; 156 header += "out gl_PerVertex{";
@@ -150,8 +163,11 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
150 if (info.stores_clip_distance) { 163 if (info.stores_clip_distance) {
151 header += "float gl_ClipDistance[];"; 164 header += "float gl_ClipDistance[];";
152 } 165 }
166 if (info.stores_viewport_index && stage != Stage::Geometry) {
167 header += "int gl_ViewportIndex;";
168 }
153 header += "};\n"; 169 header += "};\n";
154 if (info.stores_viewport_index) { 170 if (info.stores_viewport_index && stage == Stage::Geometry) {
155 header += "out int gl_ViewportIndex;"; 171 header += "out int gl_ViewportIndex;";
156 } 172 }
157} 173}
@@ -265,7 +281,7 @@ void EmitContext::SetupExtensions(std::string&) {
265 header += "#extension GL_ARB_gpu_shader_int64 : enable\n"; 281 header += "#extension GL_ARB_gpu_shader_int64 : enable\n";
266 } 282 }
267 } 283 }
268 if (info.stores_viewport_index) { 284 if (info.stores_viewport_index && stage != Stage::Geometry) {
269 header += "#extension GL_ARB_shader_viewport_layer_array : enable\n"; 285 header += "#extension GL_ARB_shader_viewport_layer_array : enable\n";
270 } 286 }
271} 287}