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 324ecadbfd)
This commit is contained in:
Brian
2007-09-26 17:03:11 -06:00
committed by Keith Whitwell
parent a97226352f
commit 03bafd1f9f
3 changed files with 60 additions and 7 deletions
+31
View File
@@ -5102,6 +5102,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).
+6
View File
@@ -269,6 +269,12 @@ _mesa_clip_readpixels(const GLcontext *ctx,
GLsizei *width, GLsizei *height,
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,
+23 -7
View File
@@ -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: