summaryrefslogtreecommitdiff
path: root/src/shader_recompiler
diff options
context:
space:
mode:
authorGravatar FernandoS272021-04-16 23:52:58 +0200
committerGravatar ameerj2021-07-22 21:51:28 -0400
commitf18a6dd1bdaffda4c3e771af3cf7cf41919ebd67 (patch)
treeffd531d2a81f9e48369c7f362e11e224f437fd5c /src/shader_recompiler
parentshader: Fix Phi node types (diff)
downloadyuzu-f18a6dd1bdaffda4c3e771af3cf7cf41919ebd67.tar.gz
yuzu-f18a6dd1bdaffda4c3e771af3cf7cf41919ebd67.tar.xz
yuzu-f18a6dd1bdaffda4c3e771af3cf7cf41919ebd67.zip
shader: Implement SR_Y_DIRECTION
Diffstat (limited to 'src/shader_recompiler')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.h1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp7
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.cpp4
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.h1
-rw-r--r--src/shader_recompiler/frontend/ir/opcodes.inc1
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp2
-rw-r--r--src/shader_recompiler/profile.h2
7 files changed, 18 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h
index d43c72f6e..7949d08d0 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.h
@@ -72,6 +72,7 @@ Id EmitLocalInvocationId(EmitContext& ctx);
72Id EmitInvocationId(EmitContext& ctx); 72Id EmitInvocationId(EmitContext& ctx);
73Id EmitSampleId(EmitContext& ctx); 73Id EmitSampleId(EmitContext& ctx);
74Id EmitIsHelperInvocation(EmitContext& ctx); 74Id EmitIsHelperInvocation(EmitContext& ctx);
75Id EmitYDirection(EmitContext& ctx);
75Id EmitLoadLocal(EmitContext& ctx, Id word_offset); 76Id EmitLoadLocal(EmitContext& ctx, Id word_offset);
76void EmitWriteLocal(EmitContext& ctx, Id word_offset, Id value); 77void EmitWriteLocal(EmitContext& ctx, Id word_offset, Id value);
77Id EmitUndefU1(EmitContext& ctx); 78Id EmitUndefU1(EmitContext& ctx);
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
index e5e4c352b..1030404c0 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
@@ -403,6 +403,13 @@ Id EmitIsHelperInvocation(EmitContext& ctx) {
403 return ctx.OpLoad(ctx.U1, ctx.is_helper_invocation); 403 return ctx.OpLoad(ctx.U1, ctx.is_helper_invocation);
404} 404}
405 405
406Id EmitYDirection(EmitContext& ctx) {
407 if (ctx.profile.y_negate) {
408 return ctx.Constant(ctx.F32[1], -1.0f);
409 }
410 return ctx.Constant(ctx.F32[1], 1.0f);
411}
412
406Id EmitLoadLocal(EmitContext& ctx, Id word_offset) { 413Id EmitLoadLocal(EmitContext& ctx, Id word_offset) {
407 const Id pointer{ctx.OpAccessChain(ctx.private_u32, ctx.local_memory, word_offset)}; 414 const Id pointer{ctx.OpAccessChain(ctx.private_u32, ctx.local_memory, word_offset)};
408 return ctx.OpLoad(ctx.U32[1], pointer); 415 return ctx.OpLoad(ctx.U32[1], pointer);
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
index aebe7200f..c3e8d0681 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
@@ -379,6 +379,10 @@ U1 IREmitter::IsHelperInvocation() {
379 return Inst<U1>(Opcode::IsHelperInvocation); 379 return Inst<U1>(Opcode::IsHelperInvocation);
380} 380}
381 381
382F32 IREmitter::YDirection() {
383 return Inst<F32>(Opcode::YDirection);
384}
385
382U32 IREmitter::LaneId() { 386U32 IREmitter::LaneId() {
383 return Inst<U32>(Opcode::LaneId); 387 return Inst<U32>(Opcode::LaneId);
384} 388}
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h
index b9d051b43..7e67f5e30 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.h
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.h
@@ -102,6 +102,7 @@ public:
102 [[nodiscard]] U32 InvocationId(); 102 [[nodiscard]] U32 InvocationId();
103 [[nodiscard]] U32 SampleId(); 103 [[nodiscard]] U32 SampleId();
104 [[nodiscard]] U1 IsHelperInvocation(); 104 [[nodiscard]] U1 IsHelperInvocation();
105 [[nodiscard]] F32 YDirection();
105 106
106 [[nodiscard]] U32 LaneId(); 107 [[nodiscard]] U32 LaneId();
107 108
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc
index 1cfc2a943..269de8ca5 100644
--- a/src/shader_recompiler/frontend/ir/opcodes.inc
+++ b/src/shader_recompiler/frontend/ir/opcodes.inc
@@ -65,6 +65,7 @@ OPCODE(LocalInvocationId, U32x3,
65OPCODE(InvocationId, U32, ) 65OPCODE(InvocationId, U32, )
66OPCODE(SampleId, U32, ) 66OPCODE(SampleId, U32, )
67OPCODE(IsHelperInvocation, U1, ) 67OPCODE(IsHelperInvocation, U1, )
68OPCODE(YDirection, F32, )
68 69
69// Undefined 70// Undefined
70OPCODE(UndefU1, U1, ) 71OPCODE(UndefU1, U1, )
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp
index 660b84c20..b0baff74b 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp
@@ -150,6 +150,8 @@ enum class SpecialRegister : u64 {
150 return ir.SubgroupGtMask(); 150 return ir.SubgroupGtMask();
151 case SpecialRegister::SR_GEMASK: 151 case SpecialRegister::SR_GEMASK:
152 return ir.SubgroupGeMask(); 152 return ir.SubgroupGeMask();
153 case SpecialRegister::SR_Y_DIRECTION:
154 return ir.BitCast<IR::U32>(ir.YDirection());
153 default: 155 default:
154 throw NotImplementedException("S2R special register {}", special_register); 156 throw NotImplementedException("S2R special register {}", special_register);
155 } 157 }
diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h
index a2c2948d5..08242184f 100644
--- a/src/shader_recompiler/profile.h
+++ b/src/shader_recompiler/profile.h
@@ -97,6 +97,8 @@ struct Profile {
97 std::optional<CompareFunction> alpha_test_func; 97 std::optional<CompareFunction> alpha_test_func;
98 float alpha_test_reference{}; 98 float alpha_test_reference{};
99 99
100 bool y_negate{};
101
100 std::vector<TransformFeedbackVarying> xfb_varyings; 102 std::vector<TransformFeedbackVarying> xfb_varyings;
101}; 103};
102 104