<p dir="ltr">Note that the DB only supports tiling and separate depth and stencil, so it's unmappable. Before transfers and sometimes even texturing, the buffer must be copied via the DB->CB path, because CB supports both interleaved and linear layouts. The result is the flushed texture. The goal here is to ensure the flushed texture uses the correct format.</p>
<p dir="ltr">Marek</p>
<div class="gmail_quote">On Mar 4, 2016 12:20 PM, "Oded Gabbay" <<a href="mailto:oded.gabbay@gmail.com">oded.gabbay@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, Mar 4, 2016 at 12:16 PM, Marek Olšák <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br>
> I think this is not the right place to do this. It looks like<br>
> r600_translate_colorformat and/or r600_colorformat_endian_swap and<br>
> r600_translate_texformat should be adjusted instead.<br>
><br>
> Marek<br>
<br>
Adjusted how ?<br>
You want me to check specifically for this format there ?<br>
I'll take a look if it can be done and I'll get back to you.<br>
<br>
Oded<br>
<br>
><br>
> On Thu, Mar 3, 2016 at 4:47 PM, Oded Gabbay <<a href="mailto:oded.gabbay@gmail.com">oded.gabbay@gmail.com</a>> wrote:<br>
>> The following is what happens when trying to do glReadPixels() with<br>
>> GL_DEPTH_COMPONENT:<br>
>><br>
>> 1. When decompressing depth in BE, the GPU performs a swap of the depth<br>
>>    value when it is written to the memory-mapped buffer.<br>
>><br>
>> 2. When the pipe format is PIPE_FORMAT_Z24_UNORM_S8_UINT, the values<br>
>>    are unpakeded using unpack_uint_z_Z24_UNORM_X8_UINT() into the staging<br>
>>    buffer that is passed back to glReadPixels().<br>
>><br>
>> 3. unpack_uint_z_Z24_UNORM_X8_UINT() expects to unpack values that are<br>
>>    packed according to Z24_UNORM_X8_UINT format.<br>
>><br>
>> The combination of the above makes the values that are returned to the<br>
>> user erroneous, because the values inside the memory-mapped buffer are,<br>
>> in reality, in the packed form of X8_UINT_Z24_UNORM.<br>
>><br>
>> llvmpipe/softpipe don't have this problem in big-endian because they<br>
>> call util_pack64_z_stencil() when doing the CLEAR operation, which is not<br>
>> a valid solution when a real GPU is doing that operation.<br>
>><br>
>> This patch fix this problem by checking for these specific conditions<br>
>> when doing the map memory (r600_texture_transfer_map). In case the<br>
>> conditions match, the code will adjust the pipe format of the cbsurf<br>
>> before creating the surface, and later, when the unpack function will be<br>
>> called to copy the values, unpack_uint_z_X8_UINT_Z24_UNORM() will be<br>
>> called instead of unpack_uint_z_Z24_UNORM_X8_UINT.<br>
>><br>
>> This patch fix gl-1.0-readpixsanity (check_depth and check_stencil).<br>
>><br>
>> Signed-off-by: Oded Gabbay <<a href="mailto:oded.gabbay@gmail.com">oded.gabbay@gmail.com</a>><br>
>> Cc: "11.1 11.2" <<a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.org</a>><br>
>> ---<br>
>>  src/gallium/drivers/r600/r600_blit.c | 7 +++++++<br>
>>  1 file changed, 7 insertions(+)<br>
>><br>
>> diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c<br>
>> index c52d5a9..5cbc24f 100644<br>
>> --- a/src/gallium/drivers/r600/r600_blit.c<br>
>> +++ b/src/gallium/drivers/r600/r600_blit.c<br>
>> @@ -173,6 +173,13 @@ static void r600_blit_decompress_depth(struct pipe_context *ctx,<br>
>>                                 zsurf = ctx->create_surface(ctx, &texture->resource.b.b, &surf_tmpl);<br>
>><br>
>>                                 surf_tmpl.format = flushed_depth_texture->resource.b.b.format;<br>
>> +                               /* In BE machine, the GPU returns a swapped result of the depth<br>
>> +                                * decompression, that doesn't comply with gallium packed formats,<br>
>> +                                * so we need to adjust the format of cbsurf */<br>
>> +                               if (R600_BIG_ENDIAN &&<br>
>> +                                                       surf_tmpl.format == PIPE_FORMAT_Z24_UNORM_S8_UINT)<br>
>> +                                       surf_tmpl.format = PIPE_FORMAT_S8_UINT_Z24_UNORM;<br>
>> +<br>
>>                                 cbsurf = ctx->create_surface(ctx,<br>
>>                                                 &flushed_depth_texture->resource.b.b, &surf_tmpl);<br>
>><br>
>> --<br>
>> 2.5.0<br>
>><br>
>> _______________________________________________<br>
>> mesa-dev mailing list<br>
>> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
>> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>