diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-12-30 13:54:53 -0400 |
|---|---|---|
| committer | FernandoS27 <fsahmkow27@gmail.com> | 2019-12-30 15:31:48 -0400 |
| commit | b3371ed09e6866e235141119f9eecc2bb962dc8d (patch) | |
| tree | 06619df9bd72cc0d73a3869b040b20804e2d3109 /src/video_core/renderer_opengl | |
| parent | f846e3d6d0e973485a53bb87b913059060dcfdbc (diff) | |
Shader_IR: add the ability to amend code in the shader ir.
This commit introduces a mechanism by which shader IR code can be
amended and extended. This useful for track algorithms where certain
information can derived from before the track such as indexes to array
samplers.
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index a311dbcfe..e1730821f 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -751,6 +751,11 @@ private: Expression Visit(const Node& node) { if (const auto operation = std::get_if<OperationNode>(&*node)) { + auto amend_index = operation->GetAmendIndex(); + if (amend_index) { + const Node& amend_node = ir.GetAmendNode(*amend_index); + Visit(amend_node).CheckVoid(); + } const auto operation_index = static_cast<std::size_t>(operation->GetCode()); if (operation_index >= operation_decompilers.size()) { UNREACHABLE_MSG("Out of bounds operation: {}", operation_index); @@ -872,6 +877,11 @@ private: } if (const auto conditional = std::get_if<ConditionalNode>(&*node)) { + auto amend_index = conditional->GetAmendIndex(); + if (amend_index) { + const Node& amend_node = ir.GetAmendNode(*amend_index); + Visit(amend_node).CheckVoid(); + } // It's invalid to call conditional on nested nodes, use an operation instead code.AddLine("if ({}) {{", Visit(conditional->GetCondition()).AsBool()); ++code.scope; @@ -884,6 +894,11 @@ private: } if (const auto comment = std::get_if<CommentNode>(&*node)) { + auto amend_index = comment->GetAmendIndex(); + if (amend_index) { + const Node& amend_node = ir.GetAmendNode(*amend_index); + Visit(amend_node).CheckVoid(); + } code.AddLine("// " + comment->GetText()); return {}; } |
