[Mesa-dev] [PATCH] llvmpipe: Fix PIPE_FORMAT_Z32_FLOAT_S8X24_UINT handling for big-endian.

Roland Scheidegger sroland at vmware.com
Mon Jul 21 13:07:30 PDT 2014


Am 21.07.2014 17:53, schrieb Richard Sandiford:
> llvmpipe treats PIPE_FORMAT_Z32_FLOAT_S8X24_UINT as a bit of a special case,
> handling it as two 32-bit pieces rather than a single 64-bit block:
> 
>    /* 64bit d/s format is special already extracted 32 bits */
>    total_bits = format_desc->block.bits > 32 ? 32 : format_desc->block.bits;
> 
> The format_desc describes the whole 64-bit block, so the z shift
> will be 32 for big-endian.  But since we're accessing the z channel
> as a 32-bit value rather than a 64-bit value, we need to mask the shift
> with 31.
> 
> Signed-off-by: Richard Sandiford <rsandifo at linux.vnet.ibm.com>
> ---
>  src/gallium/drivers/llvmpipe/lp_bld_depth.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/llvmpipe/lp_bld_depth.c b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
> index 5c13ee5..b6c32ff 100644
> --- a/src/gallium/drivers/llvmpipe/lp_bld_depth.c
> +++ b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
> @@ -363,7 +363,8 @@ get_z_shift_and_mask(const struct util_format_description *format_desc,
>        return FALSE;
>  
>     *width = format_desc->channel[z_swizzle].size;
> -   *shift = format_desc->channel[z_swizzle].shift;
> +   /* & 31 is for the same reason as the 32-bit limit above */
> +   *shift = format_desc->channel[z_swizzle].shift & 31;
>  
>     if (*width == total_bits) {
>        *mask = 0xffffffff;
> 

Reviewed-by: Roland Scheidegger <sroland at vmware.com>


More information about the mesa-dev mailing list