shader/track: Search inside of conditional nodes

Some games search conditionally use global memory instructions. This
allows the heuristic to search inside conditional nodes for the source
constant buffer.
master
ReinUsesLisp 2019-01-30 02:20:05 +07:00
parent 42b75e8be8
commit 0d1d755086
1 changed files with 11 additions and 0 deletions

@ -19,6 +19,13 @@ std::pair<Node, s64> FindOperation(const NodeBlock& code, s64 cursor,
if (operation->GetCode() == operation_code) if (operation->GetCode() == operation_code)
return {node, cursor}; return {node, cursor};
} }
if (const auto conditional = std::get_if<ConditionalNode>(node)) {
const auto& code = conditional->GetCode();
const auto [found, internal_cursor] =
FindOperation(code, static_cast<s64>(code.size() - 1), operation_code);
if (found)
return {found, cursor};
}
} }
return {}; return {};
} }
@ -50,6 +57,10 @@ Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) {
} }
return nullptr; return nullptr;
} }
if (const auto conditional = std::get_if<ConditionalNode>(tracked)) {
const auto& code = conditional->GetCode();
return TrackCbuf(tracked, code, static_cast<s64>(code.size()));
}
return nullptr; return nullptr;
} }