diff options
| author | Brian <brian.paul@tungstengraphics.com> | 2007-09-26 17:03:11 -0600 | 
|---|---|---|
| committer | Keith Whitwell <keith@tungstengraphics.com> | 2008-09-23 16:59:56 -0700 | 
| commit | 03bafd1f9fa000abdb794b2ae344a68840c83201 (patch) | |
| tree | bb590699fa0aedde46bdc22f7a891694b43c2561 | |
| parent | a97226352fb8063d4d0084523312b4880dae5ac7 (diff) | |
Added new _mesa_clip_copytexsubimage() function to do avoid clipping down in the drivers.
This should probably be pulled into main-line Mesa...
(cherry picked from commit 324ecadbfdf9b944e059832f146451e4151dcb21)
| -rw-r--r-- | src/mesa/main/image.c | 31 | ||||
| -rw-r--r-- | src/mesa/main/image.h | 6 | ||||
| -rw-r--r-- | src/mesa/main/teximage.c | 30 | 
3 files changed, 60 insertions, 7 deletions
| diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index c09cd967cb..651ebe1b7c 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -5103,6 +5103,37 @@ _mesa_clip_readpixels(const GLcontext *ctx,  /** + * Do clipping for a glCopyTexSubImage call. + * The framebuffer source region might extend outside the framebuffer + * bounds.  Clip the source region against the framebuffer bounds and + * adjust the texture/dest position and size accordingly. + * + * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise. + */ +GLboolean +_mesa_clip_copytexsubimage(const GLcontext *ctx, +                           GLint *destX, GLint *destY, +                           GLint *srcX, GLint *srcY, +                           GLsizei *width, GLsizei *height) +{ +   const struct gl_framebuffer *fb = ctx->ReadBuffer; +   const GLint srcX0 = *srcX, srcY0 = *srcY; + +   if (_mesa_clip_to_region(fb->_Xmin, fb->_Ymin, fb->_Xmax, fb->_Ymax, +                            srcX, srcY, width, height)) { +      *destX = *destX + *srcX - srcX0; +      *destY = *destY + *srcY - srcY0; + +      return GL_TRUE; +   } +   else { +      return GL_FALSE; +   } +} + + + +/**   * Clip the rectangle defined by (x, y, width, height) against the bounds   * specified by [xmin, xmax) and [ymin, ymax).   * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise. diff --git a/src/mesa/main/image.h b/src/mesa/main/image.h index 465665b073..38e1374c20 100644 --- a/src/mesa/main/image.h +++ b/src/mesa/main/image.h @@ -270,6 +270,12 @@ _mesa_clip_readpixels(const GLcontext *ctx,                        struct gl_pixelstore_attrib *pack);  extern GLboolean +_mesa_clip_copytexsubimage(const GLcontext *ctx, +                           GLint *destX, GLint *destY, +                           GLint *srcX, GLint *srcY, +                           GLsizei *width, GLsizei *height); +                            +extern GLboolean  _mesa_clip_to_region(GLint xmin, GLint ymin,                       GLint xmax, GLint ymax,                       GLint *x, GLint *y, diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index c964d988c4..b0a2d6ddb3 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -3040,6 +3040,9 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,     struct gl_texture_object *texObj;     struct gl_texture_image *texImage;     GLsizei postConvWidth = width; +   GLint yoffset = 0; +   GLsizei height = 1; +     GET_CURRENT_CONTEXT(ctx);     ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -3071,8 +3074,13 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,        /* If we have a border, xoffset=-1 is legal.  Bias by border width */        xoffset += texImage->Border; -      ASSERT(ctx->Driver.CopyTexSubImage1D); -      (*ctx->Driver.CopyTexSubImage1D)(ctx, target, level, xoffset, x, y, width); +      if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, +                                     &width, &height)) { +         ASSERT(ctx->Driver.CopyTexSubImage1D); +         ctx->Driver.CopyTexSubImage1D(ctx, target, level, +                                       xoffset, x, y, width); +      } +        ctx->NewState |= _NEW_TEXTURE;     }   out: @@ -3119,10 +3127,14 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level,        /* If we have a border, xoffset=-1 is legal.  Bias by border width */        xoffset += texImage->Border;        yoffset += texImage->Border; -       -      ASSERT(ctx->Driver.CopyTexSubImage2D); -      (*ctx->Driver.CopyTexSubImage2D)(ctx, target, level, + +      if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, +                                     &width, &height)) { +         ASSERT(ctx->Driver.CopyTexSubImage2D); +         ctx->Driver.CopyTexSubImage2D(ctx, target, level,  				       xoffset, yoffset, x, y, width, height); +      } +        ctx->NewState |= _NEW_TEXTURE;     }   out: @@ -3172,10 +3184,14 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,        yoffset += texImage->Border;        zoffset += texImage->Border; -      ASSERT(ctx->Driver.CopyTexSubImage3D); -      (*ctx->Driver.CopyTexSubImage3D)(ctx, target, level, +      if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, +                                     &width, &height)) { +         ASSERT(ctx->Driver.CopyTexSubImage3D); +         ctx->Driver.CopyTexSubImage3D(ctx, target, level,  				       xoffset, yoffset, zoffset,  				       x, y, width, height); +      } +        ctx->NewState |= _NEW_TEXTURE;     }   out: | 
