[Mesa-dev] [PATCH v3] meta/GetTexSubImage: Account for GL_PACK_SKIP_IMAGES on compressed textures

Eduardo Lima Mitev elima at igalia.com
Tue Nov 15 11:25:33 UTC 2016


On 11/15/2016 11:03 AM, Nicolai Hähnle wrote:
> On 15.11.2016 09:27, Eduardo Lima Mitev wrote:
>> On 11/15/2016 12:25 AM, Kenneth Graunke wrote:
>>> From: Eduardo Lima Mitev <elima at igalia.com>
>>>
>>> This option was being ignored when packing compressed 3D and cube
>>> textures.
>>>
>>> Fixes CTS test (on gen8+):
>>> * GL45-CTS.gtf32.GL3Tests.packed_pixels.packed_pixels_pixelstore
>>>
>>> v2: Drop API checks.
>>> v3 (Ken): Just apply the existing code in more cases.
>>> ---
>>>  src/mesa/drivers/common/meta.c | 20 +++++++++++++++++---
>>>  1 file changed, 17 insertions(+), 3 deletions(-)
>>>
>>> Hey Eduardo,
>>>
>>> It looks like the existing code already tries to handle SkipImages - but
>>> we weren't applying it for 3D and cubemap textures.  I found a spec
>>> quote
>>> in the narrative for GetTexImage that indicates we need to do it for
>>> those
>>> as well.
>>>
>>> What do you think of this version?  I preserved your authorship as I
>>> wanted
>>> you to get the credit for this bugfix - I just typed it up so that I
>>> could
>>> make sure it actually fixed the test, and since I had it typed up, I
>>> figured
>>> I'd send it out to save you some time...
>>>
>>
>> Hi Kenneth,
>>
>> Great, this is the correct solution. I tried to make my original patch
>> work with _mesa_image_address3d() for all targets, as yours, but I
>> missed resetting SkipPixels and SkipRows for TEXTURE_3D, so it was
>> regressing some subcases.
> 
> For what it's worth, there's also _mesa_image_address which takes a
> dimensions parameter and automatically applies / doesn't apply
> SkipImages. But since you do manual fixups of SkipPixels/SkipRows
> anyway, it might not be the right thing here.
>

Yes, we could use _mesa_image_address() directly, but I think it is more
legible to call mesa_image_address3d(), because it is consistent with
the purpose of this code-path and the comment in it, being for
dimensions >2.

Thanks,
Eduardo

> Cheers,
> Nicolai
> 
>>
>> Patch is:
>>
>> Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>
>>
>> I don't mind you taking authorship. Knowing the correct solution is way
>> more useful to me :). If you want, take the authorship, put my R-b and
>> push; otherwise let me know and I'll put your R-b and push it myself.
>>
>> Thanks!
>>
>> Eduardo
>>
>>>  --Ken
>>>
>>> diff --git a/src/mesa/drivers/common/meta.c
>>> b/src/mesa/drivers/common/meta.c
>>> index 5ab1e6c..99c85cf 100644
>>> --- a/src/mesa/drivers/common/meta.c
>>> +++ b/src/mesa/drivers/common/meta.c
>>> @@ -3243,8 +3243,20 @@ _mesa_meta_GetTexSubImage(struct gl_context *ctx,
>>>
>>>        for (slice = 0; slice < depth; slice++) {
>>>           void *dst;
>>> -         if (texImage->TexObject->Target == GL_TEXTURE_2D_ARRAY
>>> -             || texImage->TexObject->Target ==
>>> GL_TEXTURE_CUBE_MAP_ARRAY) {
>>> +         /* Section 8.11.4 (Texture Image Queries) of the GL 4.5 spec
>>> says:
>>> +          *
>>> +          *    "For three-dimensional, two-dimensional array, cube
>>> map array,
>>> +          *     and cube map textures pixel storage operations are
>>> applied as
>>> +          *     if the image were two-dimensional, except that the
>>> additional
>>> +          *     pixel storage state values PACK_IMAGE_HEIGHT and
>>> +          *     PACK_SKIP_IMAGES are applied. The correspondence of
>>> texels to
>>> +          *     memory locations is as defined for TexImage3D in
>>> section 8.5."
>>> +          */
>>> +         switch (texImage->TexObject->Target) {
>>> +         case GL_TEXTURE_3D:
>>> +         case GL_TEXTURE_2D_ARRAY:
>>> +         case GL_TEXTURE_CUBE_MAP:
>>> +         case GL_TEXTURE_CUBE_MAP_ARRAY: {
>>>              /* Setup pixel packing.  SkipPixels and SkipRows will be
>>> applied
>>>               * in the decompress_texture_image() function's call to
>>>               * glReadPixels but we need to compute the dest slice's
>>> address
>>> @@ -3255,9 +3267,11 @@ _mesa_meta_GetTexSubImage(struct gl_context *ctx,
>>>              packing.SkipRows = 0;
>>>              dst = _mesa_image_address3d(&packing, pixels, width,
>>> height,
>>>                                          format, type, slice, 0, 0);
>>> +            break;
>>>           }
>>> -         else {
>>> +         default:
>>>              dst = pixels;
>>> +            break;
>>>           }
>>>           result = decompress_texture_image(ctx, texImage, slice,
>>>                                             xoffset, yoffset, width,
>>> height,
>>>
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 



More information about the mesa-dev mailing list