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:
@@ -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).
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user