mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	gl_shader_decompiler: Improve handling of unknown input/output attributes.
This commit is contained in:
		
							parent
							
								
									d64303d185
								
							
						
					
					
						commit
						0b668d5ff3
					
				| @ -74,12 +74,11 @@ union Attribute { | |||||||
|     enum class Index : u64 { |     enum class Index : u64 { | ||||||
|         Position = 7, |         Position = 7, | ||||||
|         Attribute_0 = 8, |         Attribute_0 = 8, | ||||||
|  |         Attribute_31 = 39, | ||||||
|         // This attribute contains a tuple of (~, ~, InstanceId, VertexId) when inside a vertex
 |         // This attribute contains a tuple of (~, ~, InstanceId, VertexId) when inside a vertex
 | ||||||
|         // shader, and a tuple of (TessCoord.x, TessCoord.y, TessCoord.z, ~) when inside a Tess Eval
 |         // shader, and a tuple of (TessCoord.x, TessCoord.y, TessCoord.z, ~) when inside a Tess Eval
 | ||||||
|         // shader.
 |         // shader.
 | ||||||
|         TessCoordInstanceIDVertexID = 47, |         TessCoordInstanceIDVertexID = 47, | ||||||
|         // TODO(bunnei): Figure out what this is used for. Super Mario Odyssey uses this.
 |  | ||||||
|         Unknown_63 = 63, |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     union { |     union { | ||||||
|  | |||||||
| @ -349,7 +349,12 @@ public: | |||||||
|     void SetOutputAttributeToRegister(Attribute::Index attribute, u64 elem, const Register& reg) { |     void SetOutputAttributeToRegister(Attribute::Index attribute, u64 elem, const Register& reg) { | ||||||
|         std::string dest = GetOutputAttribute(attribute) + GetSwizzle(elem); |         std::string dest = GetOutputAttribute(attribute) + GetSwizzle(elem); | ||||||
|         std::string src = GetRegisterAsFloat(reg); |         std::string src = GetRegisterAsFloat(reg); | ||||||
|         shader.AddLine(dest + " = " + src + ';'); | 
 | ||||||
|  |         if (!dest.empty()) { | ||||||
|  |             // Can happen with unknown/unimplemented output attributes, in which case we ignore the
 | ||||||
|  |             // instruction for now.
 | ||||||
|  |             shader.AddLine(dest + " = " + src + ';'); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Generates code representing a uniform (C buffer) register, interpreted as the input type.
 |     /// Generates code representing a uniform (C buffer) register, interpreted as the input type.
 | ||||||
| @ -525,20 +530,16 @@ private: | |||||||
|             // shader.
 |             // shader.
 | ||||||
|             ASSERT(stage == Maxwell3D::Regs::ShaderStage::Vertex); |             ASSERT(stage == Maxwell3D::Regs::ShaderStage::Vertex); | ||||||
|             return "vec4(0, 0, uintBitsToFloat(gl_InstanceID), uintBitsToFloat(gl_VertexID))"; |             return "vec4(0, 0, uintBitsToFloat(gl_InstanceID), uintBitsToFloat(gl_VertexID))"; | ||||||
|         case Attribute::Index::Unknown_63: |  | ||||||
|             // TODO(bunnei): Figure out what this is used for. Super Mario Odyssey uses this.
 |  | ||||||
|             LOG_CRITICAL(HW_GPU, "Unhandled input attribute Unknown_63"); |  | ||||||
|             UNREACHABLE(); |  | ||||||
|             break; |  | ||||||
|         default: |         default: | ||||||
|             const u32 index{static_cast<u32>(attribute) - |             const u32 index{static_cast<u32>(attribute) - | ||||||
|                             static_cast<u32>(Attribute::Index::Attribute_0)}; |                             static_cast<u32>(Attribute::Index::Attribute_0)}; | ||||||
|             if (attribute >= Attribute::Index::Attribute_0) { |             if (attribute >= Attribute::Index::Attribute_0 && | ||||||
|  |                 attribute <= Attribute::Index::Attribute_31) { | ||||||
|                 declr_input_attribute.insert(attribute); |                 declr_input_attribute.insert(attribute); | ||||||
|                 return "input_attribute_" + std::to_string(index); |                 return "input_attribute_" + std::to_string(index); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             LOG_CRITICAL(HW_GPU, "Unhandled input attribute: {}", index); |             LOG_CRITICAL(HW_GPU, "Unhandled input attribute: {}", static_cast<u32>(attribute)); | ||||||
|             UNREACHABLE(); |             UNREACHABLE(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -560,6 +561,7 @@ private: | |||||||
| 
 | 
 | ||||||
|             LOG_CRITICAL(HW_GPU, "Unhandled output attribute: {}", index); |             LOG_CRITICAL(HW_GPU, "Unhandled output attribute: {}", index); | ||||||
|             UNREACHABLE(); |             UNREACHABLE(); | ||||||
|  |             return {}; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei