shader/shader_ir: Track usage in input attribute and of legacy varyings
This commit is contained in:
		| @@ -82,6 +82,10 @@ union Attribute { | ||||
|         Position = 7, | ||||
|         Attribute_0 = 8, | ||||
|         Attribute_31 = 39, | ||||
|         FrontColor = 40, | ||||
|         FrontSecondaryColor = 41, | ||||
|         BackColor = 42, | ||||
|         BackSecondaryColor = 43, | ||||
|         ClipDistances0123 = 44, | ||||
|         ClipDistances4567 = 45, | ||||
|         PointCoord = 46, | ||||
| @@ -89,6 +93,8 @@ union Attribute { | ||||
|         // shader, and a tuple of (TessCoord.x, TessCoord.y, TessCoord.z, ~) when inside a Tess Eval | ||||
|         // shader. | ||||
|         TessCoordInstanceIDVertexID = 47, | ||||
|         TexCoord_0 = 48, | ||||
|         TexCoord_7 = 55, | ||||
|         // This attribute contains a tuple of (Unk, Unk, Unk, gl_FrontFacing) when inside a fragment | ||||
|         // shader. It is unknown what the other values contain. | ||||
|         FrontFacing = 63, | ||||
|   | ||||
| @@ -96,6 +96,7 @@ Node ShaderIR::GetPredicate(bool immediate) { | ||||
| } | ||||
|  | ||||
| Node ShaderIR::GetInputAttribute(Attribute::Index index, u64 element, Node buffer) { | ||||
|     MarkAttributeUsage(index, element); | ||||
|     used_input_attributes.emplace(index); | ||||
|     return MakeNode<AbufNode>(index, static_cast<u32>(element), std::move(buffer)); | ||||
| } | ||||
| @@ -106,40 +107,7 @@ Node ShaderIR::GetPhysicalInputAttribute(Tegra::Shader::Register physical_addres | ||||
| } | ||||
|  | ||||
| Node ShaderIR::GetOutputAttribute(Attribute::Index index, u64 element, Node buffer) { | ||||
|     switch (index) { | ||||
|     case Attribute::Index::LayerViewportPointSize: | ||||
|         switch (element) { | ||||
|         case 0: | ||||
|             UNIMPLEMENTED(); | ||||
|             break; | ||||
|         case 1: | ||||
|             uses_layer = true; | ||||
|             break; | ||||
|         case 2: | ||||
|             uses_viewport_index = true; | ||||
|             break; | ||||
|         case 3: | ||||
|             uses_point_size = true; | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
|     case Attribute::Index::TessCoordInstanceIDVertexID: | ||||
|         switch (element) { | ||||
|         case 2: | ||||
|             uses_instance_id = true; | ||||
|             break; | ||||
|         case 3: | ||||
|             uses_vertex_id = true; | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
|     case Attribute::Index::ClipDistances0123: | ||||
|     case Attribute::Index::ClipDistances4567: { | ||||
|         const u64 clip_index = (index == Attribute::Index::ClipDistances4567 ? 4 : 0) + element; | ||||
|         used_clip_distances.at(clip_index) = true; | ||||
|         break; | ||||
|     } | ||||
|     } | ||||
|     MarkAttributeUsage(index, element); | ||||
|     used_output_attributes.insert(index); | ||||
|     return MakeNode<AbufNode>(index, static_cast<u32>(element), std::move(buffer)); | ||||
| } | ||||
| @@ -451,6 +419,54 @@ Node ShaderIR::BitfieldInsert(Node base, Node insert, u32 offset, u32 bits) { | ||||
|                      Immediate(bits)); | ||||
| } | ||||
|  | ||||
| void ShaderIR::MarkAttributeUsage(Attribute::Index index, u64 element) { | ||||
|     switch (index) { | ||||
|     case Attribute::Index::LayerViewportPointSize: | ||||
|         switch (element) { | ||||
|         case 0: | ||||
|             UNIMPLEMENTED(); | ||||
|             break; | ||||
|         case 1: | ||||
|             uses_layer = true; | ||||
|             break; | ||||
|         case 2: | ||||
|             uses_viewport_index = true; | ||||
|             break; | ||||
|         case 3: | ||||
|             uses_point_size = true; | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
|     case Attribute::Index::TessCoordInstanceIDVertexID: | ||||
|         switch (element) { | ||||
|         case 2: | ||||
|             uses_instance_id = true; | ||||
|             break; | ||||
|         case 3: | ||||
|             uses_vertex_id = true; | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
|     case Attribute::Index::ClipDistances0123: | ||||
|     case Attribute::Index::ClipDistances4567: { | ||||
|         const u64 clip_index = (index == Attribute::Index::ClipDistances4567 ? 4 : 0) + element; | ||||
|         used_clip_distances.at(clip_index) = true; | ||||
|         break; | ||||
|     } | ||||
|     case Attribute::Index::FrontColor: | ||||
|     case Attribute::Index::FrontSecondaryColor: | ||||
|     case Attribute::Index::BackColor: | ||||
|     case Attribute::Index::BackSecondaryColor: | ||||
|         uses_legacy_varyings = true; | ||||
|         break; | ||||
|     default: | ||||
|         if (index >= Attribute::Index::TexCoord_0 && index <= Attribute::Index::TexCoord_7) { | ||||
|             uses_legacy_varyings = true; | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| std::size_t ShaderIR::DeclareAmend(Node new_amend) { | ||||
|     const std::size_t id = amend_code.size(); | ||||
|     amend_code.push_back(new_amend); | ||||
|   | ||||
| @@ -137,6 +137,10 @@ public: | ||||
|         return uses_vertex_id; | ||||
|     } | ||||
|  | ||||
|     bool UsesLegacyVaryings() const { | ||||
|         return uses_legacy_varyings; | ||||
|     } | ||||
|  | ||||
|     bool UsesWarps() const { | ||||
|         return uses_warps; | ||||
|     } | ||||
| @@ -343,6 +347,9 @@ private: | ||||
|     /// Inserts a sequence of bits from a node | ||||
|     Node BitfieldInsert(Node base, Node insert, u32 offset, u32 bits); | ||||
|  | ||||
|     /// Marks the usage of a input or output attribute. | ||||
|     void MarkAttributeUsage(Tegra::Shader::Attribute::Index index, u64 element); | ||||
|  | ||||
|     void WriteTexInstructionFloat(NodeBlock& bb, Tegra::Shader::Instruction instr, | ||||
|                                   const Node4& components); | ||||
|  | ||||
| @@ -443,6 +450,7 @@ private: | ||||
|     bool uses_physical_attributes{}; // Shader uses AL2P or physical attribute read/writes | ||||
|     bool uses_instance_id{}; | ||||
|     bool uses_vertex_id{}; | ||||
|     bool uses_legacy_varyings{}; | ||||
|     bool uses_warps{}; | ||||
|     bool uses_indexed_samplers{}; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user