summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Nguyen Dac Nam2020-02-28 11:59:05 +0700
committerGravatar GitHub2020-02-28 11:59:05 +0700
commit1c385362f57a2c6fb977aff20258fcb2deaa5c94 (patch)
tree0dd554fa0604d65f0a7e19231870ca743826978c /src
parentMerge pull request #3430 from bunnei/split-presenter (diff)
downloadyuzu-1c385362f57a2c6fb977aff20258fcb2deaa5c94.tar.gz
yuzu-1c385362f57a2c6fb977aff20258fcb2deaa5c94.tar.xz
yuzu-1c385362f57a2c6fb977aff20258fcb2deaa5c94.zip
shader_decode: keep it search on all code
It fixed opcode LD, LDG on Pokemon Sword that can't find the constant buffer. Not sure if it helps any on visual.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/track.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/video_core/shader/track.cpp b/src/video_core/shader/track.cpp
index face8c943..a113a5868 100644
--- a/src/video_core/shader/track.cpp
+++ b/src/video_core/shader/track.cpp
@@ -159,11 +159,19 @@ std::tuple<Node, u32, u32> ShaderIR::TrackCbuf(Node tracked, const NodeBlock& co
159 } 159 }
160 // Reduce the cursor in one to avoid infinite loops when the instruction sets the same 160 // Reduce the cursor in one to avoid infinite loops when the instruction sets the same
161 // register that it uses as operand 161 // register that it uses as operand
162 const auto [source, new_cursor] = TrackRegister(gpr, code, cursor - 1); 162 s64 current_cursor = cursor;
163 if (!source) { 163 while (current_cursor > 0) {
164 return {}; 164 const auto [source, new_cursor] = TrackRegister(gpr, code, current_cursor - 1);
165 current_cursor = new_cursor;
166 if (!source) {
167 continue;
168 }
169 const auto [base_address, index, offset] = TrackCbuf(source, code, current_cursor);
170 if (base_address != nullptr) {
171 return {base_address, index, offset};
172 }
165 } 173 }
166 return TrackCbuf(source, code, new_cursor); 174 return {};
167 } 175 }
168 if (const auto operation = std::get_if<OperationNode>(&*tracked)) { 176 if (const auto operation = std::get_if<OperationNode>(&*tracked)) {
169 for (std::size_t i = operation->GetOperandsCount(); i > 0; --i) { 177 for (std::size_t i = operation->GetOperandsCount(); i > 0; --i) {