diff options
Diffstat (limited to 'src/shader_recompiler')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_context.cpp | 22 |
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 | ||
| 35 | bool 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 | |||
| 35 | std::string OutputDecorator(Stage stage, u32 size) { | 48 | std::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 | ||
| 139 | void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) { | 152 | void 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 | } |