1
0
Fork 0
forked from suyu/suyu

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.
This commit is contained in:
Nguyen Dac Nam 2020-02-28 11:59:05 +07:00 committed by GitHub
parent 969357af1a
commit 1c385362f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 // Reduce the cursor in one to avoid infinite loops when the instruction sets the same
// register that it uses as operand // register that it uses as operand
const auto [source, new_cursor] = TrackRegister(gpr, code, cursor - 1); 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) { if (!source) {
return {}; continue;
} }
return TrackCbuf(source, code, new_cursor); const auto [base_address, index, offset] = TrackCbuf(source, code, current_cursor);
if (base_address != nullptr) {
return {base_address, index, offset};
}
}
return {};
} }
if (const auto operation = std::get_if<OperationNode>(&*tracked)) { if (const auto operation = std::get_if<OperationNode>(&*tracked)) {
for (std::size_t i = operation->GetOperandsCount(); i > 0; --i) { for (std::size_t i = operation->GetOperandsCount(); i > 0; --i) {