summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/ir_opt/constant_propagation_pass.cpp')
-rw-r--r--src/shader_recompiler/ir_opt/constant_propagation_pass.cpp30
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
680void 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
680void ConstantPropagation(Environment& env, IR::Block& block, IR::Inst& inst) { 704void 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
837void ConstantPropagationPass(Environment& env, IR::Program& program) { 865void ConstantPropagationPass(Environment& env, IR::Program& program) {