mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01: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:
		
							parent
							
								
									e1b3be7ced
								
							
						
					
					
						commit
						769a50661a
					
				| @ -18,25 +18,6 @@ | |||||||
| 
 | 
 | ||||||
| namespace VideoCommon::Shader { | 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 { | enum class OperationCode { | ||||||
|     Assign, /// (float& dest, float src) -> void
 |     Assign, /// (float& dest, float src) -> void
 | ||||||
| 
 | 
 | ||||||
| @ -193,21 +174,40 @@ enum class InternalFlag { | |||||||
|     Amount = 4, |     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 { | class Sampler { | ||||||
| public: | 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, |     explicit Sampler(std::size_t offset, std::size_t index, Tegra::Shader::TextureType type, | ||||||
|                      bool is_array, bool is_shadow) |                      bool is_array, bool is_shadow) | ||||||
|         : offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow}, |         : offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow}, | ||||||
|           is_bindless{false} {} |           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, |     explicit Sampler(u32 cbuf_index, u32 cbuf_offset, std::size_t index, | ||||||
|                      Tegra::Shader::TextureType type, bool is_array, bool is_shadow) |                      Tegra::Shader::TextureType type, bool is_array, bool is_shadow) | ||||||
|         : offset{(static_cast<u64>(cbuf_index) << 32) | cbuf_offset}, index{index}, type{type}, |         : offset{(static_cast<u64>(cbuf_index) << 32) | cbuf_offset}, index{index}, type{type}, | ||||||
|           is_array{is_array}, is_shadow{is_shadow}, is_bindless{true} {} |           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, |     explicit Sampler(std::size_t offset, std::size_t index, Tegra::Shader::TextureType type, | ||||||
|                      bool is_array, bool is_shadow, bool is_bindless) |                      bool is_array, bool is_shadow, bool is_bindless) | ||||||
|         : offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow}, |         : 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 { | struct MetaArithmetic { | ||||||
|     bool precise{}; |     bool precise{}; ///< Whether the operation can be constraint or not
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /// Parameters describing a texture sampler
 | ||||||
| struct MetaTexture { | struct MetaTexture { | ||||||
|     const Sampler& sampler; |     const Sampler& sampler; | ||||||
|     Node array{}; |     Node array; | ||||||
|     Node depth_compare{}; |     Node depth_compare; | ||||||
|     std::vector<Node> aoffi; |     std::vector<Node> aoffi; | ||||||
|     Node bias{}; |     Node bias; | ||||||
|     Node lod{}; |     Node lod; | ||||||
|     Node component{}; |     Node component{}; | ||||||
|     u32 element{}; |     u32 element{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /// Parameters that modify an operation but are not part of any particular operand
 | ||||||
| using Meta = std::variant<MetaArithmetic, MetaTexture, Tegra::Shader::HalfType>; | using Meta = std::variant<MetaArithmetic, MetaTexture, Tegra::Shader::HalfType>; | ||||||
| 
 | 
 | ||||||
| /// Holds any kind of operation that can be done in the IR
 | /// Holds any kind of operation that can be done in the IR
 | ||||||
| @ -328,9 +331,9 @@ private: | |||||||
| class ConditionalNode final { | class ConditionalNode final { | ||||||
| public: | public: | ||||||
|     explicit ConditionalNode(Node condition, std::vector<Node>&& code) |     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; |         return condition; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -339,7 +342,7 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const Node condition;   ///< Condition to be satisfied
 |     Node condition;         ///< Condition to be satisfied
 | ||||||
|     std::vector<Node> code; ///< Code to execute
 |     std::vector<Node> code; ///< Code to execute
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -353,7 +356,7 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const Tegra::Shader::Register index; |     Tegra::Shader::Register index{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// A 32-bits value that represents an immediate value
 | /// A 32-bits value that represents an immediate value
 | ||||||
| @ -366,7 +369,7 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const u32 value; |     u32 value{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// One of Maxwell's internal flags
 | /// One of Maxwell's internal flags
 | ||||||
| @ -379,7 +382,7 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const InternalFlag flag; |     InternalFlag flag{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// A predicate register, it can be negated without additional nodes
 | /// A predicate register, it can be negated without additional nodes
 | ||||||
| @ -397,8 +400,8 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const Tegra::Shader::Pred index; |     Tegra::Shader::Pred index{}; | ||||||
|     const bool negated; |     bool negated{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Attribute buffer memory (known as attributes or varyings in GLSL terms)
 | /// 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).
 |     // Initialize for physical attributes (index is a variable value).
 | ||||||
|     explicit AbufNode(Node physical_address, Node buffer = {}) |     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 { |     Tegra::Shader::Attribute::Index GetIndex() const { | ||||||
|         return index; |         return index; | ||||||
| @ -420,7 +423,7 @@ public: | |||||||
|         return element; |         return element; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Node GetBuffer() const { |     const Node& GetBuffer() const { | ||||||
|         return buffer; |         return buffer; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -442,45 +445,46 @@ private: | |||||||
| /// Constant buffer node, usually mapped to uniform buffers in GLSL
 | /// Constant buffer node, usually mapped to uniform buffers in GLSL
 | ||||||
| class CbufNode final { | class CbufNode final { | ||||||
| public: | 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 { |     u32 GetIndex() const { | ||||||
|         return index; |         return index; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Node GetOffset() const { |     const Node& GetOffset() const { | ||||||
|         return offset; |         return offset; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const u32 index; |     u32 index{}; | ||||||
|     const Node offset; |     Node offset; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Local memory node
 | /// Local memory node
 | ||||||
| class LmemNode final { | class LmemNode final { | ||||||
| public: | public: | ||||||
|     explicit LmemNode(Node address) : address{address} {} |     explicit LmemNode(Node address) : address{std::move(address)} {} | ||||||
| 
 | 
 | ||||||
|     Node GetAddress() const { |     const Node& GetAddress() const { | ||||||
|         return address; |         return address; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const Node address; |     Node address; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Global memory node
 | /// Global memory node
 | ||||||
| class GmemNode final { | class GmemNode final { | ||||||
| public: | public: | ||||||
|     explicit GmemNode(Node real_address, Node base_address, const GlobalMemoryBase& descriptor) |     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; |         return real_address; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Node GetBaseAddress() const { |     const Node& GetBaseAddress() const { | ||||||
|         return base_address; |         return base_address; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -489,9 +493,9 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     const Node real_address; |     Node real_address; | ||||||
|     const Node base_address; |     Node base_address; | ||||||
|     const GlobalMemoryBase descriptor; |     GlobalMemoryBase descriptor; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Commentary, can be dropped
 | /// Commentary, can be dropped
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user