I think this is not the right place to do this. It looks like
r600_translate_colorformat and/or r600_colorformat_endian_swap and
r600_translate_texformat should be adjusted instead.

Marek

On Thu, Mar 3, 2016 at 4:47 PM, Oded Gabbay <[email protected]> wrote:
> The following is what happens when trying to do glReadPixels() with
> GL_DEPTH_COMPONENT:
>
> 1. When decompressing depth in BE, the GPU performs a swap of the depth
>    value when it is written to the memory-mapped buffer.
>
> 2. When the pipe format is PIPE_FORMAT_Z24_UNORM_S8_UINT, the values
>    are unpakeded using unpack_uint_z_Z24_UNORM_X8_UINT() into the staging
>    buffer that is passed back to glReadPixels().
>
> 3. unpack_uint_z_Z24_UNORM_X8_UINT() expects to unpack values that are
>    packed according to Z24_UNORM_X8_UINT format.
>
> The combination of the above makes the values that are returned to the
> user erroneous, because the values inside the memory-mapped buffer are,
> in reality, in the packed form of X8_UINT_Z24_UNORM.
>
> llvmpipe/softpipe don't have this problem in big-endian because they
> call util_pack64_z_stencil() when doing the CLEAR operation, which is not
> a valid solution when a real GPU is doing that operation.
>
> This patch fix this problem by checking for these specific conditions
> when doing the map memory (r600_texture_transfer_map). In case the
> conditions match, the code will adjust the pipe format of the cbsurf
> before creating the surface, and later, when the unpack function will be
> called to copy the values, unpack_uint_z_X8_UINT_Z24_UNORM() will be
> called instead of unpack_uint_z_Z24_UNORM_X8_UINT.
>
> This patch fix gl-1.0-readpixsanity (check_depth and check_stencil).
>
> Signed-off-by: Oded Gabbay <[email protected]>
> Cc: "11.1 11.2" <[email protected]>
> ---
>  src/gallium/drivers/r600/r600_blit.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/src/gallium/drivers/r600/r600_blit.c 
> b/src/gallium/drivers/r600/r600_blit.c
> index c52d5a9..5cbc24f 100644
> --- a/src/gallium/drivers/r600/r600_blit.c
> +++ b/src/gallium/drivers/r600/r600_blit.c
> @@ -173,6 +173,13 @@ static void r600_blit_decompress_depth(struct 
> pipe_context *ctx,
>                                 zsurf = ctx->create_surface(ctx, 
> &texture->resource.b.b, &surf_tmpl);
>
>                                 surf_tmpl.format = 
> flushed_depth_texture->resource.b.b.format;
> +                               /* In BE machine, the GPU returns a swapped 
> result of the depth
> +                                * decompression, that doesn't comply with 
> gallium packed formats,
> +                                * so we need to adjust the format of cbsurf 
> */
> +                               if (R600_BIG_ENDIAN &&
> +                                                       surf_tmpl.format == 
> PIPE_FORMAT_Z24_UNORM_S8_UINT)
> +                                       surf_tmpl.format = 
> PIPE_FORMAT_S8_UINT_Z24_UNORM;
> +
>                                 cbsurf = ctx->create_surface(ctx,
>                                                 
> &flushed_depth_texture->resource.b.b, &surf_tmpl);
>
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to