[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