diff options
author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-12-25 02:00:28 +0100 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-12-30 01:03:49 +0100 |
commit | 14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59 (patch) | |
tree | 6d9cb0ebd7d8d7b75d88a0d598c659b06d45004c /src/shader_recompiler/ir_opt/constant_propagation_pass.cpp | |
parent | emit_glsl_floating_point: Fix FPNeg on newer Nvidia drivers (diff) | |
download | yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.tar yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.tar.gz yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.tar.bz2 yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.tar.lz yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.tar.xz yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.tar.zst yuzu-14ac0c2923c41df9c6fc4833d2a8e46a6efe5b59.zip |
Diffstat (limited to 'src/shader_recompiler/ir_opt/constant_propagation_pass.cpp')
-rw-r--r-- | src/shader_recompiler/ir_opt/constant_propagation_pass.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
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) { |