diff options
author | Keith Whitwell <[email protected]> | 2001-03-19 02:25:35 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2001-03-19 02:25:35 +0000 |
commit | 709892459922a32096fe9dd8261d0d92337bb02f (patch) | |
tree | 87782215d4531207c97b236a5dfa0d15c45aef8a /src/mesa/main/texstore.c | |
parent | d9bf6ccce9f5fea22d6a478c4afafea3c3c525c5 (diff) |
Split driver struct into swrast/tnl/core components.
Diffstat (limited to 'src/mesa/main/texstore.c')
-rw-r--r-- | src/mesa/main/texstore.c | 356 |
1 files changed, 1 insertions, 355 deletions
diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index 2b0c61aa192..66f47b889e2 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -1,4 +1,4 @@ -/* $Id: texstore.c,v 1.15 2001/03/18 14:06:25 gareth Exp $ */ +/* $Id: texstore.c,v 1.16 2001/03/19 02:25:35 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -47,8 +47,6 @@ #include "texformat.h" #include "teximage.h" #include "texstore.h" -#include "swrast/s_depth.h" /* XXX this is kind of a cheat */ -#include "swrast/s_span.h" /* @@ -579,358 +577,6 @@ _mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level, /* - * 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. - */ -static GLchan * -read_color_image( GLcontext *ctx, GLint x, GLint y, - GLsizei width, GLsizei height ) -{ - GLint stride, i; - GLchan *image, *dst; - - image = (GLchan *) MALLOC(width * height * 4 * sizeof(GLchan)); - if (!image) - return NULL; - - /* Select buffer to read from */ - (*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer, - ctx->Pixel.DriverReadBuffer ); - - RENDER_START(ctx); - - dst = image; - stride = width * 4; - for (i = 0; i < height; i++) { - _mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y + i, - (GLchan (*)[4]) dst ); - dst += stride; - } - - RENDER_FINISH(ctx); - - /* Read from draw buffer (the default) */ - (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, - ctx->Color.DriverDrawBuffer ); - - return image; -} - - -/* - * As above, but read data from depth buffer. - */ -static GLfloat * -read_depth_image( GLcontext *ctx, GLint x, GLint y, - GLsizei width, GLsizei height ) -{ - GLint i; - GLfloat *image, *dst; - - image = (GLfloat *) MALLOC(width * height * sizeof(GLfloat)); - if (!image) - return NULL; - - RENDER_START(ctx); - - dst = image; - for (i = 0; i < height; i++) { - _mesa_read_depth_span_float(ctx, width, x, y + i, dst); - dst += width; - } - - RENDER_FINISH(ctx); - - return image; -} - - - -static GLboolean -is_depth_format(GLenum format) -{ - switch (format) { - case GL_DEPTH_COMPONENT: - case GL_DEPTH_COMPONENT16_SGIX: - case GL_DEPTH_COMPONENT24_SGIX: - case GL_DEPTH_COMPONENT32_SGIX: - return GL_TRUE; - default: - return GL_FALSE; - } -} - - -/* - * Fallback for Driver.CopyTexImage1D(). - */ -void -_mesa_copy_teximage1d( GLcontext *ctx, GLenum target, GLint level, - GLenum internalFormat, - GLint x, GLint y, GLsizei width, GLint border ) -{ - struct gl_texture_unit *texUnit; - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; - texObj = _mesa_select_tex_object(ctx, texUnit, target); - ASSERT(texObj); - texImage = _mesa_select_tex_image(ctx, texUnit, target, level); - ASSERT(texImage); - - ASSERT(ctx->Driver.TexImage1D); - - if (is_depth_format(internalFormat)) { - /* read depth image from framebuffer */ - GLfloat *image = read_depth_image(ctx, x, y, 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_DEPTH_COMPONENT, GL_FLOAT, image, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } - else { - /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, 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, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } -} - - -/* - * Fallback for Driver.CopyTexImage2D(). - */ -void -_mesa_copy_teximage2d( GLcontext *ctx, GLenum target, GLint level, - GLenum internalFormat, - GLint x, GLint y, GLsizei width, GLsizei height, - GLint border ) -{ - struct gl_texture_unit *texUnit; - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; - texObj = _mesa_select_tex_object(ctx, texUnit, target); - ASSERT(texObj); - texImage = _mesa_select_tex_image(ctx, texUnit, target, level); - ASSERT(texImage); - - ASSERT(ctx->Driver.TexImage2D); - - if (is_depth_format(internalFormat)) { - /* read depth image from framebuffer */ - GLfloat *image = read_depth_image(ctx, x, y, 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_DEPTH_COMPONENT, GL_FLOAT, image, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } - else { - /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, 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, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } -} - - -/* - * Fallback for Driver.CopyTexSubImage1D(). - */ -void -_mesa_copy_texsubimage1d(GLcontext *ctx, GLenum target, GLint level, - GLint xoffset, GLint x, GLint y, GLsizei width) -{ - struct gl_texture_unit *texUnit; - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; - texObj = _mesa_select_tex_object(ctx, texUnit, target); - ASSERT(texObj); - texImage = _mesa_select_tex_image(ctx, texUnit, target, level); - ASSERT(texImage); - - ASSERT(ctx->Driver.TexImage1D); - - if (is_depth_format(texImage->IntFormat)) { - /* read depth image from framebuffer */ - GLfloat *image = read_depth_image(ctx, x, y, width, 1); - if (!image) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage1D"); - return; - } - - /* call glTexImage1D to redefine the texture */ - (*ctx->Driver.TexSubImage1D)(ctx, target, level, xoffset, width, - GL_DEPTH_COMPONENT, GL_FLOAT, image, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } - else { - GLchan *image = read_color_image(ctx, x, y, 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, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } -} - - -/* - * Fallback for Driver.CopyTexSubImage2D(). - */ -void -_mesa_copy_texsubimage2d( GLcontext *ctx, - GLenum target, GLint level, - GLint xoffset, GLint yoffset, - GLint x, GLint y, GLsizei width, GLsizei height ) -{ - struct gl_texture_unit *texUnit; - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; - texObj = _mesa_select_tex_object(ctx, texUnit, target); - ASSERT(texObj); - texImage = _mesa_select_tex_image(ctx, texUnit, target, level); - ASSERT(texImage); - - ASSERT(ctx->Driver.TexImage2D); - - if (is_depth_format(texImage->IntFormat)) { - /* read depth image from framebuffer */ - GLfloat *image = read_depth_image(ctx, x, y, width, height); - if (!image) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage2D"); - return; - } - - /* call glTexImage1D to redefine the texture */ - (*ctx->Driver.TexSubImage2D)(ctx, target, level, - xoffset, yoffset, width, height, - GL_DEPTH_COMPONENT, GL_FLOAT, image, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } - else { - /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, height); - if (!image) { - _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage2D" ); - return; - } - - /* now call glTexSubImage2D to do the real work */ - (*ctx->Driver.TexSubImage2D)(ctx, target, level, - xoffset, yoffset, width, height, - GL_RGBA, CHAN_TYPE, image, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } -} - - -/* - * Fallback for Driver.CopyTexSubImage3D(). - */ -void -_mesa_copy_texsubimage3d( GLcontext *ctx, - GLenum target, GLint level, - GLint xoffset, GLint yoffset, GLint zoffset, - GLint x, GLint y, GLsizei width, GLsizei height ) -{ - struct gl_texture_unit *texUnit; - struct gl_texture_object *texObj; - struct gl_texture_image *texImage; - - texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; - texObj = _mesa_select_tex_object(ctx, texUnit, target); - ASSERT(texObj); - texImage = _mesa_select_tex_image(ctx, texUnit, target, level); - ASSERT(texImage); - - ASSERT(ctx->Driver.TexImage3D); - - if (is_depth_format(texImage->IntFormat)) { - /* read depth image from framebuffer */ - GLfloat *image = read_depth_image(ctx, x, y, width, height); - if (!image) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage3D"); - return; - } - - /* call glTexImage1D to redefine the texture */ - (*ctx->Driver.TexSubImage3D)(ctx, target, level, - xoffset, yoffset, zoffset, width, height, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, image, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } - else { - /* read RGBA image from framebuffer */ - GLchan *image = read_color_image(ctx, x, y, width, height); - if (!image) { - _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage3D" ); - return; - } - - /* 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, - &_mesa_native_packing, texObj, texImage); - FREE(image); - } -} - - - -/* * Fallback for Driver.CompressedTexImage1D() */ void |