mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +01:00 
			
		
		
		
	GPU: Use explicit types when retrieving the uniform values for fsetp/fset and isetp instead of the type of an invalid output register.
This commit is contained in:
		
							parent
							
								
									7c181fd4f4
								
							
						
					
					
						commit
						90cddf1996
					
				@ -197,6 +197,11 @@ public:
 | 
			
		||||
        return active_type == Type::Integer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns the current active type of the register
 | 
			
		||||
    Type GetActiveType() const {
 | 
			
		||||
        return active_type;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns the index of the register
 | 
			
		||||
    size_t GetIndex() const {
 | 
			
		||||
        return index;
 | 
			
		||||
@ -328,22 +333,28 @@ public:
 | 
			
		||||
        shader.AddLine(dest + " = " + src + ';');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Generates code representing a uniform (C buffer) register.
 | 
			
		||||
    std::string GetUniform(const Uniform& uniform, const Register& dest_reg) {
 | 
			
		||||
    /// Generates code representing a uniform (C buffer) register, interpreted as the input type.
 | 
			
		||||
    std::string GetUniform(const Uniform& uniform, GLSLRegister::Type type) {
 | 
			
		||||
        declr_const_buffers[uniform.index].MarkAsUsed(static_cast<unsigned>(uniform.index),
 | 
			
		||||
                                                      static_cast<unsigned>(uniform.offset), stage);
 | 
			
		||||
        std::string value =
 | 
			
		||||
            'c' + std::to_string(uniform.index) + '[' + std::to_string(uniform.offset) + ']';
 | 
			
		||||
 | 
			
		||||
        if (regs[dest_reg].IsFloat()) {
 | 
			
		||||
        if (type == GLSLRegister::Type::Float) {
 | 
			
		||||
            return value;
 | 
			
		||||
        } else if (regs[dest_reg].IsInteger()) {
 | 
			
		||||
        } else if (type == GLSLRegister::Type::Integer) {
 | 
			
		||||
            return "floatBitsToInt(" + value + ')';
 | 
			
		||||
        } else {
 | 
			
		||||
            UNREACHABLE();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Generates code representing a uniform (C buffer) register, interpreted as the type of the
 | 
			
		||||
    /// destination register.
 | 
			
		||||
    std::string GetUniform(const Uniform& uniform, const Register& dest_reg) {
 | 
			
		||||
        return GetUniform(uniform, regs[dest_reg].GetActiveType());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Add declarations for registers
 | 
			
		||||
    void GenerateDeclarations() {
 | 
			
		||||
        for (const auto& reg : regs) {
 | 
			
		||||
@ -986,7 +997,7 @@ private:
 | 
			
		||||
                if (instr.is_b_gpr) {
 | 
			
		||||
                    op_b += regs.GetRegisterAsFloat(instr.gpr20);
 | 
			
		||||
                } else {
 | 
			
		||||
                    op_b += regs.GetUniform(instr.uniform, instr.gpr0);
 | 
			
		||||
                    op_b += regs.GetUniform(instr.uniform, GLSLRegister::Type::Float);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -1027,9 +1038,7 @@ private:
 | 
			
		||||
            if (instr.is_b_gpr) {
 | 
			
		||||
                op_b += regs.GetRegisterAsInteger(instr.gpr20, 0, instr.isetp.is_signed);
 | 
			
		||||
            } else {
 | 
			
		||||
                // TODO(Subv): This family of instructions don't store to a GPR, but GetUniform
 | 
			
		||||
                // needs to know the type of the output register.
 | 
			
		||||
                op_b += regs.GetUniform(instr.uniform, instr.gpr0);
 | 
			
		||||
                op_b += regs.GetUniform(instr.uniform, GLSLRegister::Type::Integer);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            using Tegra::Shader::Pred;
 | 
			
		||||
@ -1075,7 +1084,7 @@ private:
 | 
			
		||||
                if (instr.is_b_gpr) {
 | 
			
		||||
                    op_b += regs.GetRegisterAsFloat(instr.gpr20);
 | 
			
		||||
                } else {
 | 
			
		||||
                    op_b += regs.GetUniform(instr.uniform, instr.gpr0);
 | 
			
		||||
                    op_b += regs.GetUniform(instr.uniform, GLSLRegister::Type::Float);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user