mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-30 22:36:46 +08:00 
			
		
		
		
	shader: Implement texture buffers
This commit is contained in:
		
							parent
							
								
									d267948a73
								
							
						
					
					
						commit
						4e81fc8296
					
				| @ -1231,6 +1231,20 @@ union Instruction { | ||||
|         } | ||||
|     } texs; | ||||
| 
 | ||||
|     union { | ||||
|         BitField<28, 1, u64> is_array; | ||||
|         BitField<29, 2, TextureType> texture_type; | ||||
|         BitField<35, 1, u64> aoffi; | ||||
|         BitField<49, 1, u64> nodep_flag; | ||||
|         BitField<50, 1, u64> ms; // Multisample?
 | ||||
|         BitField<54, 1, u64> cl; | ||||
|         BitField<55, 1, u64> process_mode; | ||||
| 
 | ||||
|         TextureProcessMode GetTextureProcessMode() const { | ||||
|             return process_mode == 0 ? TextureProcessMode::LZ : TextureProcessMode::LL; | ||||
|         } | ||||
|     } tld; | ||||
| 
 | ||||
|     union { | ||||
|         BitField<49, 1, u64> nodep_flag; | ||||
|         BitField<53, 4, u64> texture_info; | ||||
| @ -1408,6 +1422,7 @@ public: | ||||
|         TXQ,    // Texture Query
 | ||||
|         TXQ_B,  // Texture Query Bindless
 | ||||
|         TEXS,   // Texture Fetch with scalar/non-vec4 source/destinations
 | ||||
|         TLD,    // Texture Load
 | ||||
|         TLDS,   // Texture Load with scalar/non-vec4 source/destinations
 | ||||
|         TLD4,   // Texture Load 4
 | ||||
|         TLD4S,  // Texture Load 4 with scalar / non - vec4 source / destinations
 | ||||
| @ -1682,6 +1697,7 @@ private: | ||||
|             INST("1101111101001---", Id::TXQ, Type::Texture, "TXQ"), | ||||
|             INST("1101111101010---", Id::TXQ_B, Type::Texture, "TXQ_B"), | ||||
|             INST("1101-00---------", Id::TEXS, Type::Texture, "TEXS"), | ||||
|             INST("11011100--11----", Id::TLD, Type::Texture, "TLD"), | ||||
|             INST("1101101---------", Id::TLDS, Type::Texture, "TLDS"), | ||||
|             INST("110010----111---", Id::TLD4, Type::Texture, "TLD4"), | ||||
|             INST("1101111100------", Id::TLD4S, Type::Texture, "TLD4S"), | ||||
|  | ||||
| @ -245,6 +245,18 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|     case OpCode::Id::TLD: { | ||||
|         UNIMPLEMENTED_IF_MSG(instr.tld.aoffi, "AOFFI is not implemented"); | ||||
|         UNIMPLEMENTED_IF_MSG(instr.tld.ms, "MS is not implemented"); | ||||
|         UNIMPLEMENTED_IF_MSG(instr.tld.cl, "CL is not implemented"); | ||||
| 
 | ||||
|         if (instr.tld.nodep_flag) { | ||||
|             LOG_WARNING(HW_GPU, "TLD.NODEP implementation is incomplete"); | ||||
|         } | ||||
| 
 | ||||
|         WriteTexInstructionFloat(bb, instr, GetTldCode(instr)); | ||||
|         break; | ||||
|     } | ||||
|     case OpCode::Id::TLDS: { | ||||
|         const Tegra::Shader::TextureType texture_type{instr.tlds.GetTextureType()}; | ||||
|         const bool is_array{instr.tlds.IsArrayTexture()}; | ||||
| @ -575,6 +587,38 @@ Node4 ShaderIR::GetTld4Code(Instruction instr, TextureType texture_type, bool de | ||||
|     return values; | ||||
| } | ||||
| 
 | ||||
| Node4 ShaderIR::GetTldCode(Tegra::Shader::Instruction instr) { | ||||
|     const auto texture_type{instr.tld.texture_type}; | ||||
|     const bool is_array{instr.tld.is_array}; | ||||
|     const bool lod_enabled{instr.tld.GetTextureProcessMode() == TextureProcessMode::LL}; | ||||
|     const std::size_t coord_count{GetCoordCount(texture_type)}; | ||||
| 
 | ||||
|     u64 gpr8_cursor{instr.gpr8.Value()}; | ||||
|     const Node array_register{is_array ? GetRegister(gpr8_cursor++) : nullptr}; | ||||
| 
 | ||||
|     std::vector<Node> coords; | ||||
|     for (std::size_t i = 0; i < coord_count; ++i) { | ||||
|         coords.push_back(GetRegister(gpr8_cursor++)); | ||||
|     } | ||||
| 
 | ||||
|     u64 gpr20_cursor{instr.gpr20.Value()}; | ||||
|     // const Node bindless_register{is_bindless ? GetRegister(gpr20_cursor++) : nullptr};
 | ||||
|     const Node lod{lod_enabled ? GetRegister(gpr20_cursor++) : Immediate(0u)}; | ||||
|     // const Node aoffi_register{is_aoffi ? GetRegister(gpr20_cursor++) : nullptr};
 | ||||
|     // const Node multisample{is_multisample ? GetRegister(gpr20_cursor++) : nullptr};
 | ||||
| 
 | ||||
|     const auto& sampler = GetSampler(instr.sampler, texture_type, is_array, false); | ||||
| 
 | ||||
|     Node4 values; | ||||
|     for (u32 element = 0; element < values.size(); ++element) { | ||||
|         auto coords_copy = coords; | ||||
|         MetaTexture meta{sampler, array_register, {}, {}, {}, lod, {}, element}; | ||||
|         values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); | ||||
|     } | ||||
| 
 | ||||
|     return values; | ||||
| } | ||||
| 
 | ||||
| Node4 ShaderIR::GetTldsCode(Instruction instr, TextureType texture_type, bool is_array) { | ||||
|     const std::size_t type_coord_count = GetCoordCount(texture_type); | ||||
|     const bool lod_enabled = instr.tlds.GetTextureProcessMode() == TextureProcessMode::LL; | ||||
|  | ||||
| @ -277,6 +277,8 @@ private: | ||||
|     Node4 GetTld4Code(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type, | ||||
|                       bool depth_compare, bool is_array, bool is_aoffi); | ||||
| 
 | ||||
|     Node4 GetTldCode(Tegra::Shader::Instruction instr); | ||||
| 
 | ||||
|     Node4 GetTldsCode(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type, | ||||
|                       bool is_array); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user