summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-30 23:08:17 -0300
committerGravatar ameerj2021-07-22 21:51:34 -0400
commit05d41fa9b70af6d469f2f6f1474436c9255e9bc3 (patch)
tree52bd8f8a6456c46fc9120aafa99b2d4a45b79746 /src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
parentshader: Implement ISCADD32I (diff)
downloadyuzu-05d41fa9b70af6d469f2f6f1474436c9255e9bc3.tar.gz
yuzu-05d41fa9b70af6d469f2f6f1474436c9255e9bc3.tar.xz
yuzu-05d41fa9b70af6d469f2f6f1474436c9255e9bc3.zip
shader: Add support for "negative" and unaligned offsets
"Negative" offsets don't exist. They are shown as such due to a bug in nvdisasm. Unaligned offsets have been proved to read the aligned offset. For example, when reading an U32, if the offset is 6, the offset read will be 4.
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
index 88bbac0a5..b446aae0e 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
@@ -122,14 +122,14 @@ IR::F64 TranslatorVisitor::GetDoubleReg39(u64 insn) {
122static std::pair<IR::U32, IR::U32> CbufAddr(u64 insn) { 122static std::pair<IR::U32, IR::U32> CbufAddr(u64 insn) {
123 union { 123 union {
124 u64 raw; 124 u64 raw;
125 BitField<20, 14, s64> offset; 125 BitField<20, 14, u64> offset;
126 BitField<34, 5, u64> binding; 126 BitField<34, 5, u64> binding;
127 } const cbuf{insn}; 127 } const cbuf{insn};
128 128
129 if (cbuf.binding >= 18) { 129 if (cbuf.binding >= 18) {
130 throw NotImplementedException("Out of bounds constant buffer binding {}", cbuf.binding); 130 throw NotImplementedException("Out of bounds constant buffer binding {}", cbuf.binding);
131 } 131 }
132 if (cbuf.offset >= 0x10'000 || cbuf.offset < 0) { 132 if (cbuf.offset >= 0x10'000) {
133 throw NotImplementedException("Out of bounds constant buffer offset {}", cbuf.offset); 133 throw NotImplementedException("Out of bounds constant buffer offset {}", cbuf.offset);
134 } 134 }
135 const IR::Value binding{static_cast<u32>(cbuf.binding)}; 135 const IR::Value binding{static_cast<u32>(cbuf.binding)};