[Mesa-dev] [PATCH 1/2] st/mesa: directly compute level=0 texture size in st_finalize_texture

Nicolai Hähnle nhaehnle at gmail.com
Tue Jun 7 22:58:04 UTC 2016


On 08.06.2016 00:20, Brian Paul wrote:
> I took a stab at fixing this too.  My raw patch is attached below.  Very
> little testing.

Something like that would probably cover most bases, except that a 
program that just uploads a base level=2 image of size 1x1 will still be 
screwed.

I ended up not changing the semantics of guess_base_level_size because 
of how that function is used via st_AllocTextureImageBuffer: when we see 
a rectangular image of size Nx1, there's no way to know whether level=0 
should be (N << l)x1 or (N << l)x(1 << l) or anything in between, so why 
guess. IMHO, the use cases of st_AllocTextureImageBuffer and 
st_finalize_texture are just conceptually different.

Nicolai

>
> -Brian
>
> On 06/07/2016 04:06 PM, Nicolai Hähnle wrote:
>> Scratch that, there's a good reason to try to preserve the previous
>> texture size... working on yet another alternative.
>>
>> On 07.06.2016 23:19, Nicolai Hähnle wrote:
>>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>>
>>> The width0/height0/depth0 on stObj may not have been set at this point.
>>> Observed in a trace that set up levels 2..9 of a 2d texture, and set
>>> the base
>>> level to 2, with height 1. This made the guess logic always bail.
>>>
>>> Originally investigated by Ilia Mirkin, this patch makes sure we
>>> always get a
>>> pipe texture whose level=0 dimensions are compatible with the base
>>> level image
>>> of the texture.
>>>
>>> Fixes the gl-1.2-texture-base-level piglit test provided by Brian Paul.
>>>
>>> Cc: "12.0" <mesa-stable at lists.freedesktop.org>
>>> ---
>>>   src/mesa/state_tracker/st_cb_texture.c | 31
>>> +++++++++++++++----------------
>>>   1 file changed, 15 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/src/mesa/state_tracker/st_cb_texture.c
>>> b/src/mesa/state_tracker/st_cb_texture.c
>>> index 44e21b1..1604993 100644
>>> --- a/src/mesa/state_tracker/st_cb_texture.c
>>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>>> @@ -2478,22 +2478,21 @@ st_finalize_texture(struct gl_context *ctx,
>>>      /* Find size of level=0 Gallium mipmap image, plus number of
>>> texture layers */
>>>      {
>>>         GLuint width, height, depth;
>>> -      if (!guess_base_level_size(stObj->base.Target,
>>> -                                 firstImage->base.Width2,
>>> -                                 firstImage->base.Height2,
>>> -                                 firstImage->base.Depth2,
>>> -                                 firstImage->base.Level,
>>> -                                 &width, &height, &depth)) {
>>> -         width = stObj->width0;
>>> -         height = stObj->height0;
>>> -         depth = stObj->depth0;
>>> -      } else {
>>> -         /* The width/height/depth may have been previously reset in
>>> -          * guess_and_alloc_texture. */
>>> -         stObj->width0 = width;
>>> -         stObj->height0 = height;
>>> -         stObj->depth0 = depth;
>>> -      }
>>> +
>>> +      width = firstImage->base.Width2;
>>> +      if (width > 1)
>>> +         width <<= firstImage->base.Level;
>>> +      height = firstImage->base.Height2;
>>> +      if (stObj->base.Target != GL_TEXTURE_1D_ARRAY && height > 1)
>>> +         height <<= firstImage->base.Level;
>>> +      depth = firstImage->base.Depth2;
>>> +      if (stObj->base.Target == GL_TEXTURE_3D && depth > 1)
>>> +         depth <<= firstImage->base.Level;
>>> +
>>> +      stObj->width0 = width;
>>> +      stObj->height0 = height;
>>> +      stObj->depth0 = depth;
>>> +
>>>         /* convert GL dims to Gallium dims */
>>>         st_gl_texture_dims_to_pipe_dims(stObj->base.Target, width,
>>> height, depth,
>>>                                         &ptWidth, &ptHeight, &ptDepth,
>>> &ptLayers);
>>>
>> _______________________________________________
>> 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