summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/teximage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main/teximage.c')
-rw-r--r--src/mesa/main/teximage.c127
1 files changed, 85 insertions, 42 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 98f62c8162c..14f9c60315c 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -1,7 +1,8 @@
+/* $Id: teximage.c,v 1.40 2000/08/21 14:22:24 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.3
+ * Version: 3.5
*
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
*
@@ -33,6 +34,7 @@
#include "mem.h"
#include "mmath.h"
#include "span.h"
+#include "state.h"
#include "teximage.h"
#include "texstate.h"
#include "types.h"
@@ -688,7 +690,7 @@ _mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit,
* NOTE: All texture image parameters should have already been error checked.
*/
static void
-make_texture_image( GLcontext *ctx,
+make_texture_image( GLcontext *ctx, GLint dimensions,
struct gl_texture_image *texImage,
GLenum srcFormat, GLenum srcType, const GLvoid *pixels,
const struct gl_pixelstore_attrib *unpacking)
@@ -730,10 +732,11 @@ make_texture_image( GLcontext *ctx,
* This includes applying the pixel transfer operations.
*/
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
/* try common 2D texture cases first */
- if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag
- && !ctx->Pixel.IndexOffset && !ctx->Pixel.IndexShift
- && srcType == GL_UNSIGNED_BYTE && depth == 1) {
+ if (!ctx->ImageTransferState && srcType == GL_UNSIGNED_BYTE && depth == 1) {
if (srcFormat == internalFormat ||
(srcFormat == GL_LUMINANCE && internalFormat == 1) ||
@@ -799,7 +802,8 @@ make_texture_image( GLcontext *ctx,
const GLvoid *source = _mesa_image_address(unpacking,
pixels, width, height, srcFormat, srcType, img, row, 0);
_mesa_unpack_index_span(ctx, width, dstType, dest,
- srcType, source, unpacking, GL_TRUE);
+ srcType, source, unpacking,
+ ctx->ImageTransferState);
dest += destBytesPerRow;
}
}
@@ -810,12 +814,14 @@ make_texture_image( GLcontext *ctx,
const GLenum dstFormat = texImage->Format;
GLubyte *dest = texImage->Data;
GLint img, row;
+ /* XXX convolution */
for (img = 0; img < depth; img++) {
for (row = 0; row < height; row++) {
const GLvoid *source = _mesa_image_address(unpacking,
pixels, width, height, srcFormat, srcType, img, row, 0);
_mesa_unpack_ubyte_color_span(ctx, width, dstFormat, dest,
- srcFormat, srcType, source, unpacking, GL_TRUE);
+ srcFormat, srcType, source,
+ unpacking, ctx->ImageTransferState);
dest += destBytesPerRow;
}
}
@@ -1384,12 +1390,14 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
/* setup the teximage struct's fields */
init_texture_image(texImage, width, 1, 1, border, internalFormat);
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
/* process the texture image */
if (pixels) {
GLboolean retain = GL_TRUE;
GLboolean success = GL_FALSE;
- if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
- && ctx->Driver.TexImage1D) {
+ if (!ctx->ImageTransferState && ctx->Driver.TexImage1D) {
/* let device driver try to use raw image */
success = (*ctx->Driver.TexImage1D)( ctx, target, level, format,
type, pixels, &ctx->Unpack,
@@ -1397,7 +1405,7 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
}
if (retain || !success) {
/* make internal copy of the texture image */
- make_texture_image(ctx, texImage, format, type,
+ make_texture_image(ctx, 1, texImage, format, type,
pixels, &ctx->Unpack);
if (!success && ctx->Driver.TexImage1D) {
/* let device driver try to use unpacked image */
@@ -1493,12 +1501,14 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
/* setup the teximage struct's fields */
init_texture_image(texImage, width, height, 1, border, internalFormat);
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
/* process the texture image */
if (pixels) {
GLboolean retain = GL_TRUE;
GLboolean success = GL_FALSE;
- if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
- && ctx->Driver.TexImage2D) {
+ if (!ctx->ImageTransferState && ctx->Driver.TexImage2D) {
/* let device driver try to use raw image */
success = (*ctx->Driver.TexImage2D)( ctx, target, level, format,
type, pixels, &ctx->Unpack,
@@ -1506,7 +1516,7 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
}
if (retain || !success) {
/* make internal copy of the texture image */
- make_texture_image(ctx, texImage, format, type,
+ make_texture_image(ctx, 2, texImage, format, type,
pixels, &ctx->Unpack);
if (!success && ctx->Driver.TexImage2D) {
/* let device driver try to use unpacked image */
@@ -1612,12 +1622,14 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
init_texture_image(texImage, width, height, depth,
border, internalFormat);
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
/* process the texture image */
if (pixels) {
GLboolean retain = GL_TRUE;
GLboolean success = GL_FALSE;
- if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
- && ctx->Driver.TexImage3D) {
+ if (!ctx->ImageTransferState && ctx->Driver.TexImage3D) {
/* let device driver try to use raw image */
success = (*ctx->Driver.TexImage3D)( ctx, target, level, format,
type, pixels, &ctx->Unpack,
@@ -1625,7 +1637,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
}
if (retain || !success) {
/* make internal copy of the texture image */
- make_texture_image(ctx, texImage, format, type,
+ make_texture_image(ctx, 3, texImage, format, type,
pixels, &ctx->Unpack);
if (!success && ctx->Driver.TexImage3D) {
/* let device driver try to use unpacked image */
@@ -1755,7 +1767,7 @@ _mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level,
for (img = 0; img < depth; img++) {
for (row = 0; row < height; row++) {
_mesa_unpack_index_span(ctx, width, dstType, destPtr,
- imgType, srcPtr, &_mesa_native_packing, GL_FALSE);
+ imgType, srcPtr, &_mesa_native_packing, 0);
destPtr += destBytesPerRow;
srcPtr += srcBytesPerRow;
}
@@ -1767,7 +1779,7 @@ _mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level,
for (img = 0; img < depth; img++) {
for (row = 0; row < height; row++) {
_mesa_unpack_ubyte_color_span(ctx, width, dstFormat, destPtr,
- imgFormat, imgType, srcPtr, &_mesa_native_packing, GL_FALSE);
+ imgFormat, imgType, srcPtr, &_mesa_native_packing, 0);
destPtr += destBytesPerRow;
srcPtr += srcBytesPerRow;
}
@@ -1870,6 +1882,9 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
GLint height = texImage->Height;
GLint row;
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
for (row = 0; row < height; row++) {
/* compute destination address in client memory */
GLvoid *dest = _mesa_image_address( &ctx->Unpack, pixels,
@@ -1880,7 +1895,8 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
if (texImage->Format == GL_RGBA) {
const GLubyte *src = texImage->Data + row * width * 4 * sizeof(GLubyte);
_mesa_pack_rgba_span( ctx, width, (CONST GLubyte (*)[4]) src,
- format, type, dest, &ctx->Pack, GL_TRUE );
+ format, type, dest, &ctx->Pack,
+ ctx->ImageTransferState );
}
else {
/* fetch RGBA row from texture image then pack it in client mem */
@@ -1944,7 +1960,8 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
gl_problem( ctx, "bad format in gl_GetTexImage" );
}
_mesa_pack_rgba_span( ctx, width, (const GLubyte (*)[4])rgba,
- format, type, dest, &ctx->Pack, GL_TRUE );
+ format, type, dest, &ctx->Pack,
+ ctx->ImageTransferState );
}
}
@@ -1983,9 +2000,10 @@ _mesa_TexSubImage1D( GLenum target, GLint level,
if (width == 0 || !pixels)
return; /* no-op, not an error */
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
- if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
- && ctx->Driver.TexSubImage1D) {
+ if (!ctx->ImageTransferState && ctx->Driver.TexSubImage1D) {
success = (*ctx->Driver.TexSubImage1D)( ctx, target, level, xoffset,
width, format, type, pixels,
&ctx->Unpack, texObj, texImage );
@@ -2012,15 +2030,18 @@ _mesa_TexSubImage1D( GLenum target, GLint level,
const GLvoid *src = _mesa_image_address(&ctx->Unpack, pixels, width,
1, format, type, 0, 0, 0);
_mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst,
- type, src, &ctx->Unpack, GL_TRUE);
+ type, src, &ctx->Unpack,
+ ctx->ImageTransferState);
}
else {
/* color texture */
GLubyte *dst = texImage->Data + xoffsetb * texComponents;
const GLvoid *src = _mesa_image_address(&ctx->Unpack, pixels, width,
1, format, type, 0, 0, 0);
+ /* XXX change for convolution */
_mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, format,
- type, src, &ctx->Unpack, GL_TRUE);
+ type, src, &ctx->Unpack,
+ ctx->ImageTransferState);
}
if (ctx->Driver.TexImage1D) {
@@ -2066,8 +2087,10 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
if (width == 0 || height == 0 || !pixels)
return; /* no-op, not an error */
- if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
- && ctx->Driver.TexSubImage2D) {
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (!ctx->ImageTransferState && ctx->Driver.TexSubImage2D) {
success = (*ctx->Driver.TexSubImage2D)( ctx, target, level, xoffset,
yoffset, width, height, format, type,
pixels, &ctx->Unpack, texObj, texImage );
@@ -2102,7 +2125,8 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
GLint row;
for (row = 0; row < height; row++) {
_mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst, type,
- (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+ (const GLvoid *) src, &ctx->Unpack,
+ ctx->ImageTransferState);
src += srcStride;
dst += dstStride;
}
@@ -2114,9 +2138,12 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
const GLubyte *src = _mesa_image_address(&ctx->Unpack, pixels,
width, height, format, type, 0, 0, 0);
GLint row;
+ /* XXX change for convolution */
for (row = 0; row < height; row++) {
_mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, format,
- type, (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+ type, (const GLvoid *) src,
+ &ctx->Unpack,
+ ctx->ImageTransferState);
src += srcStride;
dst += dstStride;
}
@@ -2177,8 +2204,10 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
if (width == 0 || height == 0 || height == 0 || !pixels)
return; /* no-op, not an error */
- if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
- && ctx->Driver.TexSubImage3D) {
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (!ctx->ImageTransferState && ctx->Driver.TexSubImage3D) {
success = (*ctx->Driver.TexSubImage3D)( ctx, target, level, xoffset,
yoffset, zoffset, width, height, depth, format,
type, pixels, &ctx->Unpack, texObj, texImage );
@@ -2208,7 +2237,8 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
+ yoffsetb * texWidth + xoffsetb) * texComponents;
for (row = 0; row < height; row++) {
_mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst,
- type, (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+ type, (const GLvoid *) src,
+ &ctx->Unpack, ctx->ImageTransferState);
src += srcStride;
dst += dstStride;
}
@@ -2224,7 +2254,10 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
+ yoffsetb * texWidth + xoffsetb) * texComponents;
for (row = 0; row < height; row++) {
_mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst,
- format, type, (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+ format, type,
+ (const GLvoid *) src,
+ &ctx->Unpack,
+ ctx->ImageTransferState);
src += srcStride;
dst += dstStride;
}
@@ -2302,8 +2335,10 @@ _mesa_CopyTexImage1D( GLenum target, GLint level,
width, 1, border))
return;
- if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
- || !ctx->Driver.CopyTexImage1D
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (ctx->ImageTransferState || !ctx->Driver.CopyTexImage1D
|| !(*ctx->Driver.CopyTexImage1D)(ctx, target, level,
internalFormat, x, y, width, border))
{
@@ -2341,8 +2376,10 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
width, height, border))
return;
- if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
- || !ctx->Driver.CopyTexImage2D
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (ctx->ImageTransferState || !ctx->Driver.CopyTexImage2D
|| !(*ctx->Driver.CopyTexImage2D)(ctx, target, level,
internalFormat, x, y, width, height, border))
{
@@ -2379,8 +2416,10 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,
xoffset, 0, 0, width, 1))
return;
- if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
- || !ctx->Driver.CopyTexSubImage1D
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (ctx->ImageTransferState || !ctx->Driver.CopyTexSubImage1D
|| !(*ctx->Driver.CopyTexSubImage1D)(ctx, target, level,
xoffset, x, y, width)) {
struct gl_texture_unit *texUnit;
@@ -2424,8 +2463,10 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level,
xoffset, yoffset, 0, width, height))
return;
- if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
- || !ctx->Driver.CopyTexSubImage2D
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (ctx->ImageTransferState || !ctx->Driver.CopyTexSubImage2D
|| !(*ctx->Driver.CopyTexSubImage2D)(ctx, target, level,
xoffset, yoffset, x, y, width, height )) {
struct gl_texture_unit *texUnit;
@@ -2469,8 +2510,10 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,
xoffset, yoffset, zoffset, width, height))
return;
- if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
- || !ctx->Driver.CopyTexSubImage3D
+ if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+ _mesa_update_image_transfer_state(ctx);
+
+ if (ctx->ImageTransferState || !ctx->Driver.CopyTexSubImage3D
|| !(*ctx->Driver.CopyTexSubImage3D)(ctx, target, level,
xoffset, yoffset, zoffset, x, y, width, height )) {
struct gl_texture_unit *texUnit;