summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/frontend/ir
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.cpp49
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.h12
-rw-r--r--src/shader_recompiler/frontend/ir/modifiers.h13
-rw-r--r--src/shader_recompiler/frontend/ir/opcodes.inc12
4 files changed, 18 insertions, 68 deletions
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
index b5f61956a..5e94edd74 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
@@ -82,8 +82,17 @@ void IREmitter::SelectionMerge(Block* merge_block) {
Inst(Opcode::SelectionMerge, merge_block);
}
-void IREmitter::MemoryBarrier(BarrierInstInfo info) {
- Inst(Opcode::MemoryBarrier, Flags{info});
+void IREmitter::MemoryBarrier(MemoryScope scope) {
+ switch (scope) {
+ case MemoryScope::Workgroup:
+ Inst(Opcode::MemoryBarrierWorkgroupLevel);
+ case MemoryScope::Device:
+ Inst(Opcode::MemoryBarrierDeviceLevel);
+ case MemoryScope::System:
+ Inst(Opcode::MemoryBarrierSystemLevel);
+ default:
+ throw InvalidArgument("Invalid memory scope {}", scope);
+ }
}
void IREmitter::Return() {
@@ -202,38 +211,6 @@ void IREmitter::SetOFlag(const U1& value) {
Inst(Opcode::SetOFlag, value);
}
-U1 IREmitter::GetFCSMFlag() {
- return Inst<U1>(Opcode::GetFCSMFlag);
-}
-
-U1 IREmitter::GetTAFlag() {
- return Inst<U1>(Opcode::GetTAFlag);
-}
-
-U1 IREmitter::GetTRFlag() {
- return Inst<U1>(Opcode::GetTRFlag);
-}
-
-U1 IREmitter::GetMXFlag() {
- return Inst<U1>(Opcode::GetMXFlag);
-}
-
-void IREmitter::SetFCSMFlag(const U1& value) {
- Inst(Opcode::SetFCSMFlag, value);
-}
-
-void IREmitter::SetTAFlag(const U1& value) {
- Inst(Opcode::SetTAFlag, value);
-}
-
-void IREmitter::SetTRFlag(const U1& value) {
- Inst(Opcode::SetTRFlag, value);
-}
-
-void IREmitter::SetMXFlag(const U1& value) {
- Inst(Opcode::SetMXFlag, value);
-}
-
static U1 GetFlowTest(IREmitter& ir, FlowTest flow_test) {
switch (flow_test) {
case FlowTest::F:
@@ -292,9 +269,9 @@ static U1 GetFlowTest(IREmitter& ir, FlowTest flow_test) {
return ir.LogicalOr(ir.GetSFlag(), ir.GetZFlag());
case FlowTest::RGT:
return ir.LogicalAnd(ir.LogicalNot(ir.GetSFlag()), ir.LogicalNot(ir.GetZFlag()));
-
case FlowTest::FCSM_TR:
- return ir.LogicalAnd(ir.GetFCSMFlag(), ir.GetTRFlag());
+ // LOG_WARNING(ShaderDecompiler, "FCSM_TR CC State (Stubbed)");
+ return ir.Imm1(false);
case FlowTest::CSM_TA:
case FlowTest::CSM_TR:
case FlowTest::CSM_MX:
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h
index e034d672f..14b743975 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.h
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.h
@@ -70,16 +70,6 @@ public:
void SetCFlag(const U1& value);
void SetOFlag(const U1& value);
- [[nodiscard]] U1 GetFCSMFlag();
- [[nodiscard]] U1 GetTAFlag();
- [[nodiscard]] U1 GetTRFlag();
- [[nodiscard]] U1 GetMXFlag();
-
- void SetFCSMFlag(const U1& value);
- void SetTAFlag(const U1& value);
- void SetTRFlag(const U1& value);
- void SetMXFlag(const U1& value);
-
[[nodiscard]] U1 Condition(IR::Condition cond);
[[nodiscard]] U1 GetFlowTestResult(FlowTest test);
@@ -138,7 +128,7 @@ public:
[[nodiscard]] Value Select(const U1& condition, const Value& true_value,
const Value& false_value);
- [[nodiscard]] void MemoryBarrier(BarrierInstInfo info);
+ [[nodiscard]] void MemoryBarrier(MemoryScope scope);
template <typename Dest, typename Source>
[[nodiscard]] Dest BitCast(const Source& value);
diff --git a/src/shader_recompiler/frontend/ir/modifiers.h b/src/shader_recompiler/frontend/ir/modifiers.h
index 7730c25a9..2aa4ac79b 100644
--- a/src/shader_recompiler/frontend/ir/modifiers.h
+++ b/src/shader_recompiler/frontend/ir/modifiers.h
@@ -25,13 +25,7 @@ enum class FpRounding : u8 {
RZ, // Round towards zero
};
-enum class MemoryScope : u32 {
- DontCare,
- Warp,
- Workgroup,
- Device,
- System
-};
+enum class MemoryScope : u32 { DontCare, Warp, Workgroup, Device, System };
struct FpControl {
bool no_contraction{false};
@@ -40,11 +34,6 @@ struct FpControl {
};
static_assert(sizeof(FpControl) <= sizeof(u32));
-union BarrierInstInfo {
- u32 raw;
- BitField<0, 3, MemoryScope> scope;
-};
-
union TextureInstInfo {
u32 raw;
BitField<0, 8, TextureType> type;
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc
index 74e956930..3640a5d24 100644
--- a/src/shader_recompiler/frontend/ir/opcodes.inc
+++ b/src/shader_recompiler/frontend/ir/opcodes.inc
@@ -17,7 +17,9 @@ OPCODE(Unreachable, Void,
OPCODE(DemoteToHelperInvocation, Void, Label, )
// Barriers
-OPCODE(MemoryBarrier, Void, )
+OPCODE(MemoryBarrierWorkgroupLevel, Void, )
+OPCODE(MemoryBarrierDeviceLevel, Void, )
+OPCODE(MemoryBarrierSystemLevel, Void, )
// Special operations
OPCODE(Prologue, Void, )
@@ -49,18 +51,10 @@ OPCODE(GetZFlag, U1, Void
OPCODE(GetSFlag, U1, Void, )
OPCODE(GetCFlag, U1, Void, )
OPCODE(GetOFlag, U1, Void, )
-OPCODE(GetFCSMFlag, U1, Void, )
-OPCODE(GetTAFlag, U1, Void, )
-OPCODE(GetTRFlag, U1, Void, )
-OPCODE(GetMXFlag, U1, Void, )
OPCODE(SetZFlag, Void, U1, )
OPCODE(SetSFlag, Void, U1, )
OPCODE(SetCFlag, Void, U1, )
OPCODE(SetOFlag, Void, U1, )
-OPCODE(SetFCSMFlag, Void, U1, )
-OPCODE(SetTAFlag, Void, U1, )
-OPCODE(SetTRFlag, Void, U1, )
-OPCODE(SetMXFlag, Void, U1, )
OPCODE(WorkgroupId, U32x3, )
OPCODE(LocalInvocationId, U32x3, )
OPCODE(LaneId, U32, )