Merge pull request #3273 from FernandoS27/txd-array
Shader_IR: Implement TXD Array.
This commit is contained in:
		
						commit
						a104b985a8
					
				@ -161,16 +161,16 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
 | 
				
			|||||||
    case OpCode::Id::TXD: {
 | 
					    case OpCode::Id::TXD: {
 | 
				
			||||||
        UNIMPLEMENTED_IF_MSG(instr.txd.UsesMiscMode(TextureMiscMode::AOFFI),
 | 
					        UNIMPLEMENTED_IF_MSG(instr.txd.UsesMiscMode(TextureMiscMode::AOFFI),
 | 
				
			||||||
                             "AOFFI is not implemented");
 | 
					                             "AOFFI is not implemented");
 | 
				
			||||||
        UNIMPLEMENTED_IF_MSG(instr.txd.is_array != 0, "TXD Array is not implemented");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const bool is_array = instr.txd.is_array != 0;
 | 
				
			||||||
        u64 base_reg = instr.gpr8.Value();
 | 
					        u64 base_reg = instr.gpr8.Value();
 | 
				
			||||||
        const auto derivate_reg = instr.gpr20.Value();
 | 
					        const auto derivate_reg = instr.gpr20.Value();
 | 
				
			||||||
        const auto texture_type = instr.txd.texture_type.Value();
 | 
					        const auto texture_type = instr.txd.texture_type.Value();
 | 
				
			||||||
        const auto coord_count = GetCoordCount(texture_type);
 | 
					        const auto coord_count = GetCoordCount(texture_type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const Sampler* sampler = is_bindless
 | 
					        const Sampler* sampler =
 | 
				
			||||||
                                     ? GetBindlessSampler(base_reg, {{texture_type, false, false}})
 | 
					            is_bindless ? GetBindlessSampler(base_reg, {{texture_type, is_array, false}})
 | 
				
			||||||
                                     : GetSampler(instr.sampler, {{texture_type, false, false}});
 | 
					                        : GetSampler(instr.sampler, {{texture_type, is_array, false}});
 | 
				
			||||||
        Node4 values;
 | 
					        Node4 values;
 | 
				
			||||||
        if (sampler == nullptr) {
 | 
					        if (sampler == nullptr) {
 | 
				
			||||||
            for (u32 element = 0; element < values.size(); ++element) {
 | 
					            for (u32 element = 0; element < values.size(); ++element) {
 | 
				
			||||||
@ -179,6 +179,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
 | 
				
			|||||||
            WriteTexInstructionFloat(bb, instr, values);
 | 
					            WriteTexInstructionFloat(bb, instr, values);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (is_bindless) {
 | 
					        if (is_bindless) {
 | 
				
			||||||
            base_reg++;
 | 
					            base_reg++;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -192,8 +193,14 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
 | 
				
			|||||||
            derivates.push_back(GetRegister(derivate_reg + derivate + 1));
 | 
					            derivates.push_back(GetRegister(derivate_reg + derivate + 1));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Node array_node = {};
 | 
				
			||||||
 | 
					        if (is_array) {
 | 
				
			||||||
 | 
					            const Node info_reg = GetRegister(base_reg + coord_count);
 | 
				
			||||||
 | 
					            array_node = BitfieldExtract(info_reg, 0, 16);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (u32 element = 0; element < values.size(); ++element) {
 | 
					        for (u32 element = 0; element < values.size(); ++element) {
 | 
				
			||||||
            MetaTexture meta{*sampler, {}, {}, {}, {}, derivates, {}, {}, {}, element};
 | 
					            MetaTexture meta{*sampler, array_node, {}, {}, {}, derivates, {}, {}, {}, element};
 | 
				
			||||||
            values[element] = Operation(OperationCode::TextureGradient, std::move(meta), coords);
 | 
					            values[element] = Operation(OperationCode::TextureGradient, std::move(meta), coords);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user