diff options
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) { | |||
| 505 | return; | 505 | return; |
| 506 | } | 506 | } |
| 507 | } | 507 | } |
| 508 | if constexpr (op == IR::Opcode::BitCastU32F32) { | ||
| 509 | // Workaround for new NVIDIA driver bug, where: | ||
| 510 | // uint attr = ftou(itof(gl_InstanceID)); | ||
| 511 | // always returned 0. | ||
| 512 | // We can instead manually optimize this and work around the driver bug: | ||
| 513 | // uint attr = uint(gl_InstanceID); | ||
| 514 | if (arg_inst->GetOpcode() == IR::Opcode::GetAttribute) { | ||
| 515 | const IR::Attribute attr{arg_inst->Arg(0).Attribute()}; | ||
| 516 | switch (attr) { | ||
| 517 | case IR::Attribute::PrimitiveId: | ||
| 518 | case IR::Attribute::InstanceId: | ||
| 519 | case IR::Attribute::VertexId: | ||
| 520 | break; | ||
| 521 | default: | ||
| 522 | return; | ||
| 523 | } | ||
| 524 | // Replace the bitcasts with an integer attribute get | ||
| 525 | inst.ReplaceOpcode(IR::Opcode::GetAttributeU32); | ||
| 526 | inst.SetArg(0, arg_inst->Arg(0)); | ||
| 527 | inst.SetArg(1, arg_inst->Arg(1)); | ||
| 528 | return; | ||
| 529 | } | ||
| 530 | } | ||
| 508 | } | 531 | } |
| 509 | 532 | ||
| 510 | void FoldInverseFunc(IR::Inst& inst, IR::Opcode reverse) { | 533 | void FoldInverseFunc(IR::Inst& inst, IR::Opcode reverse) { |