[Mesa-dev] [PATCH 2/2] st/mesa: fix texture image resource selection in st_render_texture()

Brian Paul brianp at vmware.com
Sun Jul 2 14:58:57 UTC 2017


On 07/01/2017 04:56 AM, Nicolai Hähnle wrote:
> On 29.06.2017 00:12, Brian Paul wrote:
>> If we're rendering to an incomplete/inconsistent (cube) texture, the
>> different faces/levels of the texture may be stored in different
>> resources.  Before, we always used the texture object resource.  Now,
>> we use the texture image resource.  In normal circumstances, that's
>> the same resource.  But in some cases, such as the Piglit
>> fbo-incomplete-texture-03 test, the cube faces are in different
>> resources and we need to render to the texture image resource.
>>
>> Fixes fbo-incomplete-texture-03 with VMware driver.
>> ---
>>   src/mesa/state_tracker/st_cb_fbo.c | 19 ++++++++++++++++++-
>>   1 file changed, 18 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/mesa/state_tracker/st_cb_fbo.c
>> b/src/mesa/state_tracker/st_cb_fbo.c
>> index 2559c23..a4d710c 100644
>> --- a/src/mesa/state_tracker/st_cb_fbo.c
>> +++ b/src/mesa/state_tracker/st_cb_fbo.c
>> @@ -470,6 +470,21 @@ st_update_renderbuffer_surface(struct st_context
>> *st,
>>      strb->surface = *psurf;
>>   }
>> +
>> +/**
>> + * Return the pipe_resource which stores a particular texture image.
>> + */
>> +static struct pipe_resource *
>> +get_teximage_resource(struct gl_texture_object *texObj,
>> +                      unsigned face, unsigned level)
>> +{
>> +   struct st_texture_image *stImg =
>> +      st_texture_image(texObj->Image[face][level]);
>> +
>> +   return stImg->pt;
>> +}
>> +
>> +
>>   /**
>>    * Called by ctx->Driver.RenderTexture
>>    */
>> @@ -487,7 +502,9 @@ st_render_texture(struct gl_context *ctx,
>>      if (!st_finalize_texture(ctx, pipe, att->Texture, att->CubeMapFace))
>>         return;
>> -   pt = st_get_texobj_resource(att->Texture);
>> +   pt = get_teximage_resource(att->Texture,
>> +                              att->CubeMapFace,
>> +                              att->TextureLevel);
>
> When st_AllocTextureImageBuffer allocates a pipe resource for a "loose"
> image, it allocates a single level, even if the image is not a mip level
> 0. So I wonder if we need to adjust the level selection in the
> pipe_surface somehow. Is this covered by the incomplete texture tests?

I think we're good.  In st_update_renderbuffer_surface() we actually 
search the resources's mipmap levels to find the one that matches the 
expected surface size.

-Brian



More information about the mesa-dev mailing list