diff --git a/Utilities/types.h b/Utilities/types.h index d509e3ad76..5fdaf0dc31 100644 --- a/Utilities/types.h +++ b/Utilities/types.h @@ -26,6 +26,21 @@ union alignas(2) f16 { u16 _u16; u8 _u8[2]; + + explicit f16(u16 raw) + { + _u16 = raw; + } + + explicit operator float() const + { + // See http://stackoverflow.com/a/26779139 + // The conversion doesn't handle NaN/Inf + u32 raw = ((_u16 & 0x8000) << 16) | // Sign (just moved) + (((_u16 & 0x7c00) + 0x1C000) << 13) | // Exponent ( exp - 15 + 127) + ((_u16 & 0x03FF) << 13); // Mantissa + return (float&)raw; + } }; using f32 = float; diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 066ac3b363..017b4e9146 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -144,9 +144,9 @@ namespace rsx return (method_registers[NV4097_SET_TEXTURE_CONTROL1 + (m_index * 8)]); } - u16 texture::bias() const + float texture::bias() const { - return ((method_registers[NV4097_SET_TEXTURE_FILTER + (m_index * 8)]) & 0x1fff); + return float(f16((method_registers[NV4097_SET_TEXTURE_FILTER + (m_index * 8)]) & 0x1fff)); } u8 texture::min_filter() const diff --git a/rpcs3/Emu/RSX/RSXTexture.h b/rpcs3/Emu/RSX/RSXTexture.h index 014d862340..20b0783360 100644 --- a/rpcs3/Emu/RSX/RSXTexture.h +++ b/rpcs3/Emu/RSX/RSXTexture.h @@ -44,7 +44,7 @@ namespace rsx u32 remap() const; // Filter - u16 bias() const; + float bias() const; u8 min_filter() const; u8 mag_filter() const; u8 convolution_filter() const;