Mesa (gallium-0.2): Added new _mesa_clip_copytexsubimage() function to do avoid clipping down in the drivers.

Keith Whitwell keithw at kemper.freedesktop.org
Wed Sep 24 00:24:57 UTC 2008


Module: Mesa
Branch: gallium-0.2
Commit: 03bafd1f9fa000abdb794b2ae344a68840c83201
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=03bafd1f9fa000abdb794b2ae344a68840c83201

Author: Brian <brian.paul at tungstengraphics.com>
Date:   Wed Sep 26 17:03:11 2007 -0600

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)

---

 src/mesa/main/image.c    |   31 +++++++++++++++++++++++++++++++
 src/mesa/main/image.h    |    6 ++++++
 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 c09cd96..651ebe1 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 465665b..38e1374 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 c964d98..b0a2d6d 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:




More information about the mesa-commit mailing list