diff options
author | Fernando S <fsahmkow27@gmail.com> | 2022-01-03 00:39:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-03 00:39:59 +0100 |
commit | ae7da0b12dd8aef115d741eb60d00ddf8ed357df (patch) | |
tree | 09d269fe3838d1f8aa5672d2af06cbeb9b45d81f /src/shader_recompiler/ir_opt | |
parent | Merge pull request #7659 from ameerj/overlap-overflow (diff) | |
parent | glsl: Add boolean reference workaround (diff) | |
download | yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.gz yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.bz2 yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.lz yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.xz yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.zst yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.zip |
Diffstat (limited to '')
-rw-r--r-- | src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp | 1 | ||||
-rw-r--r-- | src/shader_recompiler/ir_opt/constant_propagation_pass.cpp | 23 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp index 1e476d83d..a78c469be 100644 --- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp +++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp @@ -389,6 +389,7 @@ void VisitUsages(Info& info, IR::Inst& inst) { info.uses_demote_to_helper_invocation = true; break; case IR::Opcode::GetAttribute: + case IR::Opcode::GetAttributeU32: info.loads.mask[static_cast<size_t>(inst.Arg(0).Attribute())] = true; break; case IR::Opcode::SetAttribute: diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp index d089fdd12..c134a12bc 100644 --- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp @@ -505,6 +505,29 @@ void FoldBitCast(IR::Inst& inst, IR::Opcode reverse) { return; } } + if constexpr (op == IR::Opcode::BitCastU32F32) { + // Workaround for new NVIDIA driver bug, where: + // uint attr = ftou(itof(gl_InstanceID)); + // always returned 0. + // We can instead manually optimize this and work around the driver bug: + // uint attr = uint(gl_InstanceID); + if (arg_inst->GetOpcode() == IR::Opcode::GetAttribute) { + const IR::Attribute attr{arg_inst->Arg(0).Attribute()}; + switch (attr) { + case IR::Attribute::PrimitiveId: + case IR::Attribute::InstanceId: + case IR::Attribute::VertexId: + break; + default: + return; + } + // Replace the bitcasts with an integer attribute get + inst.ReplaceOpcode(IR::Opcode::GetAttributeU32); + inst.SetArg(0, arg_inst->Arg(0)); + inst.SetArg(1, arg_inst->Arg(1)); + return; + } + } } void FoldInverseFunc(IR::Inst& inst, IR::Opcode reverse) { |