diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/util/u_pack_color.h | 50 | 
1 files changed, 28 insertions, 22 deletions
| diff --git a/src/gallium/auxiliary/util/u_pack_color.h b/src/gallium/auxiliary/util/u_pack_color.h index c90b0fdbc3..5378f2d782 100644 --- a/src/gallium/auxiliary/util/u_pack_color.h +++ b/src/gallium/auxiliary/util/u_pack_color.h @@ -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; | 
