diff options
| author | 2021-06-21 01:07:10 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:39 -0400 | |
| commit | 808ef97a086e7cc58a3ceded1de516ad6a6be5d3 (patch) | |
| tree | b79be02801ddadb44940d2c77fa0ae5c571dc557 /src/shader_recompiler/backend/glsl/emit_glsl.cpp | |
| parent | gl_graphics_pipeline: Fix assembly shaders check for transform feedbacks (diff) | |
| download | yuzu-808ef97a086e7cc58a3ceded1de516ad6a6be5d3.tar.gz yuzu-808ef97a086e7cc58a3ceded1de516ad6a6be5d3.tar.xz yuzu-808ef97a086e7cc58a3ceded1de516ad6a6be5d3.zip | |
shader: Move loop safety tests to code emission
Diffstat (limited to 'src/shader_recompiler/backend/glsl/emit_glsl.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_glsl.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index ff869923f..32c4f1da2 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <string> | 6 | #include <string> |
| 7 | 7 | ||
| 8 | #include "common/alignment.h" | 8 | #include "common/alignment.h" |
| 9 | #include "common/settings.h" | ||
| 9 | #include "shader_recompiler/backend/glsl/emit_context.h" | 10 | #include "shader_recompiler/backend/glsl/emit_context.h" |
| 10 | #include "shader_recompiler/backend/glsl/emit_glsl.h" | 11 | #include "shader_recompiler/backend/glsl/emit_glsl.h" |
| 11 | #include "shader_recompiler/backend/glsl/emit_glsl_instructions.h" | 12 | #include "shader_recompiler/backend/glsl/emit_glsl_instructions.h" |
| @@ -156,7 +157,12 @@ void EmitCode(EmitContext& ctx, const IR::Program& program) { | |||
| 156 | ctx.Add("for(;;){{"); | 157 | ctx.Add("for(;;){{"); |
| 157 | break; | 158 | break; |
| 158 | case IR::AbstractSyntaxNode::Type::Repeat: | 159 | case IR::AbstractSyntaxNode::Type::Repeat: |
| 159 | ctx.Add("if(!{}){{break;}}}}", ctx.var_alloc.Consume(node.data.repeat.cond)); | 160 | if (Settings::values.disable_shader_loop_safety_checks) { |
| 161 | ctx.Add("if(!{}){{break;}}}}", ctx.var_alloc.Consume(node.data.repeat.cond)); | ||
| 162 | } else { | ||
| 163 | ctx.Add("if(--loop{}<0 || !{}){{break;}}}}", ctx.num_safety_loop_vars++, | ||
| 164 | ctx.var_alloc.Consume(node.data.repeat.cond)); | ||
| 165 | } | ||
| 160 | break; | 166 | break; |
| 161 | default: | 167 | default: |
| 162 | throw NotImplementedException("AbstractSyntaxNode Type {}", node.type); | 168 | throw NotImplementedException("AbstractSyntaxNode Type {}", node.type); |
| @@ -198,6 +204,9 @@ void DefineVariables(const EmitContext& ctx, std::string& header) { | |||
| 198 | ctx.var_alloc.Representation(index, type), type_name); | 204 | ctx.var_alloc.Representation(index, type), type_name); |
| 199 | } | 205 | } |
| 200 | } | 206 | } |
| 207 | for (u32 i = 0; i < ctx.num_safety_loop_vars; ++i) { | ||
| 208 | header += fmt::format("int loop{}=0x2000;", i); | ||
| 209 | } | ||
| 201 | } | 210 | } |
| 202 | } // Anonymous namespace | 211 | } // Anonymous namespace |
| 203 | 212 | ||