diff options
author | Brian Paul <brianp@vmware.com> | 2009-08-11 19:30:05 -0600 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2009-08-11 20:34:22 -0600 |
commit | fd90d8000c163498646857b19ef715de3a585f9c (patch) | |
tree | e571b3bb01132fed3caf1d1a21ae32d0118f4621 /src/mesa/drivers/common | |
parent | dba6d52ba060246fbe04e4aa0875eb1efc53b1ab (diff) |
mesa: handle glDrawPixels images which are larger than max rect texture size
Diffstat (limited to 'src/mesa/drivers/common')
-rw-r--r-- | src/mesa/drivers/common/meta.c | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 79e93d648b..a8db686573 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -1048,6 +1048,42 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY, /** + * When the glDrawPixels() image size is greater than the max rectangle + * texture size we use this function to break the glDrawPixels() image + * into tiles which fit into the max texture size. + */ +static void +tiled_draw_pixels(GLcontext *ctx, + GLint x, GLint y, GLsizei width, GLsizei height, + GLenum format, GLenum type, + const struct gl_pixelstore_attrib *unpack, + const GLvoid *pixels) +{ + const GLint maxSize = ctx->Const.MaxTextureRectSize; + struct gl_pixelstore_attrib tileUnpack = *unpack; + GLint i, j; + + for (i = 0; i < width; i += maxSize) { + const GLint tileWidth = MIN2(maxSize, width - i); + const GLint tileX = (GLint) (x + i * ctx->Pixel.ZoomX); + + tileUnpack.SkipPixels = unpack->SkipPixels + i; + + for (j = 0; j < height; j += maxSize) { + const GLint tileHeight = MIN2(maxSize, height - j); + const GLint tileY = (GLint) (y + j * ctx->Pixel.ZoomY); + + tileUnpack.SkipRows = unpack->SkipRows + j; + + _mesa_meta_draw_pixels(ctx, tileX, tileY, + tileWidth, tileHeight, + format, type, &tileUnpack, pixels); + } + } +} + + +/** * Meta implementation of ctx->Driver.DrawPixels() in terms * of texture mapping and polygon rendering. * Note: this function requires GL_ARB_texture_rectangle support. @@ -1075,9 +1111,7 @@ _mesa_meta_draw_pixels(GLcontext *ctx, */ fallback = GL_FALSE; if (ctx->_ImageTransferState || - ctx->Fog.Enabled || - width > ctx->Const.MaxTextureRectSize || - height > ctx->Const.MaxTextureRectSize) { + ctx->Fog.Enabled) { fallback = GL_TRUE; } @@ -1094,6 +1128,16 @@ _mesa_meta_draw_pixels(GLcontext *ctx, return; } + /* + * Check image size against max texture size, draw as tiles if needed. + */ + if (width > ctx->Const.MaxTextureRectSize || + height > ctx->Const.MaxTextureRectSize) { + tiled_draw_pixels(ctx, x, y, width, height, + format, type, unpack, pixels); + return; + } + /* Most GL state applies to glDrawPixels, but a there's a few things * we need to override: */ |