diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/shader/decode/arithmetic.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/arithmetic_half.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/arithmetic_integer.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/conversion.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/shader/decode/ffma.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/shader/decode/float_set.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/float_set_predicate.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/hfma2.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/shader/decode/integer_set.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/integer_set_predicate.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/memory.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/shader/decode/shift.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/shader/decode/xmad.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 2 |
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 | ||
| 255 | private: | 255 | private: |