Browse Source

convolution for glTexImage[123]D now works

tags/mesa_3_5
Brian Paul 25 years ago
parent
commit
5a0d3dc7b3
1 changed files with 42 additions and 35 deletions
  1. 42
    35
      src/mesa/main/teximage.c

+ 42
- 35
src/mesa/main/teximage.c View File

@@ -1,4 +1,4 @@
/* $Id: teximage.c,v 1.42 2000/08/30 18:22:28 brianp Exp $ */
/* $Id: teximage.c,v 1.43 2000/08/31 15:24:39 brianp Exp $ */

/*
* Mesa 3-D graphics library
@@ -684,16 +684,27 @@ adjust_texture_size_for_convolution(const GLcontext *ctx, GLuint dimensions,
/*
* Called by glTexImage[123]D. Fill in a texture image with data given
* by the client. All pixel transfer and unpack modes are handled here.
* Input: dimensions (1, 2, or 3)
* texImage - destination texture image (we'll malloc the memory)
* width, height, depth - size of source image
* srcFormat, srcType - source image format and type
* pixels - source image data
* srcPacking - source image packing parameters
*
* NOTE: All texture image parameters should have already been error checked.
*
* NOTE: the texImage dimensions and source image dimensions must be correct
* with respect to convolution with border mode = reduce.
*/
static void
make_texture_image( GLcontext *ctx, GLuint dimensions,
struct gl_texture_image *texImage,
GLint width, GLint height, GLint depth,
GLenum srcFormat, GLenum srcType, const GLvoid *pixels,
const struct gl_pixelstore_attrib *srcPacking)
{
GLint components, numPixels;
GLint internalFormat, width, height, depth, border;
GLint internalFormat, border;

ASSERT(ctx);
ASSERT(texImage);
@@ -702,9 +713,6 @@ make_texture_image( GLcontext *ctx, GLuint dimensions,
ASSERT(srcPacking);

internalFormat = texImage->IntFormat;
width = texImage->Width;
height = texImage->Height;
depth = texImage->Depth;
border = texImage->Border;
components = components_in_intformat(internalFormat);

@@ -790,38 +798,38 @@ make_texture_image( GLcontext *ctx, GLuint dimensions,
/* color index texture */
const GLint destBytesPerRow = width * components * sizeof(GLubyte);
const GLenum dstType = GL_UNSIGNED_BYTE;
GLubyte *dest = texImage->Data;
GLubyte *destTex = texImage->Data;
GLint img, row;
for (img = 0; img < depth; img++) {
for (row = 0; row < height; row++) {
const GLvoid *srcAddr = _mesa_image_address(srcPacking,
pixels, width, height, srcFormat, srcType, img, row, 0);
_mesa_unpack_index_span(ctx, width, dstType, dest,
_mesa_unpack_index_span(ctx, width, dstType, destTex,
srcType, srcAddr, srcPacking,
ctx->ImageTransferState);
dest += destBytesPerRow;
destTex += destBytesPerRow;
}
}
}
else {
/* regular, color texture */
const GLint destBytesPerRow = width * components * sizeof(GLubyte);
GLint destBytesPerRow;
const GLenum dstFormat = texImage->Format;
GLubyte *dest = texImage->Data;
GLubyte *destTex = texImage->Data;
GLint img, row;
GLint w = width, h = height;
GLint convWidth = width, convHeight = height;

if ((dimensions == 1 && ctx->Pixel.Convolution1DEnabled) ||
(dimensions >= 2 &&
(ctx->Pixel.Convolution2DEnabled || ctx->Pixel.Separable2DEnabled)
)) {
GLfloat *tmpImage, *convImage;
tmpImage = (GLfloat *) MALLOC(width * height * sizeof(GLfloat));
tmpImage = (GLfloat *) MALLOC(width * height * 4 * sizeof(GLfloat));
if (!tmpImage) {
gl_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
return;
}
convImage = (GLfloat *) MALLOC(width * height * sizeof(GLfloat));
convImage = (GLfloat *) MALLOC(width * height * 4 * sizeof(GLfloat));
if (!convImage) {
gl_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
FREE(tmpImage);
@@ -844,34 +852,33 @@ make_texture_image( GLcontext *ctx, GLuint dimensions,

/* convolve */
if (dimensions == 1) {
if (ctx->Pixel.Convolution1DEnabled) {
_mesa_convolve_1d_image(ctx, &w, tmpImage, convImage);
}
ASSERT(ctx->Pixel.Convolution1DEnabled);
_mesa_convolve_1d_image(ctx, &convWidth, tmpImage, convImage);
}
else {
if (ctx->Pixel.Convolution2DEnabled) {
_mesa_convolve_2d_image(ctx, &w, &h, tmpImage, convImage);
_mesa_convolve_2d_image(ctx, &convWidth, &convHeight,
tmpImage, convImage);
}
else {
ASSERT(ctx->Pixel.Separable2DEnabled);
_mesa_convolve_sep_image(ctx, &w, &h, tmpImage, convImage);
_mesa_convolve_sep_image(ctx, &convWidth, &convHeight,
tmpImage, convImage);
}
}

/* transfer ops after convolution */
/* packing and transfer ops after convolution */
srcf = convImage;
for (row = 0; row < h; row++) {
GLvoid *dest;
dest = _mesa_image_address(&_mesa_native_packing, pixels,
w, h, GL_RGBA, GL_UNSIGNED_BYTE,
0, row, 0);
_mesa_pack_float_rgba_span(ctx, w,
destBytesPerRow = convWidth * components * sizeof(GLubyte);
for (row = 0; row < convHeight; row++) {
_mesa_pack_float_rgba_span(ctx, convWidth,
(const GLfloat (*)[4]) srcf,
dstFormat, GL_UNSIGNED_BYTE,
dest, &_mesa_native_packing,
destTex, &_mesa_native_packing,
ctx->ImageTransferState
& IMAGE_POST_CONVOLUTION_BITS);
srcf += w * 4;
srcf += convWidth * 4;
destTex += destBytesPerRow;
}
}

@@ -884,10 +891,10 @@ make_texture_image( GLcontext *ctx, GLuint dimensions,
for (row = 0; row < height; row++) {
const GLvoid *srcAddr = _mesa_image_address(srcPacking,
pixels, width, height, srcFormat, srcType, img, row, 0);
_mesa_unpack_ubyte_color_span(ctx, width, dstFormat, dest,
_mesa_unpack_ubyte_color_span(ctx, width, dstFormat, destTex,
srcFormat, srcType, srcAddr, srcPacking,
ctx->ImageTransferState);
dest += destBytesPerRow;
destTex += destBytesPerRow;
}
}
}
@@ -1587,8 +1594,8 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
}
if (retain || !success) {
/* make internal copy of the texture image */
make_texture_image(ctx, 1, texImage, format, type,
pixels, &ctx->Unpack);
make_texture_image(ctx, 1, texImage, width, 1, 1,
format, type, pixels, &ctx->Unpack);
if (!success && ctx->Driver.TexImage1D) {
/* let device driver try to use unpacked image */
(*ctx->Driver.TexImage1D)( ctx, target, level, texImage->Format,
@@ -1718,8 +1725,8 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
}
if (retain || !success) {
/* make internal copy of the texture image */
make_texture_image(ctx, 2, texImage, format, type,
pixels, &ctx->Unpack);
make_texture_image(ctx, 2, texImage, width, height, 1,
format, type, pixels, &ctx->Unpack);
if (!success && ctx->Driver.TexImage2D) {
/* let device driver try to use unpacked image */
(*ctx->Driver.TexImage2D)( ctx, target, level, texImage->Format,
@@ -1854,8 +1861,8 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
}
if (retain || !success) {
/* make internal copy of the texture image */
make_texture_image(ctx, 3, texImage, format, type,
pixels, &ctx->Unpack);
make_texture_image(ctx, 3, texImage, width, height, depth,
format, type, pixels, &ctx->Unpack);
if (!success && ctx->Driver.TexImage3D) {
/* let device driver try to use unpacked image */
(*ctx->Driver.TexImage3D)( ctx, target, level, texImage->Format,

Loading…
Cancel
Save