mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06: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:
		@@ -197,6 +197,11 @@ public:
 | 
				
			|||||||
        return active_type == Type::Integer;
 | 
					        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
 | 
					    /// Returns the index of the register
 | 
				
			||||||
    size_t GetIndex() const {
 | 
					    size_t GetIndex() const {
 | 
				
			||||||
        return index;
 | 
					        return index;
 | 
				
			||||||
@@ -328,22 +333,28 @@ public:
 | 
				
			|||||||
        shader.AddLine(dest + " = " + src + ';');
 | 
					        shader.AddLine(dest + " = " + src + ';');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Generates code representing a uniform (C buffer) register.
 | 
					    /// Generates code representing a uniform (C buffer) register, interpreted as the input type.
 | 
				
			||||||
    std::string GetUniform(const Uniform& uniform, const Register& dest_reg) {
 | 
					    std::string GetUniform(const Uniform& uniform, GLSLRegister::Type type) {
 | 
				
			||||||
        declr_const_buffers[uniform.index].MarkAsUsed(static_cast<unsigned>(uniform.index),
 | 
					        declr_const_buffers[uniform.index].MarkAsUsed(static_cast<unsigned>(uniform.index),
 | 
				
			||||||
                                                      static_cast<unsigned>(uniform.offset), stage);
 | 
					                                                      static_cast<unsigned>(uniform.offset), stage);
 | 
				
			||||||
        std::string value =
 | 
					        std::string value =
 | 
				
			||||||
            'c' + std::to_string(uniform.index) + '[' + std::to_string(uniform.offset) + ']';
 | 
					            'c' + std::to_string(uniform.index) + '[' + std::to_string(uniform.offset) + ']';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (regs[dest_reg].IsFloat()) {
 | 
					        if (type == GLSLRegister::Type::Float) {
 | 
				
			||||||
            return value;
 | 
					            return value;
 | 
				
			||||||
        } else if (regs[dest_reg].IsInteger()) {
 | 
					        } else if (type == GLSLRegister::Type::Integer) {
 | 
				
			||||||
            return "floatBitsToInt(" + value + ')';
 | 
					            return "floatBitsToInt(" + value + ')';
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            UNREACHABLE();
 | 
					            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
 | 
					    /// Add declarations for registers
 | 
				
			||||||
    void GenerateDeclarations() {
 | 
					    void GenerateDeclarations() {
 | 
				
			||||||
        for (const auto& reg : regs) {
 | 
					        for (const auto& reg : regs) {
 | 
				
			||||||
@@ -986,7 +997,7 @@ private:
 | 
				
			|||||||
                if (instr.is_b_gpr) {
 | 
					                if (instr.is_b_gpr) {
 | 
				
			||||||
                    op_b += regs.GetRegisterAsFloat(instr.gpr20);
 | 
					                    op_b += regs.GetRegisterAsFloat(instr.gpr20);
 | 
				
			||||||
                } else {
 | 
					                } 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) {
 | 
					            if (instr.is_b_gpr) {
 | 
				
			||||||
                op_b += regs.GetRegisterAsInteger(instr.gpr20, 0, instr.isetp.is_signed);
 | 
					                op_b += regs.GetRegisterAsInteger(instr.gpr20, 0, instr.isetp.is_signed);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                // TODO(Subv): This family of instructions don't store to a GPR, but GetUniform
 | 
					                op_b += regs.GetUniform(instr.uniform, GLSLRegister::Type::Integer);
 | 
				
			||||||
                // needs to know the type of the output register.
 | 
					 | 
				
			||||||
                op_b += regs.GetUniform(instr.uniform, instr.gpr0);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using Tegra::Shader::Pred;
 | 
					            using Tegra::Shader::Pred;
 | 
				
			||||||
@@ -1075,7 +1084,7 @@ private:
 | 
				
			|||||||
                if (instr.is_b_gpr) {
 | 
					                if (instr.is_b_gpr) {
 | 
				
			||||||
                    op_b += regs.GetRegisterAsFloat(instr.gpr20);
 | 
					                    op_b += regs.GetRegisterAsFloat(instr.gpr20);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    op_b += regs.GetUniform(instr.uniform, instr.gpr0);
 | 
					                    op_b += regs.GetUniform(instr.uniform, GLSLRegister::Type::Float);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user