diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-07 01:01:28 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-07 01:03:33 +0200 |
commit | 769a50661a90f06aa660419d869e266abcddf9f3 (patch) | |
tree | a2580211624e0c198b732b94b6c5379ccaaefd22 | |
parent | shader: Move Node declarations out of the shader IR header (diff) | |
download | yuzu-769a50661a90f06aa660419d869e266abcddf9f3.tar yuzu-769a50661a90f06aa660419d869e266abcddf9f3.tar.gz yuzu-769a50661a90f06aa660419d869e266abcddf9f3.tar.bz2 yuzu-769a50661a90f06aa660419d869e266abcddf9f3.tar.lz yuzu-769a50661a90f06aa660419d869e266abcddf9f3.tar.xz yuzu-769a50661a90f06aa660419d869e266abcddf9f3.tar.zst yuzu-769a50661a90f06aa660419d869e266abcddf9f3.zip |
-rw-r--r-- | src/video_core/shader/node.h | 104 |
1 files changed, 54 insertions, 50 deletions
diff --git a/src/video_core/shader/node.h b/src/video_core/shader/node.h index 1e7a5f699..c002f90f9 100644 --- a/src/video_core/shader/node.h +++ b/src/video_core/shader/node.h @@ -18,25 +18,6 @@ namespace VideoCommon::Shader { -class OperationNode; -class ConditionalNode; -class GprNode; -class ImmediateNode; -class InternalFlagNode; -class PredicateNode; -class AbufNode; ///< Attribute buffer -class CbufNode; ///< Constant buffer -class LmemNode; ///< Local memory -class GmemNode; ///< Global memory -class CommentNode; - -using NodeData = - std::variant<OperationNode, ConditionalNode, GprNode, ImmediateNode, InternalFlagNode, - PredicateNode, AbufNode, CbufNode, LmemNode, GmemNode, CommentNode>; -using Node = std::shared_ptr<NodeData>; -using Node4 = std::array<Node, 4>; -using NodeBlock = std::vector<Node>; - enum class OperationCode { Assign, /// (float& dest, float src) -> void @@ -193,21 +174,40 @@ enum class InternalFlag { Amount = 4, }; +class OperationNode; +class ConditionalNode; +class GprNode; +class ImmediateNode; +class InternalFlagNode; +class PredicateNode; +class AbufNode; +class CbufNode; +class LmemNode; +class GmemNode; +class CommentNode; + +using NodeData = + std::variant<OperationNode, ConditionalNode, GprNode, ImmediateNode, InternalFlagNode, + PredicateNode, AbufNode, CbufNode, LmemNode, GmemNode, CommentNode>; +using Node = std::shared_ptr<NodeData>; +using Node4 = std::array<Node, 4>; +using NodeBlock = std::vector<Node>; + class Sampler { public: - // Use this constructor for bounded Samplers + /// This constructor is for bound samplers explicit Sampler(std::size_t offset, std::size_t index, Tegra::Shader::TextureType type, bool is_array, bool is_shadow) : offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow}, is_bindless{false} {} - // Use this constructor for bindless Samplers + /// This constructor is for bindless samplers explicit Sampler(u32 cbuf_index, u32 cbuf_offset, std::size_t index, Tegra::Shader::TextureType type, bool is_array, bool is_shadow) : offset{(static_cast<u64>(cbuf_index) << 32) | cbuf_offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow}, is_bindless{true} {} - // Use this only for serialization/deserialization + /// This constructor is for serialization/deserialization explicit Sampler(std::size_t offset, std::size_t index, Tegra::Shader::TextureType type, bool is_array, bool is_shadow, bool is_bindless) : offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow}, @@ -267,21 +267,24 @@ struct GlobalMemoryBase { } }; +/// Parameters describing an arithmetic operation struct MetaArithmetic { - bool precise{}; + bool precise{}; ///< Whether the operation can be constraint or not }; +/// Parameters describing a texture sampler struct MetaTexture { const Sampler& sampler; - Node array{}; - Node depth_compare{}; + Node array; + Node depth_compare; std::vector<Node> aoffi; - Node bias{}; - Node lod{}; + Node bias; + Node lod; Node component{}; u32 element{}; }; +/// Parameters that modify an operation but are not part of any particular operand using Meta = std::variant<MetaArithmetic, MetaTexture, Tegra::Shader::HalfType>; /// Holds any kind of operation that can be done in the IR @@ -328,9 +331,9 @@ private: class ConditionalNode final { public: explicit ConditionalNode(Node condition, std::vector<Node>&& code) - : condition{condition}, code{std::move(code)} {} + : condition{std::move(condition)}, code{std::move(code)} {} - Node GetCondition() const { + const Node& GetCondition() const { return condition; } @@ -339,7 +342,7 @@ public: } private: - const Node condition; ///< Condition to be satisfied + Node condition; ///< Condition to be satisfied std::vector<Node> code; ///< Code to execute }; @@ -353,7 +356,7 @@ public: } private: - const Tegra::Shader::Register index; + Tegra::Shader::Register index{}; }; /// A 32-bits value that represents an immediate value @@ -366,7 +369,7 @@ public: } private: - const u32 value; + u32 value{}; }; /// One of Maxwell's internal flags @@ -379,7 +382,7 @@ public: } private: - const InternalFlag flag; + InternalFlag flag{}; }; /// A predicate register, it can be negated without additional nodes @@ -397,8 +400,8 @@ public: } private: - const Tegra::Shader::Pred index; - const bool negated; + Tegra::Shader::Pred index{}; + bool negated{}; }; /// Attribute buffer memory (known as attributes or varyings in GLSL terms) @@ -410,7 +413,7 @@ public: // Initialize for physical attributes (index is a variable value). explicit AbufNode(Node physical_address, Node buffer = {}) - : physical_address{physical_address}, buffer{std::move(buffer)} {} + : physical_address{std::move(physical_address)}, buffer{std::move(buffer)} {} Tegra::Shader::Attribute::Index GetIndex() const { return index; @@ -420,7 +423,7 @@ public: return element; } - Node GetBuffer() const { + const Node& GetBuffer() const { return buffer; } @@ -442,45 +445,46 @@ private: /// Constant buffer node, usually mapped to uniform buffers in GLSL class CbufNode final { public: - explicit CbufNode(u32 index, Node offset) : index{index}, offset{offset} {} + explicit CbufNode(u32 index, Node offset) : index{index}, offset{std::move(offset)} {} u32 GetIndex() const { return index; } - Node GetOffset() const { + const Node& GetOffset() const { return offset; } private: - const u32 index; - const Node offset; + u32 index{}; + Node offset; }; /// Local memory node class LmemNode final { public: - explicit LmemNode(Node address) : address{address} {} + explicit LmemNode(Node address) : address{std::move(address)} {} - Node GetAddress() const { + const Node& GetAddress() const { return address; } private: - const Node address; + Node address; }; /// Global memory node class GmemNode final { public: explicit GmemNode(Node real_address, Node base_address, const GlobalMemoryBase& descriptor) - : real_address{real_address}, base_address{base_address}, descriptor{descriptor} {} + : real_address{std::move(real_address)}, base_address{std::move(base_address)}, + descriptor{descriptor} {} - Node GetRealAddress() const { + const Node& GetRealAddress() const { return real_address; } - Node GetBaseAddress() const { + const Node& GetBaseAddress() const { return base_address; } @@ -489,9 +493,9 @@ public: } private: - const Node real_address; - const Node base_address; - const GlobalMemoryBase descriptor; + Node real_address; + Node base_address; + GlobalMemoryBase descriptor; }; /// Commentary, can be dropped |