mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 03:08:05 +02:00
Fixed a texture conversion problem: sometimes need to produce an intermediate
texture image in the base internal format between user->Mesa format conversion. See comments in texstore.c
This commit is contained in:
parent
3518a7950f
commit
1c85aa3332
5 changed files with 133 additions and 59 deletions
|
|
@ -1234,6 +1234,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
* simple (format = simpleFormat, type = CHAN_TYPE).
|
||||
*/
|
||||
_mesa_transfer_teximage(ctx, 2, /* dimensions */
|
||||
simpleFormat, /* base int format */
|
||||
simpleFormat, /* dest format */
|
||||
tempImage, /* dest addr */
|
||||
width, height, 1, /* src size */
|
||||
|
|
@ -1339,7 +1340,7 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
* a simpler format now.
|
||||
*/
|
||||
|
||||
GLenum simpleFormat = _mesa_base_tex_format(ctx, texImage->TexFormat->IntFormat);
|
||||
GLenum simpleFormat = texImage->TexFormat->BaseFormat;
|
||||
GLint comps = _mesa_components_in_format(simpleFormat);
|
||||
GLubyte *tempImage;
|
||||
GLboolean success;
|
||||
|
|
@ -1350,6 +1351,7 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
* simple (format = simpleFormat, type = CHAN_TYPE).
|
||||
*/
|
||||
_mesa_transfer_teximage(ctx, 2, /* dimensions */
|
||||
simpleFormat, /* base int format */
|
||||
simpleFormat, /* dest format */
|
||||
tempImage, /* dest addr */
|
||||
width, height, 1, /* src size */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: mtypes.h,v 1.39 2001/04/17 21:25:53 brianp Exp $ */
|
||||
/* $Id: mtypes.h,v 1.40 2001/04/20 16:46:04 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -749,7 +749,10 @@ typedef void (*FetchTexelFunc)( const struct gl_texture_image *texImage,
|
|||
struct gl_texture_format {
|
||||
GLint MesaFormat; /* One of the MESA_FORMAT_* values */
|
||||
|
||||
GLenum IntFormat; /* Internal format as GL enum value */
|
||||
GLenum BaseFormat; /* Either GL_ALPHA, GL_INTENSITY, GL_LUMINANCE,
|
||||
* GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA,
|
||||
* GL_COLOR_INDEX or GL_DEPTH_COMPONENT.
|
||||
*/
|
||||
GLenum Type; /* Internal type as GL enum value */
|
||||
|
||||
GLubyte RedBits; /* Bits per texel component */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: texformat.c,v 1.9 2001/04/04 23:56:33 brianp Exp $ */
|
||||
/* $Id: texformat.c,v 1.10 2001/04/20 16:46:04 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -74,7 +74,7 @@ static void fetch_null_texel( const struct gl_texture_image *texImage,
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_rgba = {
|
||||
MESA_FORMAT_RGBA, /* MesaFormat */
|
||||
GL_RGBA, /* IntFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
CHAN_BITS, /* RedBits */
|
||||
CHAN_BITS, /* GreenBits */
|
||||
|
|
@ -92,7 +92,7 @@ const struct gl_texture_format _mesa_texformat_rgba = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_rgb = {
|
||||
MESA_FORMAT_RGB, /* MesaFormat */
|
||||
GL_RGB, /* IntFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
CHAN_BITS, /* RedBits */
|
||||
CHAN_BITS, /* GreenBits */
|
||||
|
|
@ -110,7 +110,7 @@ const struct gl_texture_format _mesa_texformat_rgb = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_alpha = {
|
||||
MESA_FORMAT_ALPHA, /* MesaFormat */
|
||||
GL_ALPHA, /* IntFormat */
|
||||
GL_ALPHA, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -128,7 +128,7 @@ const struct gl_texture_format _mesa_texformat_alpha = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_luminance = {
|
||||
MESA_FORMAT_LUMINANCE, /* MesaFormat */
|
||||
GL_LUMINANCE, /* IntFormat */
|
||||
GL_LUMINANCE, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -146,7 +146,7 @@ const struct gl_texture_format _mesa_texformat_luminance = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_luminance_alpha = {
|
||||
MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */
|
||||
GL_LUMINANCE_ALPHA, /* IntFormat */
|
||||
GL_LUMINANCE_ALPHA, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -164,7 +164,7 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_intensity = {
|
||||
MESA_FORMAT_INTENSITY, /* MesaFormat */
|
||||
GL_INTENSITY, /* IntFormat */
|
||||
GL_INTENSITY, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -182,7 +182,7 @@ const struct gl_texture_format _mesa_texformat_intensity = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_color_index = {
|
||||
MESA_FORMAT_COLOR_INDEX, /* MesaFormat */
|
||||
GL_COLOR_INDEX, /* IntFormat */
|
||||
GL_COLOR_INDEX, /* BaseFormat */
|
||||
CHAN_TYPE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -200,7 +200,7 @@ const struct gl_texture_format _mesa_texformat_color_index = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_depth_component = {
|
||||
MESA_FORMAT_DEPTH_COMPONENT, /* MesaFormat */
|
||||
GL_DEPTH_COMPONENT, /* IntFormat */
|
||||
GL_DEPTH_COMPONENT, /* BaseFormat */
|
||||
GL_FLOAT, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -223,7 +223,7 @@ const struct gl_texture_format _mesa_texformat_depth_component = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_rgba8888 = {
|
||||
MESA_FORMAT_RGBA8888, /* MesaFormat */
|
||||
GL_RGBA, /* IntFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_INT_8_8_8_8, /* Type */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
|
|
@ -241,7 +241,7 @@ const struct gl_texture_format _mesa_texformat_rgba8888 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_argb8888 = {
|
||||
MESA_FORMAT_ARGB8888, /* MesaFormat */
|
||||
GL_RGBA, /* IntFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_INT_8_8_8_8_REV, /* Type */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
|
|
@ -259,7 +259,7 @@ const struct gl_texture_format _mesa_texformat_argb8888 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_rgb888 = {
|
||||
MESA_FORMAT_RGB888, /* MesaFormat */
|
||||
GL_BGR, /* IntFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
|
|
@ -277,7 +277,7 @@ const struct gl_texture_format _mesa_texformat_rgb888 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_rgb565 = {
|
||||
MESA_FORMAT_RGB565, /* MesaFormat */
|
||||
GL_RGB, /* IntFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_SHORT_5_6_5, /* Type */
|
||||
5, /* RedBits */
|
||||
6, /* GreenBits */
|
||||
|
|
@ -295,7 +295,7 @@ const struct gl_texture_format _mesa_texformat_rgb565 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_argb4444 = {
|
||||
MESA_FORMAT_ARGB4444, /* MesaFormat */
|
||||
GL_RGBA, /* IntFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */
|
||||
4, /* RedBits */
|
||||
4, /* GreenBits */
|
||||
|
|
@ -313,7 +313,7 @@ const struct gl_texture_format _mesa_texformat_argb4444 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_argb1555 = {
|
||||
MESA_FORMAT_ARGB1555, /* MesaFormat */
|
||||
GL_RGBA, /* IntFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */
|
||||
5, /* RedBits */
|
||||
5, /* GreenBits */
|
||||
|
|
@ -331,7 +331,7 @@ const struct gl_texture_format _mesa_texformat_argb1555 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_al88 = {
|
||||
MESA_FORMAT_AL88, /* MesaFormat */
|
||||
GL_LUMINANCE_ALPHA, /* IntFormat */
|
||||
GL_LUMINANCE_ALPHA, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -349,7 +349,7 @@ const struct gl_texture_format _mesa_texformat_al88 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_rgb332 = {
|
||||
MESA_FORMAT_RGB332, /* MesaFormat */
|
||||
GL_RGB, /* IntFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE_3_3_2, /* Type */
|
||||
3, /* RedBits */
|
||||
3, /* GreenBits */
|
||||
|
|
@ -367,7 +367,7 @@ const struct gl_texture_format _mesa_texformat_rgb332 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_a8 = {
|
||||
MESA_FORMAT_A8, /* MesaFormat */
|
||||
GL_ALPHA, /* IntFormat */
|
||||
GL_ALPHA, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -385,7 +385,7 @@ const struct gl_texture_format _mesa_texformat_a8 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_l8 = {
|
||||
MESA_FORMAT_L8, /* MesaFormat */
|
||||
GL_LUMINANCE, /* IntFormat */
|
||||
GL_LUMINANCE, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -403,7 +403,7 @@ const struct gl_texture_format _mesa_texformat_l8 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_i8 = {
|
||||
MESA_FORMAT_I8, /* MesaFormat */
|
||||
GL_INTENSITY, /* IntFormat */
|
||||
GL_INTENSITY, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -421,7 +421,7 @@ const struct gl_texture_format _mesa_texformat_i8 = {
|
|||
|
||||
const struct gl_texture_format _mesa_texformat_ci8 = {
|
||||
MESA_FORMAT_CI8, /* MesaFormat */
|
||||
GL_COLOR_INDEX, /* IntFormat */
|
||||
GL_COLOR_INDEX, /* BaseFormat */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
@ -444,7 +444,7 @@ const struct gl_texture_format _mesa_texformat_ci8 = {
|
|||
|
||||
const struct gl_texture_format _mesa_null_texformat = {
|
||||
-1, /* MesaFormat */
|
||||
0, /* IntFormat */
|
||||
0, /* BaseFormat */
|
||||
0, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: texstore.c,v 1.23 2001/04/04 22:41:23 brianp Exp $ */
|
||||
/* $Id: texstore.c,v 1.24 2001/04/20 16:46:04 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -29,15 +29,6 @@
|
|||
* Brian Paul
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* The functions in this file are mostly related to software texture fallbacks.
|
||||
* This includes texture image transfer/packing and texel fetching.
|
||||
* Hardware drivers will likely override most of this.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "colormac.h"
|
||||
#include "context.h"
|
||||
#include "convolve.h"
|
||||
|
|
@ -154,6 +145,7 @@ components_in_intformat( GLint format )
|
|||
* srcFormat - source image format (GL_ALPHA, GL_RED, GL_RGB, etc)
|
||||
* srcType - GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_5_6_5, GL_FLOAT, etc
|
||||
* srcPacking - describes packing of incoming image.
|
||||
* transferOps - mask of pixel transfer operations
|
||||
*/
|
||||
static void
|
||||
transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
||||
|
|
@ -163,7 +155,8 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
GLint dstRowStride, GLint dstImageStride,
|
||||
GLenum srcFormat, GLenum srcType,
|
||||
const GLvoid *srcAddr,
|
||||
const struct gl_pixelstore_attrib *srcPacking)
|
||||
const struct gl_pixelstore_attrib *srcPacking,
|
||||
GLuint transferOps)
|
||||
{
|
||||
GLint texComponents;
|
||||
|
||||
|
|
@ -184,7 +177,7 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
texComponents = components_in_intformat(texDestFormat);
|
||||
|
||||
/* try common 2D texture cases first */
|
||||
if (!ctx->_ImageTransferState && dimensions == 2 && srcType == CHAN_TYPE) {
|
||||
if (!transferOps && dimensions == 2 && srcType == CHAN_TYPE) {
|
||||
|
||||
if (srcFormat == texDestFormat) {
|
||||
/* This will cover the common GL_RGB, GL_RGBA, GL_ALPHA,
|
||||
|
|
@ -253,8 +246,7 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
const GLvoid *src = _mesa_image_address(srcPacking,
|
||||
srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
|
||||
_mesa_unpack_index_span(ctx, srcWidth, texType, destRow,
|
||||
srcType, src, srcPacking,
|
||||
ctx->_ImageTransferState);
|
||||
srcType, src, srcPacking, transferOps);
|
||||
destRow += dstRowStride;
|
||||
}
|
||||
dest += dstImageStride;
|
||||
|
|
@ -314,7 +306,7 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
srcFormat, srcType, img, row, 0);
|
||||
_mesa_unpack_float_color_span(ctx, srcWidth, GL_RGBA, dstf,
|
||||
srcFormat, srcType, src, srcPacking,
|
||||
ctx->_ImageTransferState & IMAGE_PRE_CONVOLUTION_BITS,
|
||||
transferOps & IMAGE_PRE_CONVOLUTION_BITS,
|
||||
GL_TRUE);
|
||||
dstf += srcWidth * 4;
|
||||
}
|
||||
|
|
@ -345,7 +337,7 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
(const GLfloat (*)[4]) srcf,
|
||||
texDestFormat, CHAN_TYPE,
|
||||
dest, &_mesa_native_packing,
|
||||
ctx->_ImageTransferState
|
||||
transferOps
|
||||
& IMAGE_POST_CONVOLUTION_BITS);
|
||||
srcf += convWidth * 4;
|
||||
dest += dstRowStride;
|
||||
|
|
@ -371,7 +363,7 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
srcFormat, srcType, img, row, 0);
|
||||
_mesa_unpack_chan_color_span(ctx, srcWidth, texDestFormat,
|
||||
destRow, srcFormat, srcType, srcRow,
|
||||
srcPacking, ctx->_ImageTransferState);
|
||||
srcPacking, transferOps);
|
||||
destRow += dstRowStride;
|
||||
}
|
||||
dest += dstImageStride;
|
||||
|
|
@ -387,8 +379,18 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
* needed image transfer operations and storing the result in the format
|
||||
* specified by <dstFormat>. <dstFormat> may be any format from texformat.h.
|
||||
* Input:
|
||||
* dimensions - 1, 2 or 3
|
||||
* baseInternalFormat - base format of the internal texture format
|
||||
* specified by the user. This is very important, see below.
|
||||
* dstFormat - destination image format
|
||||
* dstAddr - destination address
|
||||
* srcWidth, srcHeight, srcDepth - size of source iamge
|
||||
* dstX/Y/Zoffset - as specified by glTexSubImage
|
||||
* dstRowStride - stride between dest rows in bytes
|
||||
* dstImagetride - stride between dest images in bytes
|
||||
* srcFormat, srcType - incoming image format and datatype
|
||||
* srcAddr - source image address
|
||||
* srcPacking - packing params of source image
|
||||
*
|
||||
* XXX this function is a bit more complicated than it should be. If
|
||||
* _mesa_convert_texsubimage[123]d could handle any dest/source formats
|
||||
|
|
@ -397,6 +399,7 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
*/
|
||||
void
|
||||
_mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
||||
GLenum baseInternalFormat,
|
||||
const struct gl_texture_format *dstFormat,
|
||||
GLvoid *dstAddr,
|
||||
GLint srcWidth, GLint srcHeight, GLint srcDepth,
|
||||
|
|
@ -409,10 +412,56 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
const GLint dstRowStridePixels = dstRowStride / dstFormat->TexelBytes;
|
||||
const GLint dstImageStridePixels = dstImageStride / dstFormat->TexelBytes;
|
||||
GLboolean makeTemp;
|
||||
GLuint transferOps = ctx->_ImageTransferState;
|
||||
GLboolean freeSourceData = GL_FALSE;
|
||||
GLint postConvWidth = srcWidth, postConvHeight = srcHeight;
|
||||
|
||||
/* First, determine if need to make a temporary, intermediate image */
|
||||
if (transferOps & IMAGE_CONVOLUTION_BIT) {
|
||||
_mesa_adjust_image_for_convolution(ctx, dimensions, &postConvWidth,
|
||||
&postConvHeight);
|
||||
}
|
||||
|
||||
/*
|
||||
* Consider this scenario: The user's source image is GL_RGB and the
|
||||
* requested internal format is GL_LUMINANCE. Now suppose the device
|
||||
* driver doesn't support GL_LUMINANCE and instead uses RGB16 as the
|
||||
* texture format. In that case we still need to do an intermediate
|
||||
* conversion to luminance format so that the incoming red channel gets
|
||||
* replicated into the dest red, green and blue channels. The following
|
||||
* code takes care of that.
|
||||
*/
|
||||
if (dstFormat->BaseFormat != baseInternalFormat) {
|
||||
/* Allocate storage for temporary image in the baseInternalFormat */
|
||||
const GLint texelSize = _mesa_components_in_format(baseInternalFormat)
|
||||
* sizeof(GLchan);
|
||||
const GLint bytes = texelSize * postConvWidth * postConvHeight *srcDepth;
|
||||
const GLint tmpRowStride = texelSize * postConvWidth;
|
||||
const GLint tmpImgStride = texelSize * postConvWidth * postConvHeight;
|
||||
GLvoid *tmpImage = MALLOC(bytes);
|
||||
if (!tmpImage)
|
||||
return;
|
||||
transfer_teximage(ctx, dimensions, baseInternalFormat, tmpImage,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
0, 0, 0, /* x/y/zoffset */
|
||||
tmpRowStride, tmpImgStride,
|
||||
srcFormat, srcType, srcAddr, srcPacking, transferOps);
|
||||
|
||||
/* this is our new source image */
|
||||
srcWidth = postConvWidth;
|
||||
srcHeight = postConvHeight;
|
||||
srcFormat = baseInternalFormat;
|
||||
srcType = CHAN_TYPE;
|
||||
srcAddr = tmpImage;
|
||||
srcPacking = &_mesa_native_packing;
|
||||
freeSourceData = GL_TRUE;
|
||||
transferOps = 0; /* image transfer ops were completed */
|
||||
}
|
||||
|
||||
/* Let the optimized tex conversion functions take a crack at the
|
||||
* image conversion if the dest format is a h/w format.
|
||||
*/
|
||||
if (_mesa_is_hardware_tex_format(dstFormat)) {
|
||||
if (ctx->_ImageTransferState) {
|
||||
if (transferOps) {
|
||||
makeTemp = GL_TRUE;
|
||||
}
|
||||
else {
|
||||
|
|
@ -444,6 +493,8 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
}
|
||||
if (!makeTemp) {
|
||||
/* all done! */
|
||||
if (freeSourceData)
|
||||
FREE((void *) srcAddr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -460,26 +511,32 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
GLint tmpRowStride, tmpImageStride;
|
||||
GLubyte *tmpImage;
|
||||
|
||||
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
|
||||
if (transferOps & IMAGE_CONVOLUTION_BIT) {
|
||||
_mesa_adjust_image_for_convolution(ctx, dimensions, &postConvWidth,
|
||||
&postConvHeight);
|
||||
}
|
||||
|
||||
tmpFormat = _mesa_base_tex_format(ctx, dstFormat->IntFormat);
|
||||
tmpFormat = dstFormat->BaseFormat;
|
||||
tmpComps = _mesa_components_in_format(tmpFormat);
|
||||
tmpTexelSize = tmpComps * sizeof(GLchan);
|
||||
tmpRowStride = postConvWidth * tmpTexelSize;
|
||||
tmpImageStride = postConvWidth * postConvHeight * tmpTexelSize;
|
||||
tmpImage = (GLubyte *) MALLOC(postConvWidth * postConvHeight *
|
||||
srcDepth * tmpTexelSize);
|
||||
if (!tmpImage)
|
||||
if (!tmpImage) {
|
||||
if (freeSourceData)
|
||||
FREE((void *) srcAddr);
|
||||
return;
|
||||
}
|
||||
|
||||
transfer_teximage(ctx, dimensions, tmpFormat, tmpImage,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
0, 0, 0, /* x/y/zoffset */
|
||||
tmpRowStride, tmpImageStride,
|
||||
srcFormat, srcType, srcAddr, srcPacking);
|
||||
srcFormat, srcType, srcAddr, srcPacking, transferOps);
|
||||
|
||||
if (freeSourceData)
|
||||
FREE((void *) srcAddr);
|
||||
|
||||
/* the temp image is our new source image */
|
||||
srcWidth = postConvWidth;
|
||||
|
|
@ -488,6 +545,7 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
srcType = CHAN_TYPE;
|
||||
srcAddr = tmpImage;
|
||||
srcPacking = &_mesa_native_packing;
|
||||
freeSourceData = GL_TRUE;
|
||||
}
|
||||
|
||||
if (_mesa_is_hardware_tex_format(dstFormat)) {
|
||||
|
|
@ -523,18 +581,19 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
|||
srcPacking, srcAddr, dstAddr);
|
||||
assert(b);
|
||||
}
|
||||
FREE((void *) srcAddr); /* the temp image */
|
||||
}
|
||||
else {
|
||||
/* software format */
|
||||
GLenum dstBaseFormat = _mesa_base_tex_format(ctx, dstFormat->IntFormat);
|
||||
assert(!makeTemp);
|
||||
transfer_teximage(ctx, dimensions, dstBaseFormat, dstAddr,
|
||||
transfer_teximage(ctx, dimensions, dstFormat->BaseFormat, dstAddr,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcFormat, srcType, srcAddr, srcPacking);
|
||||
srcFormat, srcType, srcAddr, srcPacking, transferOps);
|
||||
}
|
||||
|
||||
if (freeSourceData)
|
||||
FREE((void *) srcAddr); /* the temp image */
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -577,7 +636,8 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
|
|||
}
|
||||
|
||||
/* unpack image, apply transfer ops and store in texImage->Data */
|
||||
_mesa_transfer_teximage(ctx, 1, texImage->TexFormat, texImage->Data,
|
||||
_mesa_transfer_teximage(ctx, 1, _mesa_base_tex_format(ctx, internalFormat),
|
||||
texImage->TexFormat, texImage->Data,
|
||||
width, 1, 1, 0, 0, 0,
|
||||
0, /* dstRowStride */
|
||||
0, /* dstImageStride */
|
||||
|
|
@ -625,7 +685,8 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
|
|||
}
|
||||
|
||||
/* unpack image, apply transfer ops and store in texImage->Data */
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->TexFormat, texImage->Data,
|
||||
_mesa_transfer_teximage(ctx, 2, _mesa_base_tex_format(ctx, internalFormat),
|
||||
texImage->TexFormat, texImage->Data,
|
||||
width, height, 1, 0, 0, 0,
|
||||
texImage->Width * texelBytes,
|
||||
0, /* dstImageStride */
|
||||
|
|
@ -668,7 +729,8 @@ _mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
|
|||
}
|
||||
|
||||
/* unpack image, apply transfer ops and store in texImage->Data */
|
||||
_mesa_transfer_teximage(ctx, 3, texImage->TexFormat, texImage->Data,
|
||||
_mesa_transfer_teximage(ctx, 3, _mesa_base_tex_format(ctx, internalFormat),
|
||||
texImage->TexFormat, texImage->Data,
|
||||
width, height, depth, 0, 0, 0,
|
||||
texImage->Width * texelBytes,
|
||||
texImage->Width * texImage->Height * texelBytes,
|
||||
|
|
@ -689,7 +751,9 @@ _mesa_store_texsubimage1d(GLcontext *ctx, GLenum target, GLint level,
|
|||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
_mesa_transfer_teximage(ctx, 1, texImage->TexFormat, texImage->Data,
|
||||
_mesa_transfer_teximage(ctx, 1,
|
||||
_mesa_base_tex_format(ctx, texImage->IntFormat),
|
||||
texImage->TexFormat, texImage->Data,
|
||||
width, 1, 1, /* src size */
|
||||
xoffset, 0, 0, /* dest offsets */
|
||||
0, /* dstRowStride */
|
||||
|
|
@ -710,7 +774,9 @@ _mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level,
|
|||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->TexFormat, texImage->Data,
|
||||
_mesa_transfer_teximage(ctx, 2,
|
||||
_mesa_base_tex_format(ctx, texImage->IntFormat),
|
||||
texImage->TexFormat, texImage->Data,
|
||||
width, height, 1, /* src size */
|
||||
xoffset, yoffset, 0, /* dest offsets */
|
||||
texImage->Width * texImage->TexFormat->TexelBytes,
|
||||
|
|
@ -732,7 +798,9 @@ _mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level,
|
|||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint texelBytes = texImage->TexFormat->TexelBytes;
|
||||
_mesa_transfer_teximage(ctx, 3, texImage->TexFormat, texImage->Data,
|
||||
_mesa_transfer_teximage(ctx, 3,
|
||||
_mesa_base_tex_format(ctx, texImage->IntFormat),
|
||||
texImage->TexFormat, texImage->Data,
|
||||
width, height, depth, /* src size */
|
||||
xoffset, yoffset, xoffset, /* dest offsets */
|
||||
texImage->Width * texelBytes,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: texstore.h,v 1.6 2001/04/04 21:54:21 brianp Exp $ */
|
||||
/* $Id: texstore.h,v 1.7 2001/04/20 16:46:04 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
extern void
|
||||
_mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
||||
GLenum baseInternalFormat,
|
||||
const struct gl_texture_format *texDestFormat,
|
||||
GLvoid *texDestAddr,
|
||||
GLint srcWidth, GLint srcHeight, GLint srcDepth,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue