summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/shader_bytecode.h8
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp2
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp5
-rw-r--r--src/video_core/shader/decode/arithmetic.cpp2
-rw-r--r--src/video_core/shader/decode/arithmetic_half.cpp2
-rw-r--r--src/video_core/shader/decode/arithmetic_integer.cpp2
-rw-r--r--src/video_core/shader/decode/conversion.cpp6
-rw-r--r--src/video_core/shader/decode/ffma.cpp4
-rw-r--r--src/video_core/shader/decode/float_set.cpp2
-rw-r--r--src/video_core/shader/decode/float_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/hfma2.cpp7
-rw-r--r--src/video_core/shader/decode/integer_set.cpp2
-rw-r--r--src/video_core/shader/decode/integer_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/memory.cpp6
-rw-r--r--src/video_core/shader/decode/shift.cpp2
-rw-r--r--src/video_core/shader/decode/xmad.cpp5
-rw-r--r--src/video_core/shader/shader_ir.h2
17 files changed, 36 insertions, 25 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h
index 9989825f8..713b01c9f 100644
--- a/src/video_core/engines/shader_bytecode.h
+++ b/src/video_core/engines/shader_bytecode.h
@@ -1248,11 +1248,19 @@ union Instruction {
1248 union { 1248 union {
1249 BitField<20, 14, u64> offset; 1249 BitField<20, 14, u64> offset;
1250 BitField<34, 5, u64> index; 1250 BitField<34, 5, u64> index;
1251
1252 u64 GetOffset() const {
1253 return offset * 4;
1254 }
1251 } cbuf34; 1255 } cbuf34;
1252 1256
1253 union { 1257 union {
1254 BitField<20, 16, s64> offset; 1258 BitField<20, 16, s64> offset;
1255 BitField<36, 5, u64> index; 1259 BitField<36, 5, u64> index;
1260
1261 s64 GetOffset() const {
1262 return offset;
1263 }
1256 } cbuf36; 1264 } cbuf36;
1257 1265
1258 // Unsure about the size of this one. 1266 // Unsure about the size of this one.
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index e3163389f..9f7c837d6 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -954,7 +954,7 @@ void RasterizerOpenGL::SetupConstBuffers(Tegra::Engines::Maxwell3D::Regs::Shader
954 } 954 }
955 } else { 955 } else {
956 // Buffer is accessed directly, upload just what we use 956 // Buffer is accessed directly, upload just what we use
957 size = used_buffer.GetSize() * sizeof(float); 957 size = used_buffer.GetSize();
958 } 958 }
959 959
960 // Align the actual size so it ends up being a multiple of vec4 to meet the OpenGL std140 960 // Align the actual size so it ends up being a multiple of vec4 to meet the OpenGL std140
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 004245431..36035d0d2 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -543,8 +543,9 @@ private:
543 if (const auto immediate = std::get_if<ImmediateNode>(offset)) { 543 if (const auto immediate = std::get_if<ImmediateNode>(offset)) {
544 // Direct access 544 // Direct access
545 const u32 offset_imm = immediate->GetValue(); 545 const u32 offset_imm = immediate->GetValue();
546 return fmt::format("{}[{}][{}]", GetConstBuffer(cbuf->GetIndex()), offset_imm / 4, 546 ASSERT_MSG(offset_imm % 4 == 0, "Unaligned cbuf direct access");
547 offset_imm % 4); 547 return fmt::format("{}[{}][{}]", GetConstBuffer(cbuf->GetIndex()),
548 offset_imm / (4 * 4), (offset_imm / 4) % 4);
548 549
549 } else if (std::holds_alternative<OperationNode>(*offset)) { 550 } else if (std::holds_alternative<OperationNode>(*offset)) {
550 // Indirect access 551 // Indirect access
diff --git a/src/video_core/shader/decode/arithmetic.cpp b/src/video_core/shader/decode/arithmetic.cpp
index e7847f614..51b8d55d4 100644
--- a/src/video_core/shader/decode/arithmetic.cpp
+++ b/src/video_core/shader/decode/arithmetic.cpp
@@ -25,7 +25,7 @@ u32 ShaderIR::DecodeArithmetic(BasicBlock& bb, const BasicBlock& code, u32 pc) {
25 } else if (instr.is_b_gpr) { 25 } else if (instr.is_b_gpr) {
26 return GetRegister(instr.gpr20); 26 return GetRegister(instr.gpr20);
27 } else { 27 } else {
28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
29 } 29 }
30 }(); 30 }();
31 31
diff --git a/src/video_core/shader/decode/arithmetic_half.cpp b/src/video_core/shader/decode/arithmetic_half.cpp
index a237dcb92..37eef2bf2 100644
--- a/src/video_core/shader/decode/arithmetic_half.cpp
+++ b/src/video_core/shader/decode/arithmetic_half.cpp
@@ -35,7 +35,7 @@ u32 ShaderIR::DecodeArithmeticHalf(BasicBlock& bb, const BasicBlock& code, u32 p
35 switch (opcode->get().GetId()) { 35 switch (opcode->get().GetId()) {
36 case OpCode::Id::HADD2_C: 36 case OpCode::Id::HADD2_C:
37 case OpCode::Id::HMUL2_C: 37 case OpCode::Id::HMUL2_C:
38 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 38 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
39 case OpCode::Id::HADD2_R: 39 case OpCode::Id::HADD2_R:
40 case OpCode::Id::HMUL2_R: 40 case OpCode::Id::HMUL2_R:
41 return GetRegister(instr.gpr20); 41 return GetRegister(instr.gpr20);
diff --git a/src/video_core/shader/decode/arithmetic_integer.cpp b/src/video_core/shader/decode/arithmetic_integer.cpp
index 4a8cc1a1c..cc9a76a19 100644
--- a/src/video_core/shader/decode/arithmetic_integer.cpp
+++ b/src/video_core/shader/decode/arithmetic_integer.cpp
@@ -26,7 +26,7 @@ u32 ShaderIR::DecodeArithmeticInteger(BasicBlock& bb, const BasicBlock& code, u3
26 } else if (instr.is_b_gpr) { 26 } else if (instr.is_b_gpr) {
27 return GetRegister(instr.gpr20); 27 return GetRegister(instr.gpr20);
28 } else { 28 } else {
29 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 29 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
30 } 30 }
31 }(); 31 }();
32 32
diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp
index ee18d3a99..728a393a1 100644
--- a/src/video_core/shader/decode/conversion.cpp
+++ b/src/video_core/shader/decode/conversion.cpp
@@ -48,7 +48,7 @@ u32 ShaderIR::DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc) {
48 if (instr.is_b_gpr) { 48 if (instr.is_b_gpr) {
49 return GetRegister(instr.gpr20); 49 return GetRegister(instr.gpr20);
50 } else { 50 } else {
51 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 51 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
52 } 52 }
53 }(); 53 }();
54 const bool input_signed = instr.conversion.is_input_signed; 54 const bool input_signed = instr.conversion.is_input_signed;
@@ -72,7 +72,7 @@ u32 ShaderIR::DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc) {
72 if (instr.is_b_gpr) { 72 if (instr.is_b_gpr) {
73 return GetRegister(instr.gpr20); 73 return GetRegister(instr.gpr20);
74 } else { 74 } else {
75 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 75 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
76 } 76 }
77 }(); 77 }();
78 78
@@ -110,7 +110,7 @@ u32 ShaderIR::DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc) {
110 if (instr.is_b_gpr) { 110 if (instr.is_b_gpr) {
111 return GetRegister(instr.gpr20); 111 return GetRegister(instr.gpr20);
112 } else { 112 } else {
113 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 113 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
114 } 114 }
115 }(); 115 }();
116 116
diff --git a/src/video_core/shader/decode/ffma.cpp b/src/video_core/shader/decode/ffma.cpp
index be8dc2230..52f39d3ff 100644
--- a/src/video_core/shader/decode/ffma.cpp
+++ b/src/video_core/shader/decode/ffma.cpp
@@ -27,14 +27,14 @@ u32 ShaderIR::DecodeFfma(BasicBlock& bb, const BasicBlock& code, u32 pc) {
27 auto [op_b, op_c] = [&]() -> std::tuple<Node, Node> { 27 auto [op_b, op_c] = [&]() -> std::tuple<Node, Node> {
28 switch (opcode->get().GetId()) { 28 switch (opcode->get().GetId()) {
29 case OpCode::Id::FFMA_CR: { 29 case OpCode::Id::FFMA_CR: {
30 return {GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset), 30 return {GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset()),
31 GetRegister(instr.gpr39)}; 31 GetRegister(instr.gpr39)};
32 } 32 }
33 case OpCode::Id::FFMA_RR: 33 case OpCode::Id::FFMA_RR:
34 return {GetRegister(instr.gpr20), GetRegister(instr.gpr39)}; 34 return {GetRegister(instr.gpr20), GetRegister(instr.gpr39)};
35 case OpCode::Id::FFMA_RC: { 35 case OpCode::Id::FFMA_RC: {
36 return {GetRegister(instr.gpr39), 36 return {GetRegister(instr.gpr39),
37 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset)}; 37 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset())};
38 } 38 }
39 case OpCode::Id::FFMA_IMM: 39 case OpCode::Id::FFMA_IMM:
40 return {GetImmediate19(instr), GetRegister(instr.gpr39)}; 40 return {GetImmediate19(instr), GetRegister(instr.gpr39)};
diff --git a/src/video_core/shader/decode/float_set.cpp b/src/video_core/shader/decode/float_set.cpp
index ba846f1bd..9f9da2278 100644
--- a/src/video_core/shader/decode/float_set.cpp
+++ b/src/video_core/shader/decode/float_set.cpp
@@ -25,7 +25,7 @@ u32 ShaderIR::DecodeFloatSet(BasicBlock& bb, const BasicBlock& code, u32 pc) {
25 } else if (instr.is_b_gpr) { 25 } else if (instr.is_b_gpr) {
26 return GetRegister(instr.gpr20); 26 return GetRegister(instr.gpr20);
27 } else { 27 } else {
28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
29 } 29 }
30 }(); 30 }();
31 31
diff --git a/src/video_core/shader/decode/float_set_predicate.cpp b/src/video_core/shader/decode/float_set_predicate.cpp
index e88b04d18..dd3aef6f2 100644
--- a/src/video_core/shader/decode/float_set_predicate.cpp
+++ b/src/video_core/shader/decode/float_set_predicate.cpp
@@ -25,7 +25,7 @@ u32 ShaderIR::DecodeFloatSetPredicate(BasicBlock& bb, const BasicBlock& code, u3
25 } else if (instr.is_b_gpr) { 25 } else if (instr.is_b_gpr) {
26 return GetRegister(instr.gpr20); 26 return GetRegister(instr.gpr20);
27 } else { 27 } else {
28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
29 } 29 }
30 }(); 30 }();
31 op_b = GetOperandAbsNegFloat(op_b, instr.fsetp.abs_b, false); 31 op_b = GetOperandAbsNegFloat(op_b, instr.fsetp.abs_b, false);
diff --git a/src/video_core/shader/decode/hfma2.cpp b/src/video_core/shader/decode/hfma2.cpp
index 4a6b945f9..43a0a9e10 100644
--- a/src/video_core/shader/decode/hfma2.cpp
+++ b/src/video_core/shader/decode/hfma2.cpp
@@ -39,13 +39,14 @@ u32 ShaderIR::DecodeHfma2(BasicBlock& bb, const BasicBlock& code, u32 pc) {
39 neg_b = instr.hfma2.negate_b; 39 neg_b = instr.hfma2.negate_b;
40 neg_c = instr.hfma2.negate_c; 40 neg_c = instr.hfma2.negate_c;
41 return {instr.hfma2.saturate, instr.hfma2.type_b, 41 return {instr.hfma2.saturate, instr.hfma2.type_b,
42 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset), instr.hfma2.type_reg39, 42 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset()),
43 GetRegister(instr.gpr39)}; 43 instr.hfma2.type_reg39, GetRegister(instr.gpr39)};
44 case OpCode::Id::HFMA2_RC: 44 case OpCode::Id::HFMA2_RC:
45 neg_b = instr.hfma2.negate_b; 45 neg_b = instr.hfma2.negate_b;
46 neg_c = instr.hfma2.negate_c; 46 neg_c = instr.hfma2.negate_c;
47 return {instr.hfma2.saturate, instr.hfma2.type_reg39, GetRegister(instr.gpr39), 47 return {instr.hfma2.saturate, instr.hfma2.type_reg39, GetRegister(instr.gpr39),
48 instr.hfma2.type_b, GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset)}; 48 instr.hfma2.type_b,
49 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset())};
49 case OpCode::Id::HFMA2_RR: 50 case OpCode::Id::HFMA2_RR:
50 neg_b = instr.hfma2.rr.negate_b; 51 neg_b = instr.hfma2.rr.negate_b;
51 neg_c = instr.hfma2.rr.negate_c; 52 neg_c = instr.hfma2.rr.negate_c;
diff --git a/src/video_core/shader/decode/integer_set.cpp b/src/video_core/shader/decode/integer_set.cpp
index 85e67b03b..16eb3985f 100644
--- a/src/video_core/shader/decode/integer_set.cpp
+++ b/src/video_core/shader/decode/integer_set.cpp
@@ -23,7 +23,7 @@ u32 ShaderIR::DecodeIntegerSet(BasicBlock& bb, const BasicBlock& code, u32 pc) {
23 } else if (instr.is_b_gpr) { 23 } else if (instr.is_b_gpr) {
24 return GetRegister(instr.gpr20); 24 return GetRegister(instr.gpr20);
25 } else { 25 } else {
26 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 26 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
27 } 27 }
28 }(); 28 }();
29 29
diff --git a/src/video_core/shader/decode/integer_set_predicate.cpp b/src/video_core/shader/decode/integer_set_predicate.cpp
index c8b105a08..daf97174b 100644
--- a/src/video_core/shader/decode/integer_set_predicate.cpp
+++ b/src/video_core/shader/decode/integer_set_predicate.cpp
@@ -25,7 +25,7 @@ u32 ShaderIR::DecodeIntegerSetPredicate(BasicBlock& bb, const BasicBlock& code,
25 } else if (instr.is_b_gpr) { 25 } else if (instr.is_b_gpr) {
26 return GetRegister(instr.gpr20); 26 return GetRegister(instr.gpr20);
27 } else { 27 } else {
28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 28 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
29 } 29 }
30 }(); 30 }();
31 31
diff --git a/src/video_core/shader/decode/memory.cpp b/src/video_core/shader/decode/memory.cpp
index 04cb386b7..4d075f088 100644
--- a/src/video_core/shader/decode/memory.cpp
+++ b/src/video_core/shader/decode/memory.cpp
@@ -80,7 +80,7 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) {
80 Node index = GetRegister(instr.gpr8); 80 Node index = GetRegister(instr.gpr8);
81 81
82 const Node op_a = 82 const Node op_a =
83 GetConstBufferIndirect(instr.cbuf36.index, instr.cbuf36.offset + 0, index); 83 GetConstBufferIndirect(instr.cbuf36.index, instr.cbuf36.GetOffset() + 0, index);
84 84
85 switch (instr.ld_c.type.Value()) { 85 switch (instr.ld_c.type.Value()) {
86 case Tegra::Shader::UniformType::Single: 86 case Tegra::Shader::UniformType::Single:
@@ -89,7 +89,7 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) {
89 89
90 case Tegra::Shader::UniformType::Double: { 90 case Tegra::Shader::UniformType::Double: {
91 const Node op_b = 91 const Node op_b =
92 GetConstBufferIndirect(instr.cbuf36.index, instr.cbuf36.offset + 4, index); 92 GetConstBufferIndirect(instr.cbuf36.index, instr.cbuf36.GetOffset() + 4, index);
93 93
94 SetTemporal(bb, 0, op_a); 94 SetTemporal(bb, 0, op_a);
95 SetTemporal(bb, 1, op_b); 95 SetTemporal(bb, 1, op_b);
@@ -142,7 +142,7 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) {
142 ASSERT(cbuf != nullptr); 142 ASSERT(cbuf != nullptr);
143 const auto cbuf_offset_imm = std::get_if<ImmediateNode>(cbuf->GetOffset()); 143 const auto cbuf_offset_imm = std::get_if<ImmediateNode>(cbuf->GetOffset());
144 ASSERT(cbuf_offset_imm != nullptr); 144 ASSERT(cbuf_offset_imm != nullptr);
145 const auto cbuf_offset = cbuf_offset_imm->GetValue() * 4; 145 const auto cbuf_offset = cbuf_offset_imm->GetValue();
146 146
147 bb.push_back(Comment( 147 bb.push_back(Comment(
148 fmt::format("Base address is c[0x{:x}][0x{:x}]", cbuf->GetIndex(), cbuf_offset))); 148 fmt::format("Base address is c[0x{:x}][0x{:x}]", cbuf->GetIndex(), cbuf_offset)));
diff --git a/src/video_core/shader/decode/shift.cpp b/src/video_core/shader/decode/shift.cpp
index 85026bb37..6623f8ff9 100644
--- a/src/video_core/shader/decode/shift.cpp
+++ b/src/video_core/shader/decode/shift.cpp
@@ -23,7 +23,7 @@ u32 ShaderIR::DecodeShift(BasicBlock& bb, const BasicBlock& code, u32 pc) {
23 } else if (instr.is_b_gpr) { 23 } else if (instr.is_b_gpr) {
24 return GetRegister(instr.gpr20); 24 return GetRegister(instr.gpr20);
25 } else { 25 } else {
26 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset); 26 return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
27 } 27 }
28 }(); 28 }();
29 29
diff --git a/src/video_core/shader/decode/xmad.cpp b/src/video_core/shader/decode/xmad.cpp
index 0cd9cd1cc..9cb864500 100644
--- a/src/video_core/shader/decode/xmad.cpp
+++ b/src/video_core/shader/decode/xmad.cpp
@@ -32,13 +32,14 @@ u32 ShaderIR::DecodeXmad(BasicBlock& bb, const BasicBlock& code, u32 pc) {
32 auto [is_merge, op_b, op_c] = [&]() -> std::tuple<bool, Node, Node> { 32 auto [is_merge, op_b, op_c] = [&]() -> std::tuple<bool, Node, Node> {
33 switch (opcode->get().GetId()) { 33 switch (opcode->get().GetId()) {
34 case OpCode::Id::XMAD_CR: 34 case OpCode::Id::XMAD_CR:
35 return {instr.xmad.merge_56, GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset), 35 return {instr.xmad.merge_56,
36 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset()),
36 GetRegister(instr.gpr39)}; 37 GetRegister(instr.gpr39)};
37 case OpCode::Id::XMAD_RR: 38 case OpCode::Id::XMAD_RR:
38 return {instr.xmad.merge_37, GetRegister(instr.gpr20), GetRegister(instr.gpr39)}; 39 return {instr.xmad.merge_37, GetRegister(instr.gpr20), GetRegister(instr.gpr39)};
39 case OpCode::Id::XMAD_RC: 40 case OpCode::Id::XMAD_RC:
40 return {false, GetRegister(instr.gpr39), 41 return {false, GetRegister(instr.gpr39),
41 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.offset)}; 42 GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset())};
42 case OpCode::Id::XMAD_IMM: 43 case OpCode::Id::XMAD_IMM:
43 return {instr.xmad.merge_37, Immediate(static_cast<u32>(instr.xmad.imm20_16)), 44 return {instr.xmad.merge_37, Immediate(static_cast<u32>(instr.xmad.imm20_16)),
44 GetRegister(instr.gpr39)}; 45 GetRegister(instr.gpr39)};
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h
index c4ecb2e3c..6e42e3dfb 100644
--- a/src/video_core/shader/shader_ir.h
+++ b/src/video_core/shader/shader_ir.h
@@ -249,7 +249,7 @@ public:
249 } 249 }
250 250
251 u32 GetSize() const { 251 u32 GetSize() const {
252 return max_offset + 1; 252 return max_offset + sizeof(float);
253 } 253 }
254 254
255private: 255private: