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 | |
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')
-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) { |