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:
Fernando Sahmkow 2019-12-30 13:54:53 -04:00 committed by FernandoS27
parent f846e3d6d0
commit b3371ed09e
5 changed files with 72 additions and 3 deletions

View file

@ -954,6 +954,12 @@ 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);
[[maybe_unused]] const Type type = Visit(amend_node).type;
ASSERT(type == Type::Void);
}
const auto operation_index = static_cast<std::size_t>(operation->GetCode());
const auto decompiler = operation_decompilers[operation_index];
if (decompiler == nullptr) {
@ -1142,6 +1148,12 @@ 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);
[[maybe_unused]] const Type type = Visit(amend_node).type;
ASSERT(type == Type::Void);
}
// It's invalid to call conditional on nested nodes, use an operation instead
const Id true_label = OpLabel();
const Id skip_label = OpLabel();
@ -1164,6 +1176,12 @@ 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);
[[maybe_unused]] const Type type = Visit(amend_node).type;
ASSERT(type == Type::Void);
}
Name(OpUndef(t_void), comment->GetText());
return {};
}