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 | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp index ac10405f3..5275b2c8b 100644 --- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp | |||
| @@ -677,6 +677,30 @@ void FoldConstBuffer(Environment& env, IR::Block& block, IR::Inst& inst) { | |||
| 677 | } | 677 | } |
| 678 | } | 678 | } |
| 679 | 679 | ||
| 680 | void FoldDriverConstBuffer(Environment& env, IR::Block& block, IR::Inst& inst, u32 which_bank, | ||
| 681 | u32 offset_start = 0, u32 offset_end = std::numeric_limits<u16>::max()) { | ||
| 682 | const IR::Value bank{inst.Arg(0)}; | ||
| 683 | const IR::Value offset{inst.Arg(1)}; | ||
| 684 | if (!bank.IsImmediate() || !offset.IsImmediate()) { | ||
| 685 | return; | ||
| 686 | } | ||
| 687 | const auto bank_value = bank.U32(); | ||
| 688 | if (bank_value != which_bank) { | ||
| 689 | return; | ||
| 690 | } | ||
| 691 | const auto offset_value = offset.U32(); | ||
| 692 | if (offset_value < offset_start || offset_value >= offset_end) { | ||
| 693 | return; | ||
| 694 | } | ||
| 695 | IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; | ||
| 696 | if (inst.GetOpcode() == IR::Opcode::GetCbufU32) { | ||
| 697 | inst.ReplaceUsesWith(IR::Value{env.ReadCbufValue(bank_value, offset_value)}); | ||
| 698 | } else { | ||
| 699 | inst.ReplaceUsesWith( | ||
| 700 | IR::Value{Common::BitCast<f32>(env.ReadCbufValue(bank_value, offset_value))}); | ||
| 701 | } | ||
| 702 | } | ||
| 703 | |||
| 680 | void ConstantPropagation(Environment& env, IR::Block& block, IR::Inst& inst) { | 704 | void ConstantPropagation(Environment& env, IR::Block& block, IR::Inst& inst) { |
| 681 | switch (inst.GetOpcode()) { | 705 | switch (inst.GetOpcode()) { |
| 682 | case IR::Opcode::GetRegister: | 706 | case IR::Opcode::GetRegister: |
| @@ -825,13 +849,17 @@ void ConstantPropagation(Environment& env, IR::Block& block, IR::Inst& inst) { | |||
| 825 | case IR::Opcode::GetCbufF32: | 849 | case IR::Opcode::GetCbufF32: |
| 826 | case IR::Opcode::GetCbufU32: | 850 | case IR::Opcode::GetCbufU32: |
| 827 | if (env.HasHLEMacroState()) { | 851 | if (env.HasHLEMacroState()) { |
| 828 | return FoldConstBuffer(env, block, inst); | 852 | FoldConstBuffer(env, block, inst); |
| 853 | } | ||
| 854 | if (env.IsPropietaryDriver()) { | ||
| 855 | FoldDriverConstBuffer(env, block, inst, 1); | ||
| 829 | } | 856 | } |
| 830 | break; | 857 | break; |
| 831 | default: | 858 | default: |
| 832 | break; | 859 | break; |
| 833 | } | 860 | } |
| 834 | } | 861 | } |
| 862 | |||
| 835 | } // Anonymous namespace | 863 | } // Anonymous namespace |
| 836 | 864 | ||
| 837 | void ConstantPropagationPass(Environment& env, IR::Program& program) { | 865 | void ConstantPropagationPass(Environment& env, IR::Program& program) { |