diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-01-30 02:20:05 -0300 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-02-03 17:21:20 -0300 |
commit | 0d1d755086f95fb20975fe2a4fd6c9c9de43789b (patch) | |
tree | 7d60ff631153b866580d73f7dfc4c495694c319c /src/video_core | |
parent | 42b75e8be8e468d90fa677e0c4026b32cf8c4636 (diff) |
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.
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/shader/track.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/video_core/shader/track.cpp b/src/video_core/shader/track.cpp index 343c129c7..be4635342 100644 --- a/src/video_core/shader/track.cpp +++ b/src/video_core/shader/track.cpp @@ -19,6 +19,13 @@ std::pair<Node, s64> FindOperation(const NodeBlock& code, s64 cursor, if (operation->GetCode() == operation_code) 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 {}; } @@ -50,6 +57,10 @@ Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) { } 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; } |