Merge pull request #162 from yuriks/float-conversions
GPU: Clean up float conversion functions
This commit is contained in:
commit
57eb921f1a
@ -229,40 +229,65 @@ void GPU_SetFloatUniform(GPU_SHADER_TYPE type, u32 startreg, u32* data, u32 numr
|
|||||||
GPUCMD_AddWrites(GPUREG_VSH_FLOATUNIFORM_DATA+regOffset, data, numreg*4);
|
GPUCMD_AddWrites(GPUREG_VSH_FLOATUNIFORM_DATA+regOffset, data, numreg*4);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO : fix
|
// f24 has:
|
||||||
u32 f32tof24(float f)
|
// - 1 sign bit
|
||||||
|
// - 7 exponent bits
|
||||||
|
// - 16 mantissa bits
|
||||||
|
static u32 f32tof24(float f)
|
||||||
{
|
{
|
||||||
if(!f)return 0;
|
u32 i;
|
||||||
u32 v=*((u32*)&f);
|
memcpy(&i, &f, 4);
|
||||||
u8 s=v>>31;
|
|
||||||
u32 exp=((v>>23)&0xFF)-0x40;
|
|
||||||
u32 man=(v>>7)&0xFFFF;
|
|
||||||
|
|
||||||
if(exp>=0)return man|(exp<<16)|(s<<23);
|
u32 mantissa = (i << 9) >> 9;
|
||||||
else return s<<23;
|
s32 exponent = (i << 1) >> 24;
|
||||||
|
u32 sign = (i << 0) >> 31;
|
||||||
|
|
||||||
|
// Truncate mantissa
|
||||||
|
mantissa >>= 7;
|
||||||
|
|
||||||
|
// Re-bias exponent
|
||||||
|
exponent = exponent - 127 + 63;
|
||||||
|
if (exponent < 0)
|
||||||
|
{
|
||||||
|
// Underflow: flush to zero
|
||||||
|
return sign << 23;
|
||||||
|
}
|
||||||
|
else if (exponent > 0x7F)
|
||||||
|
{
|
||||||
|
// Overflow: saturate to infinity
|
||||||
|
return sign << 23 | 0x7F << 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sign << 23 | exponent << 16 | mantissa;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 computeInvValue(u32 val)
|
// f31 has:
|
||||||
|
// - 1 sign bit
|
||||||
|
// - 7 exponent bits
|
||||||
|
// - 23 mantissa bits
|
||||||
|
static u32 f32tof31(float f)
|
||||||
{
|
{
|
||||||
//usual values
|
u32 i;
|
||||||
if(val==240)return 0x38111111;
|
memcpy(&i, &f, 4);
|
||||||
if(val==480)return 0x37111111;
|
|
||||||
if(val==400)return 0x3747ae14;
|
u32 mantissa = (i << 9) >> 9;
|
||||||
//but let's not limit ourselves to the usual
|
s32 exponent = (i << 1) >> 24;
|
||||||
float fval=2.0/val;
|
u32 sign = (i << 0) >> 31;
|
||||||
u32 tmp1,tmp2;
|
|
||||||
u32 tmp3=*((u32*)&fval);
|
// Re-bias exponent
|
||||||
tmp1=(tmp3<<9)>>9;
|
exponent = exponent - 127 + 63;
|
||||||
tmp2=tmp3&(~0x80000000);
|
if (exponent < 0)
|
||||||
if(tmp2)
|
|
||||||
{
|
{
|
||||||
tmp1=(tmp3<<9)>>9;
|
// Underflow: flush to zero
|
||||||
int tmp=((tmp3<<1)>>24)-0x40;
|
return sign << 30;
|
||||||
if(tmp<0)return ((tmp3>>31)<<30)<<1;
|
|
||||||
else tmp2=tmp;
|
|
||||||
}
|
}
|
||||||
tmp3>>=31;
|
else if (exponent > 0x7F)
|
||||||
return (tmp1|(tmp2<<23)|(tmp3<<30))<<1;
|
{
|
||||||
|
// Overflow: saturate to infinity
|
||||||
|
return sign << 30 | 0x7F << 23;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sign << 30 | exponent << 23 | mantissa;
|
||||||
}
|
}
|
||||||
|
|
||||||
//takes PAs as arguments
|
//takes PAs as arguments
|
||||||
@ -288,9 +313,9 @@ void GPU_SetViewport(u32* depthBuffer, u32* colorBuffer, u32 x, u32 y, u32 w, u3
|
|||||||
GPUCMD_AddWrite(GPUREG_011B, 0x00000000); //?
|
GPUCMD_AddWrite(GPUREG_011B, 0x00000000); //?
|
||||||
|
|
||||||
param[0x0]=f32tof24(fw/2);
|
param[0x0]=f32tof24(fw/2);
|
||||||
param[0x1]=computeInvValue(fw);
|
param[0x1]=f32tof31(2.0f / fw) << 1;
|
||||||
param[0x2]=f32tof24(fh/2);
|
param[0x2]=f32tof24(fh/2);
|
||||||
param[0x3]=computeInvValue(fh);
|
param[0x3]=f32tof31(2.0f / fh) << 1;
|
||||||
GPUCMD_AddIncrementalWrites(GPUREG_0041, param, 0x00000004);
|
GPUCMD_AddIncrementalWrites(GPUREG_0041, param, 0x00000004);
|
||||||
|
|
||||||
GPUCMD_AddWrite(GPUREG_0068, (y<<16)|(x&0xFFFF));
|
GPUCMD_AddWrite(GPUREG_0068, (y<<16)|(x&0xFFFF));
|
||||||
|
Loading…
Reference in New Issue
Block a user