[Mesa-dev] [PATCH 3/4] common: Fix PBOs for 1D_ARRAY.

Laura Ekstrand laura at jlekstrand.net
Wed Feb 25 17:48:33 PST 2015


Ah, now that I looked at your other patch I see why you have image_height.

On Wed, Feb 25, 2015 at 5:33 PM, Laura Ekstrand <laura at jlekstrand.net>
wrote:

> This was an unfortunate artifact of rebasing; I fixed the 1D array bug
> before figuring out a robust fix for the 2D array bug (7a49f2e).  I think
> that you are right, although I'm confused what you are doing with the
> variable image_height that you added.  It seems like you should be able to
> get rid of image_height here. (But that's just a quick gut feeling.)
>
> On Wed, Feb 25, 2015 at 8:19 AM, Neil Roberts <neil at linux.intel.com>
> wrote:
>
>> Sorry for the late review.
>>
>> Can you explain what this patch does? The previous code was doing a blit
>> like this:
>>
>>       _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
>>                                  0, z * height, width, (z + 1) * height,
>>                                  xoffset, yoffset,
>>                                  xoffset + width, yoffset + height,
>>                                  GL_COLOR_BUFFER_BIT, GL_NEAREST);
>>
>> However, it was first setting the height to 1 so that would end up like
>> this:
>>
>>       _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
>>                                  0, z * 1, width, (z + 1) * 1,
>>                                  xoffset, yoffset,
>>                                  xoffset + width, yoffset + 1,
>>                                  GL_COLOR_BUFFER_BIT, GL_NEAREST);
>>
>> The patch makes it do this:
>>
>>          _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
>>                                     0, z, width, z + 1,
>>                                     xoffset, yoffset,
>>                                     xoffset + width, yoffset + 1,
>>                                     GL_COLOR_BUFFER_BIT, GL_NEAREST);
>>
>> This looks like it would have exactly the same result.
>>
>> The patch doesn't modify the blit call for slice 0 which looks wrong to
>> me.
>>
>> Neither the version with or without the patch appears to handle the
>> yoffset correctly because for the 1D array case this needs to be
>> interpreted as a slice offset.
>>
>> I'm attaching a patch which I think fixes it, although I haven't managed
>> to test it with the arb_direct_state_access/gettextureimage-targets test
>> so I don't know if I'm misunderstanding something. It is also not
>> complete because it doesn't touch GetTexSubImage. I have tested it with
>> the texsubimage test which does use the yoffset, but in order to use
>> that test the code path first needs to be able to accept the
>> IMAGE_HEIGHT packing option which I will also post a patch for.
>>
>> Regards,
>> - Neil
>>
>> ------- >8 --------------- (use git am --scissors to automatically chop
>> here)
>> Subject: meta: Fix the y offset for 1D_ARRAY in _mesa_meta_pbo_TexSubImage
>>
>> This partially reverts 546aba143d13ba3f99 and brings back the if
>> statement to move the height over to the depth. However it
>> additionally moves the yoffset to the zoffset. This fixes texsubimage
>> array pbo for 1D_ARRAY textures.
>>
>> The previous fix in 546aba143 wasn't taking into account the yoffset
>> correctly because it needs to be used to alter the selected layer.
>> ---
>>  src/mesa/drivers/common/meta_tex_subimage.c | 36
>> ++++++++++++++---------------
>>  1 file changed, 18 insertions(+), 18 deletions(-)
>>
>> diff --git a/src/mesa/drivers/common/meta_tex_subimage.c
>> b/src/mesa/drivers/common/meta_tex_subimage.c
>> index 3965d31..be89102 100644
>> --- a/src/mesa/drivers/common/meta_tex_subimage.c
>> +++ b/src/mesa/drivers/common/meta_tex_subimage.c
>> @@ -138,7 +138,7 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx,
>> GLuint dims,
>>     struct gl_texture_image *pbo_tex_image;
>>     GLenum status;
>>     bool success = false;
>> -   int z, iters;
>> +   int z;
>>
>>     /* XXX: This should probably be passed in from somewhere */
>>     const char *where = "_mesa_meta_pbo_TexSubImage";
>> @@ -193,6 +193,16 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx,
>> GLuint dims,
>>     _mesa_BindFramebuffer(GL_READ_FRAMEBUFFER, fbos[0]);
>>     _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, fbos[1]);
>>
>> +   if (tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY) {
>> +      assert(depth == 1);
>> +      assert(zoffset == 0);
>> +      depth = height;
>> +      height = 1;
>> +      image_height = 1;
>> +      zoffset = yoffset;
>> +      yoffset = 0;
>> +   }
>> +
>>     _mesa_meta_bind_fbo_image(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
>>                               pbo_tex_image, 0);
>>     /* If this passes on the first layer it should pass on the others */
>> @@ -216,28 +226,18 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx,
>> GLuint dims,
>>                                    GL_COLOR_BUFFER_BIT, GL_NEAREST))
>>        goto fail;
>>
>> -   iters = tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY ?
>> -           height : depth;
>> -
>> -   for (z = 1; z < iters; z++) {
>> +   for (z = 1; z < depth; z++) {
>>        _mesa_meta_bind_fbo_image(GL_DRAW_FRAMEBUFFER,
>> GL_COLOR_ATTACHMENT0,
>>                                  tex_image, zoffset + z);
>>
>>        _mesa_update_state(ctx);
>>
>> -      if (tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY)
>> -         _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer,
>> ctx->DrawBuffer,
>> -                                    0, z, width, z + 1,
>> -                                    xoffset, yoffset,
>> -                                    xoffset + width, yoffset + 1,
>> -                                    GL_COLOR_BUFFER_BIT, GL_NEAREST);
>> -      else
>> -         _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer,
>> ctx->DrawBuffer,
>> -                                    0, z * image_height,
>> -                                    width, z * image_height + height,
>> -                                    xoffset, yoffset,
>> -                                    xoffset + width, yoffset + height,
>> -                                    GL_COLOR_BUFFER_BIT, GL_NEAREST);
>> +      _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
>> +                                 0, z * image_height,
>> +                                 width, z * image_height + height,
>> +                                 xoffset, yoffset,
>> +                                 xoffset + width, yoffset + height,
>> +                                 GL_COLOR_BUFFER_BIT, GL_NEAREST);
>>     }
>>
>>     success = true;
>> --
>> 1.9.3
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150225/9136891a/attachment.html>


More information about the mesa-dev mailing list