Browse Source

use new texture conversion code, still have to do image rescaling

tags/mesa_3_5
Brian Paul 24 years ago
parent
commit
935d5e5daa
1 changed files with 43 additions and 71 deletions
  1. 43
    71
      src/mesa/drivers/glide/fxddtex.c

+ 43
- 71
src/mesa/drivers/glide/fxddtex.c View File

@@ -51,6 +51,7 @@
#include "fxdrv.h"
#include "image.h"
#include "teximage.h"
#include "texformat.h"
#include "texstore.h"
#include "texutil.h"

@@ -1036,7 +1037,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
GrTextureFormat_t gldformat;
tfxTexInfo *ti;
tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage);
MesaIntTexFormat mesaFormat;
const struct gl_texture_format *mesaTexFormat;
GLint texelSize;
GLboolean success;

@@ -1071,7 +1072,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_INTENSITY;
texImage->FetchTexel = fetch_intensity8;
texelSize = 1;
mesaFormat = MESA_I8;
mesaTexFormat = &_mesa_texformat_i8;
break;
case 1:
case GL_LUMINANCE:
@@ -1082,7 +1083,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_LUMINANCE;
texImage->FetchTexel = fetch_luminance8;
texelSize = 1;
mesaFormat = MESA_L8;
mesaTexFormat = &_mesa_texformat_l8;
break;
case GL_ALPHA:
case GL_ALPHA4:
@@ -1092,7 +1093,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_ALPHA;
texImage->FetchTexel = fetch_alpha8;
texelSize = 1;
mesaFormat = MESA_A8;
mesaTexFormat = &_mesa_texformat_a8;
break;
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
@@ -1104,7 +1105,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_COLOR_INDEX;
texImage->FetchTexel = fetch_index8;
texelSize = 1;
mesaFormat = MESA_C8;
mesaTexFormat = &_mesa_texformat_ci8;
break;
case 2:
case GL_LUMINANCE_ALPHA:
@@ -1117,7 +1118,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_LUMINANCE_ALPHA;
texImage->FetchTexel = fetch_luminance8_alpha8;
texelSize = 2;
mesaFormat = MESA_A8_L8;
mesaTexFormat = &_mesa_texformat_al88;
break;
case 3:
case GL_RGB:
@@ -1131,7 +1132,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_RGB;
texImage->FetchTexel = fetch_r5g6b5;
texelSize = 2;
mesaFormat = MESA_R5_G6_B5;
mesaTexFormat = &_mesa_texformat_rgb565;
break;
case 4:
case GL_RGBA:
@@ -1144,20 +1145,20 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
texImage->Format = GL_RGBA;
texImage->FetchTexel = fetch_r4g4b4a4;
texelSize = 2;
mesaFormat = MESA_A4_R4_G4_B4;
mesaTexFormat = &_mesa_texformat_argb4444;
break;
case GL_RGB5_A1:
texImage->Format = GL_RGBA;
texImage->FetchTexel = fetch_r5g5b5a1;
texelSize = 2;
mesaFormat = MESA_A1_R5_G5_B5;
mesaTexFormat = &_mesa_texformat_argb1555;
break;
default:
_mesa_problem(NULL, "tdfx driver: texbuildimagemap() bad format");
return;
}

_mesa_set_teximage_component_sizes(mesaFormat, texImage);
texImage->TexFormat = mesaTexFormat;
texImage->Type = 0; /* indicates a driver-specific format */

/* allocate storage for texture image */
@@ -1169,14 +1170,18 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
fxTexInvalidate(ctx, texObj);

/* store the texture image */
/* XXX check for image rescale */
if (ctx->_ImageTransferState) {
success = GL_FALSE;
success = GL_FALSE; /* Can't do image transfer ops here */
}
else {
success = _mesa_convert_teximage(mesaFormat, mml->width, mml->height,
texImage->Data, mml->width * texelSize,
width, height,
format, type, pixels, packing);
success = _mesa_convert_texsubimage2d(mesaTexFormat->IntFormat,
0, 0, /* xoffset, yoffset */
mml->width, mml->height,
mml->width, /* destImageWidth */
format, type, /* user fmt/type */
packing, /* user packing params */
pixels, texImage->Data);
}

