summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-01-30 02:20:05 -0300
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-02-03 17:21:20 -0300
commit0d1d755086f95fb20975fe2a4fd6c9c9de43789b (patch)
tree7d60ff631153b866580d73f7dfc4c495694c319c /src/video_core
parent42b75e8be8e468d90fa677e0c4026b32cf8c4636 (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.cpp11
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;
}