From 42b75e8be8e468d90fa677e0c4026b32cf8c4636 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Wed, 30 Jan 2019 02:09:40 -0300 Subject: shader_ir: Rename BasicBlock to NodeBlock It's not always used as a basic block. Rename it for consistency. --- src/video_core/shader/track.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/video_core/shader/track.cpp') diff --git a/src/video_core/shader/track.cpp b/src/video_core/shader/track.cpp index d6d29ee9f..343c129c7 100644 --- a/src/video_core/shader/track.cpp +++ b/src/video_core/shader/track.cpp @@ -11,7 +11,7 @@ namespace VideoCommon::Shader { namespace { -std::pair FindOperation(const BasicBlock& code, s64 cursor, +std::pair FindOperation(const NodeBlock& code, s64 cursor, OperationCode operation_code) { for (; cursor >= 0; --cursor) { const Node node = code[cursor]; @@ -24,7 +24,7 @@ std::pair FindOperation(const BasicBlock& code, s64 cursor, } } // namespace -Node ShaderIR::TrackCbuf(Node tracked, const BasicBlock& code, s64 cursor) { +Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) { if (const auto cbuf = std::get_if(tracked)) { // Cbuf found, but it has to be immediate return std::holds_alternative(*cbuf->GetOffset()) ? tracked : nullptr; @@ -53,7 +53,7 @@ Node ShaderIR::TrackCbuf(Node tracked, const BasicBlock& code, s64 cursor) { return nullptr; } -std::pair ShaderIR::TrackRegister(const GprNode* tracked, const BasicBlock& code, +std::pair ShaderIR::TrackRegister(const GprNode* tracked, const NodeBlock& code, s64 cursor) { for (; cursor >= 0; --cursor) { const auto [found_node, new_cursor] = FindOperation(code, cursor, OperationCode::Assign); -- cgit v1.2.3 From 0d1d755086f95fb20975fe2a4fd6c9c9de43789b Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Wed, 30 Jan 2019 02:20:05 -0300 Subject: 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. --- src/video_core/shader/track.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/video_core/shader/track.cpp') 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 FindOperation(const NodeBlock& code, s64 cursor, if (operation->GetCode() == operation_code) return {node, cursor}; } + if (const auto conditional = std::get_if(node)) { + const auto& code = conditional->GetCode(); + const auto [found, internal_cursor] = + FindOperation(code, static_cast(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(tracked)) { + const auto& code = conditional->GetCode(); + return TrackCbuf(tracked, code, static_cast(code.size())); + } return nullptr; } -- cgit v1.2.3