mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-27 22:22:46 -05:00 
			
		
		
		
	shader/node: Minor changes
Reflect std::shared_ptr nature of Node on initializers and remove constant members in nodes. Add some commentaries.
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp