forked from eden-emu/eden
		
	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
							
								
									c330734536
								
							
						
					
					
						commit
						0e337430f5
					
				
					 1 changed files with 18 additions and 9 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Subv
						Subv