[Mesa-dev] [PATCH 1/3] mesa: Fix handling of glCopyBufferSubData() for src == dst.

Eric Anholt eric at anholt.net
Fri Jan 27 00:01:06 PST 2012


On Thu, 26 Jan 2012 13:58:43 -0800, Ian Romanick <idr at freedesktop.org> wrote:
> On 01/25/2012 05:51 PM, Eric Anholt wrote:
> > Fixes piglit ARB_copy_buffer-overlap, which previously assertion failed.
> 
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> 
> One other orthogonal question below...
> 
> > ---
> >   src/mesa/main/bufferobj.c |   25 +++++++++++++++++++------
> >   1 files changed, 19 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> > index 5b6db78..e4f964f 100644
> > --- a/src/mesa/main/bufferobj.c
> > +++ b/src/mesa/main/bufferobj.c
> > @@ -526,11 +526,23 @@ _mesa_copy_buffer_subdata(struct gl_context *ctx,
> >      assert(!_mesa_bufferobj_mapped(src));
> >      assert(!_mesa_bufferobj_mapped(dst));
> >
> > -   srcPtr = ctx->Driver.MapBufferRange(ctx, readOffset, size,
> > -                                       GL_MAP_READ_BIT, src);
> > -   dstPtr = ctx->Driver.MapBufferRange(ctx, writeOffset, size,
> > -                                       (GL_MAP_WRITE_BIT |
> > -                                        GL_MAP_INVALIDATE_RANGE_BIT), dst);
> > +   if (src == dst) {
> > +      srcPtr = dstPtr = ctx->Driver.MapBufferRange(ctx, 0, src->Size,
> > +						   GL_MAP_READ_BIT |
> > +						   GL_MAP_WRITE_BIT, src);
> > +
> > +      if (!srcPtr)
> > +	 return;
> > +
> > +      srcPtr += readOffset;
> > +      dstPtr += writeOffset;
> > +   } else {
> > +      srcPtr = ctx->Driver.MapBufferRange(ctx, readOffset, size,
> > +					  GL_MAP_READ_BIT, src);
> > +      dstPtr = ctx->Driver.MapBufferRange(ctx, writeOffset, size,
> > +					  (GL_MAP_WRITE_BIT |
> > +					   GL_MAP_INVALIDATE_RANGE_BIT), dst);
> > +   }
> >
> >      /* Note: the src and dst regions will never overlap.  Trying to do so
> >       * would generate GL_INVALID_VALUE earlier.
> 
> So we have a test for the assertion in this comment?  That's the only 
> case that concerns me in this code.

Piglit ARB_copy_buffer/overlap is quite thorough: for a buffer of size 6
(arbitrary small number), per usage, try every
overlapping/non-overlapping copy, and make sure the right thing happens.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120127/915b537c/attachment.pgp>


More information about the mesa-dev mailing list