[Mesa-dev] [PATCH 04/14] meta: Create temporary pbo in _mesa_meta_pbo_GetTexSubImage()

Jason Ekstrand jason at jlekstrand.net
Tue Feb 24 21:01:10 PST 2015


On Tue, Feb 24, 2015 at 7:01 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:

> On Tue, Feb 24, 2015 at 8:31 AM, Neil Roberts <neil at linux.intel.com>
> wrote:
> > Anuj Phogat <anuj.phogat at gmail.com> writes:
> >
> >> using a flag passed in as function parameter. This will enable
> >> _mesa_meta_pbo_GetTexSubImage to be used for reading in to
> >> non-pbo buffers.
> >>
> >> This will be useful to support reading from YF/YS tiled surfaces
> >> in Skylake.
> >>
> >> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> >> ---
> >>  src/mesa/drivers/common/meta.h               |  1 +
> >>  src/mesa/drivers/common/meta_tex_subimage.c  | 18 ++++++++++++++++--
> >>  src/mesa/drivers/dri/i965/intel_pixel_read.c |  9 ++++-----
> >>  src/mesa/drivers/dri/i965/intel_tex_image.c  |  3 ++-
> >>  4 files changed, 23 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/src/mesa/drivers/common/meta.h
> b/src/mesa/drivers/common/meta.h
> >> index e7d894d..3de0d87 100644
> >> --- a/src/mesa/drivers/common/meta.h
> >> +++ b/src/mesa/drivers/common/meta.h
> >> @@ -542,6 +542,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context
> *ctx, GLuint dims,
> >>                                int xoffset, int yoffset, int zoffset,
> >>                                int width, int height, int depth,
> >>                                GLenum format, GLenum type, const void
> *pixels,
> >> +                              bool create_pbo,
> >>                                const struct gl_pixelstore_attrib
> *packing);
> >>
> >>  extern void
> >> diff --git a/src/mesa/drivers/common/meta_tex_subimage.c
> b/src/mesa/drivers/common/meta_tex_subimage.c
> >> index 68c8273..cd87a72 100644
> >> --- a/src/mesa/drivers/common/meta_tex_subimage.c
> >> +++ b/src/mesa/drivers/common/meta_tex_subimage.c
> >> @@ -34,6 +34,7 @@
> >>  #include "macros.h"
> >>  #include "meta.h"
> >>  #include "pbo.h"
> >> +#include "readpix.h"
> >>  #include "shaderapi.h"
> >>  #include "state.h"
> >>  #include "teximage.h"
> >> @@ -246,6 +247,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context
> *ctx, GLuint dims,
> >>                                int xoffset, int yoffset, int zoffset,
> >>                                int width, int height, int depth,
> >>                                GLenum format, GLenum type, const void
> *pixels,
> >> +                              bool create_pbo,
> >>                                const struct gl_pixelstore_attrib
> *packing)
> >>  {
> >>     GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };
> >> @@ -257,7 +259,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context
> *ctx, GLuint dims,
> >>     /* XXX: This should probably be passed in from somewhere */
> >>     const char *where = "_mesa_meta_pbo_GetTexSubImage";
> >>
> >> -   if (!_mesa_is_bufferobj(packing->BufferObj))
> >> +   if (!_mesa_is_bufferobj(packing->BufferObj) && !create_pbo)
> >>        return false;
> >>
> >>     if (format == GL_DEPTH_COMPONENT ||
> >> @@ -282,7 +284,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context
> *ctx, GLuint dims,
> >>        return true;
> >>     }
> >>
> >> -   pbo_tex_image = create_texture_for_pbo(ctx, false,
> GL_PIXEL_PACK_BUFFER,
> >> +   pbo_tex_image = create_texture_for_pbo(ctx, create_pbo,
> GL_PIXEL_PACK_BUFFER,
> >>                                            width, height, depth,
> >>                                            format, type, pixels,
> packing,
> >>                                            &pbo, &pbo_tex);
> >> @@ -348,6 +350,18 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context
> *ctx, GLuint dims,
> >>                                   GL_COLOR_BUFFER_BIT, GL_NEAREST);
> >>     }
> >>
> >> +   /* If we created a temporary pbo in meta to read the pixel data,
> that
> >> +    * data will now get copied to memory allocated by client.
> >> +    */
> >> +   if (create_pbo) {
> >
> > I think this should be changed to something like the below:
> >
> >  if (create_pbo && !_mesa_is_bufferobj(packing->BufferObj))
> >
> > It looks like the meaning of create_pbo in create_texture_for_pbo is
> > ‘create pbo unless there is already a pbo’. With this patch
> > _mesa_meta_pbo_GetTexSubImage seems to interpret it to mean that it will
> > always create the pbo and if there already was a pbo it would end up
> > clobbering the state.
> >
> I agree. I will make this change.
> >> +      /* Unbind the pbo from pack binding. */
> >> +      _mesa_BindBuffer(GL_PIXEL_PACK_BUFFER, 0);
> >
> > I don't think this unbind is necessary. create_texture_for_pbo is
> > careful not to modify the PBO binding state and once that function is
> > finished the PBO is only accessed via the texture so we shouldn't need
> > to touch the PBO binding.
> >
> >> +      _mesa_BindFramebuffer(GL_READ_FRAMEBUFFER, fbos[1]);
> >> +      _mesa_update_state(ctx);
> >> +      _mesa_readpixels(ctx, 0, 0, width, height, format, type,
> >> +                       packing, (void *) pixels);
> >
> > Doesn't this only read the last slice of the texture? Maybe this patch
> > should wait until this patch from Laura Ekstrand is landed:
> >
> > http://lists.freedesktop.org/archives/mesa-dev/2015-February/077487.html
> >
> I'll hold this patch until her changes land and send out a v2.
>

The biggest of her changes were pushed this afternoon.  Go ahead and rebase.


> > Regards,
> > - Neil
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150224/4c548596/attachment-0001.html>


More information about the mesa-dev mailing list