mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	pica: Add pica_types module and move float24 definition.
This commit is contained in:
		
							parent
							
								
									69e2453649
								
							
						
					
					
						commit
						38c7b20475
					
				
					 3 changed files with 127 additions and 112 deletions
				
			
		|  | @ -33,6 +33,7 @@ set(HEADERS | |||
|             command_processor.h | ||||
|             gpu_debugger.h | ||||
|             pica.h | ||||
|             pica_types.h | ||||
|             primitive_assembly.h | ||||
|             rasterizer.h | ||||
|             rasterizer_interface.h | ||||
|  |  | |||
|  | @ -16,6 +16,8 @@ | |||
| #include "common/vector_math.h" | ||||
| #include "common/logging/log.h" | ||||
| 
 | ||||
| #include "pica_types.h" | ||||
| 
 | ||||
| namespace Pica { | ||||
| 
 | ||||
| // Returns index corresponding to the Regs member labeled by field_name
 | ||||
|  | @ -1026,118 +1028,6 @@ static_assert(sizeof(Regs::ShaderConfig) == 0x30 * sizeof(u32), "ShaderConfig st | |||
| static_assert(sizeof(Regs) <= 0x300 * sizeof(u32), "Register set structure larger than it should be"); | ||||
| static_assert(sizeof(Regs) >= 0x300 * sizeof(u32), "Register set structure smaller than it should be"); | ||||
| 
 | ||||
| struct float24 { | ||||
|     static float24 FromFloat32(float val) { | ||||
|         float24 ret; | ||||
|         ret.value = val; | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     // 16 bit mantissa, 7 bit exponent, 1 bit sign
 | ||||
|     // TODO: No idea if this works as intended
 | ||||
|     static float24 FromRawFloat24(u32 hex) { | ||||
|         float24 ret; | ||||
|         if ((hex & 0xFFFFFF) == 0) { | ||||
|             ret.value = 0; | ||||
|         } else { | ||||
|             u32 mantissa = hex & 0xFFFF; | ||||
|             u32 exponent = (hex >> 16) & 0x7F; | ||||
|             u32 sign = hex >> 23; | ||||
|             ret.value = std::pow(2.0f, (float)exponent-63.0f) * (1.0f + mantissa * std::pow(2.0f, -16.f)); | ||||
|             if (sign) | ||||
|                 ret.value = -ret.value; | ||||
|         } | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     static float24 Zero() { | ||||
|         return FromFloat32(0.f); | ||||
|     } | ||||
| 
 | ||||
|     // Not recommended for anything but logging
 | ||||
|     float ToFloat32() const { | ||||
|         return value; | ||||
|     } | ||||
| 
 | ||||
|     float24 operator * (const float24& flt) const { | ||||
|         if ((this->value == 0.f && !std::isnan(flt.value)) || | ||||
|             (flt.value == 0.f && !std::isnan(this->value))) | ||||
|             // PICA gives 0 instead of NaN when multiplying by inf
 | ||||
|             return Zero(); | ||||
|         return float24::FromFloat32(ToFloat32() * flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24 operator / (const float24& flt) const { | ||||
|         return float24::FromFloat32(ToFloat32() / flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24 operator + (const float24& flt) const { | ||||
|         return float24::FromFloat32(ToFloat32() + flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24 operator - (const float24& flt) const { | ||||
|         return float24::FromFloat32(ToFloat32() - flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24& operator *= (const float24& flt) { | ||||
|         if ((this->value == 0.f && !std::isnan(flt.value)) || | ||||
|             (flt.value == 0.f && !std::isnan(this->value))) | ||||
|             // PICA gives 0 instead of NaN when multiplying by inf
 | ||||
|             *this = Zero(); | ||||
|         else value *= flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24& operator /= (const float24& flt) { | ||||
|         value /= flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24& operator += (const float24& flt) { | ||||
|         value += flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24& operator -= (const float24& flt) { | ||||
|         value -= flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24 operator - () const { | ||||
|         return float24::FromFloat32(-ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     bool operator < (const float24& flt) const { | ||||
|         return ToFloat32() < flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator > (const float24& flt) const { | ||||
|         return ToFloat32() > flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator >= (const float24& flt) const { | ||||
|         return ToFloat32() >= flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator <= (const float24& flt) const { | ||||
|         return ToFloat32() <= flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator == (const float24& flt) const { | ||||
|         return ToFloat32() == flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator != (const float24& flt) const { | ||||
|         return ToFloat32() != flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     // Stored as a regular float, merely for convenience
 | ||||
|     // TODO: Perform proper arithmetic on this!
 | ||||
|     float value; | ||||
| }; | ||||
| static_assert(sizeof(float24) == sizeof(float), "Shader JIT assumes float24 is implemented as a 32-bit float"); | ||||
| 
 | ||||
| /// Struct used to describe current Pica state
 | ||||
| struct State { | ||||
|     /// Pica registers
 | ||||
|  |  | |||
							
								
								
									
										124
									
								
								src/video_core/pica_types.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/video_core/pica_types.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,124 @@ | |||
| // Copyright 2015 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Pica { | ||||
| 
 | ||||
| struct float24 { | ||||
|     static float24 FromFloat32(float val) { | ||||
|         float24 ret; | ||||
|         ret.value = val; | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     // 16 bit mantissa, 7 bit exponent, 1 bit sign
 | ||||
|     // TODO: No idea if this works as intended
 | ||||
|     static float24 FromRawFloat24(u32 hex) { | ||||
|         float24 ret; | ||||
|         if ((hex & 0xFFFFFF) == 0) { | ||||
|             ret.value = 0; | ||||
|         } else { | ||||
|             u32 mantissa = hex & 0xFFFF; | ||||
|             u32 exponent = (hex >> 16) & 0x7F; | ||||
|             u32 sign = hex >> 23; | ||||
|             ret.value = std::pow(2.0f, (float)exponent-63.0f) * (1.0f + mantissa * std::pow(2.0f, -16.f)); | ||||
|             if (sign) | ||||
|                 ret.value = -ret.value; | ||||
|         } | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     static float24 Zero() { | ||||
|         return FromFloat32(0.f); | ||||
|     } | ||||
| 
 | ||||
|     // Not recommended for anything but logging
 | ||||
|     float ToFloat32() const { | ||||
|         return value; | ||||
|     } | ||||
| 
 | ||||
|     float24 operator * (const float24& flt) const { | ||||
|         if ((this->value == 0.f && !std::isnan(flt.value)) || | ||||
|             (flt.value == 0.f && !std::isnan(this->value))) | ||||
|             // PICA gives 0 instead of NaN when multiplying by inf
 | ||||
|             return Zero(); | ||||
|         return float24::FromFloat32(ToFloat32() * flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24 operator / (const float24& flt) const { | ||||
|         return float24::FromFloat32(ToFloat32() / flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24 operator + (const float24& flt) const { | ||||
|         return float24::FromFloat32(ToFloat32() + flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24 operator - (const float24& flt) const { | ||||
|         return float24::FromFloat32(ToFloat32() - flt.ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     float24& operator *= (const float24& flt) { | ||||
|         if ((this->value == 0.f && !std::isnan(flt.value)) || | ||||
|             (flt.value == 0.f && !std::isnan(this->value))) | ||||
|             // PICA gives 0 instead of NaN when multiplying by inf
 | ||||
|             *this = Zero(); | ||||
|         else value *= flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24& operator /= (const float24& flt) { | ||||
|         value /= flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24& operator += (const float24& flt) { | ||||
|         value += flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24& operator -= (const float24& flt) { | ||||
|         value -= flt.ToFloat32(); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     float24 operator - () const { | ||||
|         return float24::FromFloat32(-ToFloat32()); | ||||
|     } | ||||
| 
 | ||||
|     bool operator < (const float24& flt) const { | ||||
|         return ToFloat32() < flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator > (const float24& flt) const { | ||||
|         return ToFloat32() > flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator >= (const float24& flt) const { | ||||
|         return ToFloat32() >= flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator <= (const float24& flt) const { | ||||
|         return ToFloat32() <= flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator == (const float24& flt) const { | ||||
|         return ToFloat32() == flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
|     bool operator != (const float24& flt) const { | ||||
|         return ToFloat32() != flt.ToFloat32(); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     // Stored as a regular float, merely for convenience
 | ||||
|     // TODO: Perform proper arithmetic on this!
 | ||||
|     float value; | ||||
| }; | ||||
| 
 | ||||
| static_assert(sizeof(float24) == sizeof(float), "Shader JIT assumes float24 is implemented as a 32-bit float"); | ||||
| 
 | ||||
| } // namespace Pica
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue