summaryrefslogtreecommitdiffstats
path: root/src/video_core
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-01-04 19:40:57 +0100
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-01-04 19:40:57 +0100
commit3dd6b55851978440f39487a6ad06b30b792b3b36 (patch)
treed5019053dc20d420181443ff90207aab2ff28938 /src/video_core
parentShader_IR: add the ability to amend code in the shader ir. (diff)
downloadyuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.tar
yuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.tar.gz
yuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.tar.bz2
yuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.tar.lz
yuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.tar.xz
yuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.tar.zst
yuzu-3dd6b55851978440f39487a6ad06b30b792b3b36.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp17
-rw-r--r--src/video_core/renderer_vulkan/vk_shader_decompiler.cpp18
-rw-r--r--src/video_core/shader/node.h10
-rw-r--r--src/video_core/shader/shader_ir.cpp4
-rw-r--r--src/video_core/shader/shader_ir.h8
5 files changed, 19 insertions, 38 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index e1730821f..f9f7a97b5 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -751,10 +751,8 @@ 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();
+ if (const auto amend_index = operation->GetAmendIndex()) {
+ Visit(ir.GetAmendNode(*amend_index)).CheckVoid();
}
const auto operation_index = static_cast<std::size_t>(operation->GetCode());
if (operation_index >= operation_decompilers.size()) {
@@ -877,10 +875,8 @@ 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();
+ if (const auto amend_index = conditional->GetAmendIndex()) {
+ Visit(ir.GetAmendNode(*amend_index)).CheckVoid();
}
// It's invalid to call conditional on nested nodes, use an operation instead
code.AddLine("if ({}) {{", Visit(conditional->GetCondition()).AsBool());
@@ -894,11 +890,6 @@ 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 {};
}
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 50feeb003..8fe852ce8 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -954,10 +954,8 @@ 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;
+ if (const auto amend_index = operation->GetAmendIndex()) {
+ [[maybe_unused]] const Type type = Visit(ir.GetAmendNode(*amend_index)).type;
ASSERT(type == Type::Void);
}
const auto operation_index = static_cast<std::size_t>(operation->GetCode());
@@ -1148,10 +1146,8 @@ 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;
+ if (const auto amend_index = conditional->GetAmendIndex()) {
+ [[maybe_unused]] const Type type = Visit(ir.GetAmendNode(*amend_index)).type;
ASSERT(type == Type::Void);
}
// It's invalid to call conditional on nested nodes, use an operation instead
@@ -1176,12 +1172,6 @@ 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 {};
}
diff --git a/src/video_core/shader/node.h b/src/video_core/shader/node.h
index 42e82ab74..4e155542a 100644
--- a/src/video_core/shader/node.h
+++ b/src/video_core/shader/node.h
@@ -394,14 +394,14 @@ using Meta =
class AmendNode {
public:
- std::optional<u32> GetAmendIndex() const {
+ std::optional<std::size_t> GetAmendIndex() const {
if (amend_index == amend_null_index) {
return std::nullopt;
}
return {amend_index};
}
- void SetAmendIndex(u32 index) {
+ void SetAmendIndex(std::size_t index) {
amend_index = index;
}
@@ -410,8 +410,8 @@ public:
}
private:
- static constexpr u32 amend_null_index = 0xFFFFFFFF;
- u32 amend_index{amend_null_index};
+ static constexpr std::size_t amend_null_index = 0xFFFFFFFFFFFFFFFFULL;
+ std::size_t amend_index{amend_null_index};
};
/// Holds any kind of operation that can be done in the IR
@@ -652,7 +652,7 @@ private:
};
/// Commentary, can be dropped
-class CommentNode final : public AmendNode {
+class CommentNode final {
public:
explicit CommentNode(std::string text) : text{std::move(text)} {}
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp
index 49678767c..31eecb3f4 100644
--- a/src/video_core/shader/shader_ir.cpp
+++ b/src/video_core/shader/shader_ir.cpp
@@ -446,8 +446,8 @@ Node ShaderIR::BitfieldInsert(Node base, Node insert, u32 offset, u32 bits) {
Immediate(bits));
}
-u32 ShaderIR::DeclareAmend(Node new_amend) {
- const u32 id = static_cast<u32>(amend_code.size());
+std::size_t ShaderIR::DeclareAmend(Node new_amend) {
+ const std::size_t id = amend_code.size();
amend_code.push_back(new_amend);
return id;
}
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h
index 52f130e1b..aacd0a0da 100644
--- a/src/video_core/shader/shader_ir.h
+++ b/src/video_core/shader/shader_ir.h
@@ -176,7 +176,7 @@ public:
/// Returns a condition code evaluated from internal flags
Node GetConditionCode(Tegra::Shader::ConditionCode cc) const;
- const Node& GetAmendNode(u32 index) const {
+ const Node& GetAmendNode(std::size_t index) const {
return amend_code[index];
}
@@ -396,8 +396,8 @@ private:
Tegra::Shader::Instruction instr,
bool is_write);
- /// Amends
- u32 DeclareAmend(Node new_amend);
+ /// Register new amending code and obtain the reference id.
+ std::size_t DeclareAmend(Node new_amend);
const ProgramCode& program_code;
const u32 main_offset;
@@ -413,7 +413,7 @@ private:
std::map<u32, NodeBlock> basic_blocks;
NodeBlock global_code;
ASTManager program_manager{true, true};
- NodeBlock amend_code;
+ std::vector<Node> amend_code;
std::set<u32> used_registers;
std::set<Tegra::Shader::Pred> used_predicates;