diff options
author | Nguyen Dac Nam <nam.kazt.91@gmail.com> | 2020-02-28 11:59:05 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-28 11:59:05 +0700 |
commit | 1c385362f57a2c6fb977aff20258fcb2deaa5c94 (patch) | |
tree | 0dd554fa0604d65f0a7e19231870ca743826978c /src | |
parent | 969357af1a26e74eaa5b0cec677d929bca94dc57 (diff) |
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.cpp | 16 |
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 } // Reduce the cursor in one to avoid infinite loops when the instruction sets the same // register that it uses as operand - const auto [source, new_cursor] = TrackRegister(gpr, code, cursor - 1); - if (!source) { - return {}; + s64 current_cursor = cursor; + while (current_cursor > 0) { + const auto [source, new_cursor] = TrackRegister(gpr, code, current_cursor - 1); + current_cursor = new_cursor; + if (!source) { + continue; + } + const auto [base_address, index, offset] = TrackCbuf(source, code, current_cursor); + if (base_address != nullptr) { + return {base_address, index, offset}; + } } - return TrackCbuf(source, code, new_cursor); + return {}; } if (const auto operation = std::get_if<OperationNode>(&*tracked)) { for (std::size_t i = operation->GetOperandsCount(); i > 0; --i) { |