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.
This commit is contained in:
ReinUsesLisp 2019-01-30 02:20:05 -03:00
parent 42b75e8be8
commit 0d1d755086

View File

@ -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;
} }