[Mesa-dev] [PATCH 3/4] common: Fix PBOs for 1D_ARRAY.
Laura Ekstrand
laura at jlekstrand.net
Wed Feb 25 17:33:01 PST 2015
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/a055b1cf/attachment-0001.html>
More information about the mesa-dev
mailing list