summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/frontend')
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.cpp8
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.h3
-rw-r--r--src/shader_recompiler/frontend/ir/microinstruction.cpp2
-rw-r--r--src/shader_recompiler/frontend/ir/opcodes.inc4
-rw-r--r--src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp7
5 files changed, 23 insertions, 1 deletions
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
index ff2970125..ce610799a 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
@@ -92,6 +92,14 @@ void IREmitter::DemoteToHelperInvocation(Block* continue_label) {
92 Inst(Opcode::DemoteToHelperInvocation, continue_label); 92 Inst(Opcode::DemoteToHelperInvocation, continue_label);
93} 93}
94 94
95void IREmitter::Prologue() {
96 Inst(Opcode::Prologue);
97}
98
99void IREmitter::Epilogue() {
100 Inst(Opcode::Epilogue);
101}
102
95U32 IREmitter::GetReg(IR::Reg reg) { 103U32 IREmitter::GetReg(IR::Reg reg) {
96 return Inst<U32>(Opcode::GetRegister, reg); 104 return Inst<U32>(Opcode::GetRegister, reg);
97} 105}
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h
index 1708be3ef..39109b0de 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.h
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.h
@@ -39,6 +39,9 @@ public:
39 void Return(); 39 void Return();
40 void DemoteToHelperInvocation(Block* continue_label); 40 void DemoteToHelperInvocation(Block* continue_label);
41 41
42 void Prologue();
43 void Epilogue();
44
42 [[nodiscard]] U32 GetReg(IR::Reg reg); 45 [[nodiscard]] U32 GetReg(IR::Reg reg);
43 void SetReg(IR::Reg reg, const U32& value); 46 void SetReg(IR::Reg reg, const U32& value);
44 47
diff --git a/src/shader_recompiler/frontend/ir/microinstruction.cpp b/src/shader_recompiler/frontend/ir/microinstruction.cpp
index 21b7d8a9f..ba3968056 100644
--- a/src/shader_recompiler/frontend/ir/microinstruction.cpp
+++ b/src/shader_recompiler/frontend/ir/microinstruction.cpp
@@ -56,6 +56,8 @@ bool Inst::MayHaveSideEffects() const noexcept {
56 case Opcode::SelectionMerge: 56 case Opcode::SelectionMerge:
57 case Opcode::Return: 57 case Opcode::Return:
58 case Opcode::DemoteToHelperInvocation: 58 case Opcode::DemoteToHelperInvocation:
59 case Opcode::Prologue:
60 case Opcode::Epilogue:
59 case Opcode::SetAttribute: 61 case Opcode::SetAttribute:
60 case Opcode::SetAttributeIndexed: 62 case Opcode::SetAttributeIndexed:
61 case Opcode::SetFragColor: 63 case Opcode::SetFragColor:
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc
index fe888b8b2..8945c7b04 100644
--- a/src/shader_recompiler/frontend/ir/opcodes.inc
+++ b/src/shader_recompiler/frontend/ir/opcodes.inc
@@ -15,6 +15,10 @@ OPCODE(SelectionMerge, Void, Labe
15OPCODE(Return, Void, ) 15OPCODE(Return, Void, )
16OPCODE(DemoteToHelperInvocation, Void, Label, ) 16OPCODE(DemoteToHelperInvocation, Void, Label, )
17 17
18// Special operations
19OPCODE(Prologue, Void, )
20OPCODE(Epilogue, Void, )
21
18// Context getters/setters 22// Context getters/setters
19OPCODE(GetRegister, U32, Reg, ) 23OPCODE(GetRegister, U32, Reg, )
20OPCODE(SetRegister, Void, Reg, U32, ) 24OPCODE(SetRegister, Void, Reg, U32, )
diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
index cec03e73e..fdac1c95a 100644
--- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
+++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
@@ -634,6 +634,9 @@ public:
634 : stmt_pool{stmt_pool_}, inst_pool{inst_pool_}, block_pool{block_pool_}, env{env_}, 634 : stmt_pool{stmt_pool_}, inst_pool{inst_pool_}, block_pool{block_pool_}, env{env_},
635 block_list{block_list_} { 635 block_list{block_list_} {
636 Visit(root_stmt, nullptr, nullptr); 636 Visit(root_stmt, nullptr, nullptr);
637
638 IR::IREmitter ir{*block_list.front()};
639 ir.Prologue();
637 } 640 }
638 641
639private: 642private:
@@ -734,7 +737,9 @@ private:
734 current_block = block_pool.Create(inst_pool); 737 current_block = block_pool.Create(inst_pool);
735 block_list.push_back(current_block); 738 block_list.push_back(current_block);
736 } 739 }
737 IR::IREmitter{*current_block}.Return(); 740 IR::IREmitter ir{*current_block};
741 ir.Epilogue();
742 ir.Return();
738 current_block = nullptr; 743 current_block = nullptr;
739 break; 744 break;
740 } 745 }