mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 12:45:03 +01:00 
			
		
		
		
	Shader_Ir: Correct TLD4S encoding and implement f16 flag.
This commit is contained in:
		
							parent
							
								
									84a158c977
								
							
						
					
					
						commit
						af89723fa3
					
				@ -1292,6 +1292,7 @@ union Instruction {
 | 
			
		||||
        BitField<50, 1, u64> dc_flag;
 | 
			
		||||
        BitField<51, 1, u64> aoffi_flag;
 | 
			
		||||
        BitField<52, 2, u64> component;
 | 
			
		||||
        BitField<55, 1, u64> fp16_flag;
 | 
			
		||||
 | 
			
		||||
        bool UsesMiscMode(TextureMiscMode mode) const {
 | 
			
		||||
            switch (mode) {
 | 
			
		||||
@ -1972,7 +1973,7 @@ private:
 | 
			
		||||
            INST("1101-01---------", Id::TLDS, Type::Texture, "TLDS"),
 | 
			
		||||
            INST("110010----111---", Id::TLD4, Type::Texture, "TLD4"),
 | 
			
		||||
            INST("1101111011111---", Id::TLD4_B, Type::Texture, "TLD4_B"),
 | 
			
		||||
            INST("1101111100------", Id::TLD4S, Type::Texture, "TLD4S"),
 | 
			
		||||
            INST("11011111--00----", Id::TLD4S, Type::Texture, "TLD4S"),
 | 
			
		||||
            INST("110111110110----", Id::TMML_B, Type::Texture, "TMML_B"),
 | 
			
		||||
            INST("1101111101011---", Id::TMML, Type::Texture, "TMML"),
 | 
			
		||||
            INST("11011110011110--", Id::TXD_B, Type::Texture, "TXD_B"),
 | 
			
		||||
 | 
			
		||||
@ -138,7 +138,11 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
 | 
			
		||||
            values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        WriteTexsInstructionFloat(bb, instr, values, true);
 | 
			
		||||
        if (instr.tld4s.fp16_flag) {
 | 
			
		||||
            WriteTexsInstructionHalfFloat(bb, instr, values, true);
 | 
			
		||||
        } else {
 | 
			
		||||
            WriteTexsInstructionFloat(bb, instr, values, true);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    case OpCode::Id::TXD_B:
 | 
			
		||||
@ -155,8 +159,8 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
 | 
			
		||||
        const auto coord_count = GetCoordCount(texture_type);
 | 
			
		||||
 | 
			
		||||
        const Sampler* sampler = is_bindless
 | 
			
		||||
                                  ? GetBindlessSampler(base_reg, {{texture_type, false, false}})
 | 
			
		||||
                                  : GetSampler(instr.sampler, {{texture_type, false, false}});
 | 
			
		||||
                                     ? GetBindlessSampler(base_reg, {{texture_type, false, false}})
 | 
			
		||||
                                     : GetSampler(instr.sampler, {{texture_type, false, false}});
 | 
			
		||||
        Node4 values;
 | 
			
		||||
        if (sampler == nullptr) {
 | 
			
		||||
            for (u32 element = 0; element < values.size(); ++element) {
 | 
			
		||||
@ -362,7 +366,7 @@ const Sampler* ShaderIR::GetSampler(const Tegra::Shader::Sampler& sampler,
 | 
			
		||||
    // Otherwise create a new mapping for this sampler
 | 
			
		||||
    const auto next_index = static_cast<u32>(used_samplers.size());
 | 
			
		||||
    return &used_samplers.emplace_back(next_index, offset, info.type, info.is_array, info.is_shadow,
 | 
			
		||||
                                      info.is_buffer);
 | 
			
		||||
                                       info.is_buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const Sampler* ShaderIR::GetBindlessSampler(Tegra::Shader::Register reg,
 | 
			
		||||
@ -392,7 +396,7 @@ const Sampler* ShaderIR::GetBindlessSampler(Tegra::Shader::Register reg,
 | 
			
		||||
    // Otherwise create a new mapping for this sampler
 | 
			
		||||
    const auto next_index = static_cast<u32>(used_samplers.size());
 | 
			
		||||
    return &used_samplers.emplace_back(next_index, offset, buffer, info.type, info.is_array,
 | 
			
		||||
                                      info.is_shadow, info.is_buffer);
 | 
			
		||||
                                       info.is_shadow, info.is_buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ShaderIR::WriteTexInstructionFloat(NodeBlock& bb, Instruction instr, const Node4& components) {
 | 
			
		||||
@ -435,14 +439,14 @@ void ShaderIR::WriteTexsInstructionFloat(NodeBlock& bb, Instruction instr, const
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ShaderIR::WriteTexsInstructionHalfFloat(NodeBlock& bb, Instruction instr,
 | 
			
		||||
                                             const Node4& components) {
 | 
			
		||||
                                             const Node4& components, bool ignore_mask) {
 | 
			
		||||
    // TEXS.F16 destionation registers are packed in two registers in pairs (just like any half
 | 
			
		||||
    // float instruction).
 | 
			
		||||
 | 
			
		||||
    Node4 values;
 | 
			
		||||
    u32 dest_elem = 0;
 | 
			
		||||
    for (u32 component = 0; component < 4; ++component) {
 | 
			
		||||
        if (!instr.texs.IsComponentEnabled(component))
 | 
			
		||||
        if (!instr.texs.IsComponentEnabled(component) && !ignore_mask)
 | 
			
		||||
            continue;
 | 
			
		||||
        values[dest_elem++] = components[component];
 | 
			
		||||
    }
 | 
			
		||||
@ -525,7 +529,6 @@ Node4 ShaderIR::GetTextureCode(Instruction instr, TextureType texture_type,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    for (u32 element = 0; element < values.size(); ++element) {
 | 
			
		||||
        auto copy_coords = coords;
 | 
			
		||||
        MetaTexture meta{*sampler, array, depth_compare, aoffi, {}, bias, lod, {}, element};
 | 
			
		||||
@ -642,7 +645,7 @@ Node4 ShaderIR::GetTld4Code(Instruction instr, TextureType texture_type, bool de
 | 
			
		||||
 | 
			
		||||
    const SamplerInfo info{texture_type, is_array, depth_compare, false};
 | 
			
		||||
    const Sampler* sampler = is_bindless ? GetBindlessSampler(parameter_register++, info)
 | 
			
		||||
                                      : GetSampler(instr.sampler, info);
 | 
			
		||||
                                         : GetSampler(instr.sampler, info);
 | 
			
		||||
    Node4 values;
 | 
			
		||||
    if (sampler == nullptr) {
 | 
			
		||||
        for (u32 element = 0; element < values.size(); ++element) {
 | 
			
		||||
 | 
			
		||||
@ -338,7 +338,7 @@ private:
 | 
			
		||||
    void WriteTexsInstructionFloat(NodeBlock& bb, Tegra::Shader::Instruction instr,
 | 
			
		||||
                                   const Node4& components, bool ignore_mask = false);
 | 
			
		||||
    void WriteTexsInstructionHalfFloat(NodeBlock& bb, Tegra::Shader::Instruction instr,
 | 
			
		||||
                                       const Node4& components);
 | 
			
		||||
                                       const Node4& components, bool ignore_mask = false);
 | 
			
		||||
 | 
			
		||||
    Node4 GetTexCode(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type,
 | 
			
		||||
                     Tegra::Shader::TextureProcessMode process_mode, bool depth_compare,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user