summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2014-07-27 20:08:42 +0200
committerGravatar Tony Wasserka2014-08-12 13:46:24 +0200
commit98ad16a45b9441a54d80e67425ac3ddee24f08dc (patch)
tree2d70a631416a0163e46048297fe395457130d697 /src
parentVideo core: Add utility class for vector operations. (diff)
downloadyuzu-98ad16a45b9441a54d80e67425ac3ddee24f08dc.tar.gz
yuzu-98ad16a45b9441a54d80e67425ac3ddee24f08dc.tar.xz
yuzu-98ad16a45b9441a54d80e67425ac3ddee24f08dc.zip
Pica: Add float24 structure.
24-bit floating points are used internally for calculations on the GPU, however the current code will still emulate that with 32-bit floating points. In the future we might want to accurately perform the calculations with correct bitness in the future, but for now we just wrap the calculations around this class.
Diffstat (limited to '')
-rw-r--r--src/video_core/pica.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index 858335d44..24b39a3ad 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -161,6 +161,81 @@ ASSERT_REG_POSITION(vertex_descriptor, 0x200);
161// The total number of registers is chosen arbitrarily, but let's make sure it's not some odd value anyway. 161// The total number of registers is chosen arbitrarily, but let's make sure it's not some odd value anyway.
162static_assert(sizeof(Regs) == 0x300 * sizeof(u32), "Invalid total size of register set"); 162static_assert(sizeof(Regs) == 0x300 * sizeof(u32), "Invalid total size of register set");
163 163
164
165struct float24 {
166 static float24 FromFloat32(float val) {
167 float24 ret;
168 ret.value = val;
169 return ret;
170 }
171
172 // 16 bit mantissa, 7 bit exponent, 1 bit sign
173 // TODO: No idea if this works as intended
174 static float24 FromRawFloat24(u32 hex) {
175 float24 ret;
176 if ((hex & 0xFFFFFF) == 0) {
177 ret.value = 0;
178 } else {
179 u32 mantissa = hex & 0xFFFF;
180 u32 exponent = (hex >> 16) & 0x7F;
181 u32 sign = hex >> 23;
182 ret.value = powf(2.0f, (float)exponent-63.0f) * (1.0f + mantissa * powf(2.0f, -16.f));
183 if (sign)
184 ret.value = -ret.value;
185 }
186 return ret;
187 }
188
189 // Not recommended for anything but logging
190 float ToFloat32() const {
191 return value;
192 }
193
194 float24 operator * (const float24& flt) const {
195 return float24::FromFloat32(ToFloat32() * flt.ToFloat32());
196 }
197
198 float24 operator / (const float24& flt) const {
199 return float24::FromFloat32(ToFloat32() / flt.ToFloat32());
200 }
201
202 float24 operator + (const float24& flt) const {
203 return float24::FromFloat32(ToFloat32() + flt.ToFloat32());
204 }
205
206 float24 operator - (const float24& flt) const {
207 return float24::FromFloat32(ToFloat32() - flt.ToFloat32());
208 }
209
210 float24 operator - () const {
211 return float24::FromFloat32(-ToFloat32());
212 }
213
214 bool operator < (const float24& flt) const {
215 return ToFloat32() < flt.ToFloat32();
216 }
217
218 bool operator > (const float24& flt) const {
219 return ToFloat32() > flt.ToFloat32();
220 }
221
222 bool operator >= (const float24& flt) const {
223 return ToFloat32() >= flt.ToFloat32();
224 }
225
226 bool operator <= (const float24& flt) const {
227 return ToFloat32() <= flt.ToFloat32();
228 }
229
230private:
231 float24() = default;
232
233 // Stored as a regular float, merely for convenience
234 // TODO: Perform proper arithmetic on this!
235 float value;
236};
237
238
164union CommandHeader { 239union CommandHeader {
165 CommandHeader(u32 h) : hex(h) {} 240 CommandHeader(u32 h) : hex(h) {}
166 241