if (!success) {
@@ -1203,11 +1208,14 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
format, type, pixels, packing /* src info */ );

/* this conversion better work! */
success = _mesa_convert_teximage(mesaFormat, mml->width, mml->height,
texImage->Data, mml->width * texelSize,
width, height,
simpleFormat, CHAN_TYPE, tempImage,
&_mesa_native_packing);
success = _mesa_convert_texsubimage2d(mesaTexFormat->IntFormat,
0, 0, /* xoffset, yoffset */
mml->width, mml->height,
mml->width, /* destImageWidth */
simpleFormat, /* source format */
CHAN_TYPE, /* source type */
&_mesa_native_packing,
tempImage, texImage->Data);
assert(success);
FREE(tempImage);
}
@@ -1234,10 +1242,8 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
{
fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
tfxTexInfo *ti;
GLint texelSize;
tfxMipMapLevel *mml;
GLboolean success;
MesaIntTexFormat mesaFormat;

if (!texObj->DriverData) {
_mesa_problem(ctx, "problem in fxDDTexSubImage2D");
@@ -1250,52 +1256,19 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
assert(mml);

assert(texImage->Data); /* must have an existing texture image! */
assert(texImage->Format);

switch (mml->glideFormat) {
case GR_TEXFMT_INTENSITY_8:
texelSize = 1;
mesaFormat = MESA_I8;
break;
case GR_TEXFMT_ALPHA_8:
texelSize = 1;
mesaFormat = MESA_A8;
break;
case GR_TEXFMT_P_8:
texelSize = 1;
mesaFormat = MESA_C8;
break;
case GR_TEXFMT_ALPHA_INTENSITY_88:
texelSize = 2;
mesaFormat = MESA_A8_L8;
break;
case GR_TEXFMT_RGB_565:
texelSize = 2;
mesaFormat = MESA_R5_G6_B5;
break;
case GR_TEXFMT_ARGB_4444:
texelSize = 2;
mesaFormat = MESA_A4_R4_G4_B4;
break;
case GR_TEXFMT_ARGB_1555:
texelSize = 2;
mesaFormat = MESA_A1_R5_G5_B5;
break;
default:
_mesa_problem(NULL, "tdfx driver: fxTexBuildSubImageMap() bad format");
return;
}

/* XXX check for image rescale */
if (ctx->_ImageTransferState) {
success = GL_FALSE;
}
else {
success = _mesa_convert_texsubimage(mesaFormat, xoffset, yoffset,
mml->width, mml->height,
texImage->Data,
mml->width * texelSize,
width, height,
texImage->Width, texImage->Height,
format, type, pixels, packing);
success = _mesa_convert_texsubimage2d(texImage->TexFormat->IntFormat,
xoffset, yoffset,
width, height,
mml->width,
format, type, packing,
pixels, texImage->Data);
}

if (!success) {
@@ -1324,14 +1297,13 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
format, type, pixels, packing /* src info */ );

/* this conversion better work! */
success = _mesa_convert_texsubimage(mesaFormat, xoffset, yoffset,
mml->width, mml->height,
texImage->Data, mml->width * texelSize, /* dstRowStride */
width * mml->wScale,
height * mml->hScale,
width, height,
simpleFormat, CHAN_TYPE, tempImage,
&_mesa_native_packing);
success = _mesa_convert_texsubimage2d(texImage->TexFormat->IntFormat,
xoffset, yoffset,
width, height,
mml->width,
simpleFormat, CHAN_TYPE,
&_mesa_native_packing,
tempImage, texImage->Data);
assert(success);
FREE(tempImage);
}

Loading…
Cancel
Save