diff options
author | Brian Paul <[email protected]> | 2006-10-12 23:17:02 +0000 |
---|---|---|
committer | Brian Paul <[email protected]> | 2006-10-12 23:17:02 +0000 |
commit | 76e778dce59aa6f290db50242df945943fc47b05 (patch) | |
tree | 07ad7bf3d7a54f49e86ff650fc7a9d4ce5d40338 /src/mesa/swrast/s_texstore.c | |
parent | 4bb9f4115c4b1930a140da78feff953e80f8a4f5 (diff) |
Lots of changes to support runtime renderbuffer depths.
_swrast_read_rgba_span() now takes a datatype parameter.
New optimization for glReadPixels(format=GL_RGB).
New glCopyPixels optimization for the simple, common cases.
Diffstat (limited to 'src/mesa/swrast/s_texstore.c')
-rw-r--r-- | src/mesa/swrast/s_texstore.c | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/src/mesa/swrast/s_texstore.c b/src/mesa/swrast/s_texstore.c index b018c5a4a63..ddaf7471f59 100644 --- a/src/mesa/swrast/s_texstore.c +++ b/src/mesa/swrast/s_texstore.c @@ -1,6 +1,6 @@ /* * Mesa 3-D graphics library - * Version: 6.5.1 + * Version: 6.5.2 * * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * @@ -52,33 +52,37 @@ #include "s_depth.h" #include "s_span.h" -/* + +/** * Read an RGBA image from the frame buffer. * This is used by glCopyTex[Sub]Image[12]D(). - * Input: ctx - the context - * x, y - lower left corner - * width, height - size of region to read - * Return: pointer to block of GL_RGBA, GLchan data. + * \param x window source x + * \param y window source y + * \param width image width + * \param height image height + * \param type datatype for returned GL_RGBA image + * \return pointer to image */ -static GLchan * -read_color_image( GLcontext *ctx, GLint x, GLint y, +static GLvoid * +read_color_image( GLcontext *ctx, GLint x, GLint y, GLenum type, GLsizei width, GLsizei height ) { SWcontext *swrast = SWRAST_CONTEXT(ctx); - const GLint stride = 4 * width; - GLint i; - GLchan *image, *dst; + struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer; + const GLint pixelSize = _mesa_bytes_per_pixel(GL_RGBA, type); + const GLint stride = width * pixelSize; + GLint row; + GLubyte *image, *dst; - image = (GLchan *) _mesa_malloc(width * height * 4 * sizeof(GLchan)); + image = (GLubyte *) _mesa_malloc(width * height * pixelSize); if (!image) return NULL; RENDER_START(swrast, ctx); dst = image; - for (i = 0; i < height; i++) { - _swrast_read_rgba_span(ctx, ctx->ReadBuffer->_ColorReadBuffer, - width, x, y + i, (GLchan (*)[4]) dst); + for (row = 0; row < height; row++) { + _swrast_read_rgba_span(ctx, rb, width, x, y + row, type, dst); dst += stride; } @@ -285,15 +289,16 @@ _swrast_copy_teximage1d( GLcontext *ctx, GLenum target, GLint level, } else { /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, 1); + const GLenum format = GL_RGBA; + const GLenum type = ctx->ReadBuffer->_ColorReadBuffer->DataType; + GLvoid *image = read_color_image(ctx, x, y, type, width, 1); if (!image) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage1D"); return; } /* call glTexImage1D to redefine the texture */ ctx->Driver.TexImage1D(ctx, target, level, internalFormat, - width, border, - GL_RGBA, CHAN_TYPE, image, + width, border, format, type, image, &ctx->DefaultPacking, texObj, texImage); _mesa_free(image); } @@ -360,15 +365,16 @@ _swrast_copy_teximage2d( GLcontext *ctx, GLenum target, GLint level, } else { /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, height); + const GLenum format = GL_RGBA; + const GLenum type = ctx->ReadBuffer->_ColorReadBuffer->DataType; + GLvoid *image = read_color_image(ctx, x, y, type, width, height); if (!image) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage2D"); return; } /* call glTexImage2D to redefine the texture */ ctx->Driver.TexImage2D(ctx, target, level, internalFormat, - width, height, border, - GL_RGBA, CHAN_TYPE, image, + width, height, border, format, type, image, &ctx->DefaultPacking, texObj, texImage); _mesa_free(image); } @@ -428,14 +434,16 @@ _swrast_copy_texsubimage1d( GLcontext *ctx, GLenum target, GLint level, } else { /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, 1); + const GLenum format = GL_RGBA; + const GLenum type = ctx->ReadBuffer->_ColorReadBuffer->DataType; + GLvoid *image = read_color_image(ctx, x, y, type, width, 1); if (!image) { _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage1D" ); return; } /* now call glTexSubImage1D to do the real work */ ctx->Driver.TexSubImage1D(ctx, target, level, xoffset, width, - GL_RGBA, CHAN_TYPE, image, + format, type, image, &ctx->DefaultPacking, texObj, texImage); _mesa_free(image); } @@ -501,7 +509,9 @@ _swrast_copy_texsubimage2d( GLcontext *ctx, } else { /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, height); + const GLenum format = GL_RGBA; + const GLenum type = ctx->ReadBuffer->_ColorReadBuffer->DataType; + GLvoid *image = read_color_image(ctx, x, y, type, width, height); if (!image) { _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage2D" ); return; @@ -509,7 +519,7 @@ _swrast_copy_texsubimage2d( GLcontext *ctx, /* now call glTexSubImage2D to do the real work */ ctx->Driver.TexSubImage2D(ctx, target, level, xoffset, yoffset, width, height, - GL_RGBA, CHAN_TYPE, image, + format, type, image, &ctx->DefaultPacking, texObj, texImage); _mesa_free(image); } @@ -572,7 +582,9 @@ _swrast_copy_texsubimage3d( GLcontext *ctx, } else { /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, height); + const GLenum format = GL_RGBA; + const GLenum type = ctx->ReadBuffer->_ColorReadBuffer->DataType; + GLvoid *image = read_color_image(ctx, x, y, type, width, height); if (!image) { _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage3D" ); return; @@ -580,7 +592,7 @@ _swrast_copy_texsubimage3d( GLcontext *ctx, /* now call glTexSubImage3D to do the real work */ ctx->Driver.TexSubImage3D(ctx, target, level, xoffset, yoffset, zoffset, width, height, 1, - GL_RGBA, CHAN_TYPE, image, + format, type, image, &ctx->DefaultPacking, texObj, texImage); _mesa_free(image); } |