mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 01:08:03 +02:00
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:
parent
87dd859b34
commit
33f88b3492
1 changed files with 28 additions and 22 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue