util: Cleanup util_pack_z_stencil and friends.

- Handle PIPE_FORMAT_Z32_FLOAT packing correctly.

- In the integer version z shouldn't be passed as as double.

- Make it clear that the integer versions should only be used for masks.

- Make integer type sizes explicit (uint32_t for now, although
  uint64_t will be necessary later to encode f32_s8_x24).
This commit is contained in:
José Fonseca 2010-10-06 10:09:37 +01:00
parent 87dd859b34
commit 33f88b3492

View file

@ -434,8 +434,8 @@ util_pack_color(const float rgba[4], enum pipe_format format, union util_color *
/* Integer versions of util_pack_z and util_pack_z_stencil - useful for
* constructing clear masks.
*/
static INLINE uint
util_pack_uint_z(enum pipe_format format, unsigned z)
static INLINE uint32_t
util_pack_mask_z(enum pipe_format format, uint32_t z)
{
switch (format) {
case PIPE_FORMAT_Z16_UNORM:
@ -452,29 +452,32 @@ util_pack_uint_z(enum pipe_format format, unsigned z)
case PIPE_FORMAT_S8_USCALED:
return 0;
default:
debug_print_format("gallium: unhandled format in util_pack_z()", format);
debug_print_format("gallium: unhandled format in util_pack_mask_z()", format);
assert(0);
return 0;
}
}
static INLINE uint
util_pack_uint_z_stencil(enum pipe_format format, double z, uint s)
static INLINE uint32_t
util_pack_mask_z_stencil(enum pipe_format format, uint32_t z, uint8_t s)
{
unsigned packed = util_pack_uint_z(format, z);
s &= 0xff;
uint32_t packed = util_pack_mask_z(format, z);
switch (format) {
case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
return packed | (s << 24);
packed |= (uint32_t)s << 24;
break;
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
return packed | s;
packed |= s;
break;
case PIPE_FORMAT_S8_USCALED:
return packed | s;
packed |= s;
break;
default:
return packed;
break;
}
return packed;
}
@ -482,9 +485,11 @@ util_pack_uint_z_stencil(enum pipe_format format, double z, uint s)
/**
* Note: it's assumed that z is in [0,1]
*/
static INLINE uint
static INLINE uint32_t
util_pack_z(enum pipe_format format, double z)
{
union fi fui;
if (z == 0.0)
return 0;
@ -492,24 +497,25 @@ util_pack_z(enum pipe_format format, double z)
case PIPE_FORMAT_Z16_UNORM:
if (z == 1.0)
return 0xffff;
return (uint) (z * 0xffff);
return (uint32_t) (z * 0xffff);
case PIPE_FORMAT_Z32_UNORM:
/* special-case to avoid overflow */
if (z == 1.0)
return 0xffffffff;
return (uint) (z * 0xffffffff);
return (uint32_t) (z * 0xffffffff);
case PIPE_FORMAT_Z32_FLOAT:
return (uint)z;
fui.f = (float)z;
return fui.ui;
case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
case PIPE_FORMAT_Z24X8_UNORM:
if (z == 1.0)
return 0xffffff;
return (uint) (z * 0xffffff);
return (uint32_t) (z * 0xffffff);
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
case PIPE_FORMAT_X8Z24_UNORM:
if (z == 1.0)
return 0xffffff00;
return ((uint) (z * 0xffffff)) << 8;
return ((uint32_t) (z * 0xffffff)) << 8;
case PIPE_FORMAT_S8_USCALED:
/* this case can get it via util_pack_z_stencil() */
return 0;
@ -525,14 +531,14 @@ util_pack_z(enum pipe_format format, double z)
* Pack Z and/or stencil values into a 32-bit value described by format.
* Note: it's assumed that z is in [0,1] and s in [0,255]
*/
static INLINE uint
util_pack_z_stencil(enum pipe_format format, double z, uint s)
static INLINE uint32_t
util_pack_z_stencil(enum pipe_format format, double z, uint8_t s)
{
unsigned packed = util_pack_z(format, z);
uint32_t packed = util_pack_z(format, z);
switch (format) {
case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
packed |= s << 24;
packed |= (uint32_t)s << 24;
break;
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
packed |= s;