summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/glamo/glamo_context.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/glamo/glamo_context.c')
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_context.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/glamo/glamo_context.c b/src/mesa/drivers/dri/glamo/glamo_context.c
index 5f435028b7..47241ae9b8 100644
--- a/src/mesa/drivers/dri/glamo/glamo_context.c
+++ b/src/mesa/drivers/dri/glamo/glamo_context.c
@@ -326,3 +326,35 @@ GLboolean glamoUnbindContext(__DRIcontext *driContextPriv)
{
return GL_TRUE;
}
+
+
+/* Convert IEEE754 32-bit float to Glamo's signed 24-bit float */
+uint32_t float7s16(GLfloat in)
+{
+ uint32_t a, b;
+ uint32_t sign, expo, mant; /* Sign, exponent, significand */
+
+ a = *(uint32_t *)∈
+
+ /* This is bad */
+ if ( a & 0x40000000 ) {
+ printf(stderr, "Warning: Exponent won't fit into 7 bits\n");
+ }
+
+ /* This hopefully isn't a big problem */
+ if ( a & 0x0000007f ) {
+ printf(stderr, "Warning: Precision lost in FP conversion\n");
+ }
+
+ /* Separate out the right bits */
+ mant = a & 0x007fff80; /* Bits 7-22 (bits 0-6 are lost) */
+ expo = a & 0x3f800000; /* Bits 23-29 (bit 30 is lost) */
+ sign = a & 0x80000000; /* Bit 31 */
+
+ /* Shift and recombine */
+ b = sign >> 8; /* Fills bit 23 */
+ b |= expo >> 7; /* Fills bits 16-22 */
+ b |= mant >> 7; /* Fills bits 0-15 */
+
+ return b;
+}