diff options
| author | 2021-04-01 01:07:51 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:25 -0400 | |
| commit | f1dd743731bd0e7b7f1ef172882971bcd15eb5bc (patch) | |
| tree | bd3cf90bce9b0b4ecafb12bd269a250c000336d4 /src/shader_recompiler | |
| parent | shader: Fix constant propagation to use reverse post order (diff) | |
| download | yuzu-f1dd743731bd0e7b7f1ef172882971bcd15eb5bc.tar.gz yuzu-f1dd743731bd0e7b7f1ef172882971bcd15eb5bc.tar.xz yuzu-f1dd743731bd0e7b7f1ef172882971bcd15eb5bc.zip | |
shader: Fix dependency on identity removal pass
Diffstat (limited to 'src/shader_recompiler')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_context.cpp | 2 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv.cpp | 9 |
2 files changed, 8 insertions, 3 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_context.cpp b/src/shader_recompiler/backend/spirv/emit_context.cpp index b0f7e2269..3b3fea50c 100644 --- a/src/shader_recompiler/backend/spirv/emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/emit_context.cpp | |||
| @@ -114,7 +114,7 @@ EmitContext::~EmitContext() = default; | |||
| 114 | 114 | ||
| 115 | Id EmitContext::Def(const IR::Value& value) { | 115 | Id EmitContext::Def(const IR::Value& value) { |
| 116 | if (!value.IsImmediate()) { | 116 | if (!value.IsImmediate()) { |
| 117 | return value.Inst()->Definition<Id>(); | 117 | return value.InstRecursive()->Definition<Id>(); |
| 118 | } | 118 | } |
| 119 | switch (value.Type()) { | 119 | switch (value.Type()) { |
| 120 | case IR::Type::Void: | 120 | case IR::Type::Void: |
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 6389d80bf..9dc769307 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp | |||
| @@ -250,7 +250,7 @@ Id PhiArgDef(EmitContext& ctx, IR::Inst* inst, size_t index) { | |||
| 250 | // Let the context handle immediate definitions, as it already knows how | 250 | // Let the context handle immediate definitions, as it already knows how |
| 251 | return ctx.Def(arg); | 251 | return ctx.Def(arg); |
| 252 | } | 252 | } |
| 253 | IR::Inst* const arg_inst{arg.Inst()}; | 253 | IR::Inst* const arg_inst{arg.InstRecursive()}; |
| 254 | if (const Id def{arg_inst->Definition<Id>()}; Sirit::ValidId(def)) { | 254 | if (const Id def{arg_inst->Definition<Id>()}; Sirit::ValidId(def)) { |
| 255 | // Return the current definition if it exists | 255 | // Return the current definition if it exists |
| 256 | return def; | 256 | return def; |
| @@ -296,7 +296,12 @@ Id EmitPhi(EmitContext& ctx, IR::Inst* inst) { | |||
| 296 | void EmitVoid(EmitContext&) {} | 296 | void EmitVoid(EmitContext&) {} |
| 297 | 297 | ||
| 298 | Id EmitIdentity(EmitContext& ctx, const IR::Value& value) { | 298 | Id EmitIdentity(EmitContext& ctx, const IR::Value& value) { |
| 299 | return ctx.Def(value); | 299 | if (const Id id = ctx.Def(value); Sirit::ValidId(id)) { |
| 300 | return id; | ||
| 301 | } | ||
| 302 | const Id def{ctx.ForwardDeclarationId()}; | ||
| 303 | value.InstRecursive()->SetDefinition<Id>(def); | ||
| 304 | return def; | ||
| 300 | } | 305 | } |
| 301 | 306 | ||
| 302 | void EmitGetZeroFromOp(EmitContext&) { | 307 | void EmitGetZeroFromOp(EmitContext&) { |