mesa: handle glDrawPixels images which are larger than max rect texture size

This commit is contained in:
Brian Paul 2009-08-11 19:30:05 -06:00
parent dba6d52ba0
commit fd90d8000c
1 changed files with 47 additions and 3 deletions

View File

@ -1047,6 +1047,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.
@ -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:
*/