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.
This commit is contained in:
parent
f846e3d6d0
commit
b3371ed09e
5 changed files with 72 additions and 3 deletions
|
@ -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 {};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue