diff options
author | brianp <brianp> | 2000-03-29 18:19:06 +0000 |
---|---|---|
committer | brianp <brianp> | 2000-03-29 18:19:06 +0000 |
commit | 1074f62a00b23a0b852b5a5b789b583cd294d1eb (patch) | |
tree | 34aebced6f618ecf685a8698143d8163ba0fe19c /xc | |
parent | 7bd593d92a0d9df0957d687ead58615f485a53c7 (diff) |
new texture image interface and optimizations
Diffstat (limited to 'xc')
-rw-r--r-- | xc/extras/Mesa/src/FX/fxdd.c | 24 | ||||
-rw-r--r-- | xc/extras/Mesa/src/FX/fxddtex.c | 1120 | ||||
-rw-r--r-- | xc/extras/Mesa/src/FX/fxdrv.h | 30 | ||||
-rw-r--r-- | xc/extras/Mesa/src/FX/fxsetup.c | 2 | ||||
-rw-r--r-- | xc/extras/Mesa/src/FX/fxtexman.c | 9 | ||||
-rw-r--r-- | xc/extras/Mesa/src/context.c | 12 | ||||
-rw-r--r-- | xc/extras/Mesa/src/dd.h | 1 | ||||
-rw-r--r-- | xc/extras/Mesa/src/teximage.c | 59 | ||||
-rw-r--r-- | xc/extras/Mesa/src/teximage.h | 8 | ||||
-rw-r--r-- | xc/extras/Mesa/src/texobj.c | 12 | ||||
-rw-r--r-- | xc/extras/Mesa/src/texture.c | 69 |
11 files changed, 569 insertions, 777 deletions
diff --git a/xc/extras/Mesa/src/FX/fxdd.c b/xc/extras/Mesa/src/FX/fxdd.c index 3fdb60c2c..35dbf5a15 100644 --- a/xc/extras/Mesa/src/FX/fxdd.c +++ b/xc/extras/Mesa/src/FX/fxdd.c @@ -572,7 +572,7 @@ static const GLubyte *fxDDGetString(GLcontext *ctx, GLenum name) } } /* now make the GL_RENDERER string */ - sprintf(buffer, "Mesa DRI %s 20000322", hardware); + sprintf(buffer, "Mesa DRI %s 20000329", hardware); return buffer; } case GL_VENDOR: @@ -841,17 +841,20 @@ static GLboolean fxIsInHardware(GLcontext *ctx) return GL_FALSE; } - if((ctx->Texture.ReallyEnabled & TEXTURE0_2D) && - (ctx->Texture.Unit[0].EnvMode==GL_BLEND)) { - return GL_FALSE; + if (ctx->Texture.ReallyEnabled & TEXTURE0_2D) { + if (ctx->Texture.Unit[0].EnvMode == GL_BLEND) + return GL_FALSE; + if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0) + return GL_FALSE; } - if((ctx->Texture.ReallyEnabled & TEXTURE1_2D) && - (ctx->Texture.Unit[1].EnvMode==GL_BLEND)) { - return GL_FALSE; + if (ctx->Texture.ReallyEnabled & TEXTURE1_2D) { + if (ctx->Texture.Unit[1].EnvMode == GL_BLEND) + return GL_FALSE; + if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0) + return GL_FALSE; } - if (MESA_VERBOSE & (VERBOSE_DRIVER|VERBOSE_TEXTURE)) fprintf(stderr, "fxMesa: fxIsInHardware, envmode is %s/%s\n", gl_lookup_enum_by_nr(ctx->Texture.Unit[0].EnvMode), @@ -987,9 +990,10 @@ void fxSetupDDPointers(GLcontext *ctx) ctx->Driver.RenderStart=NULL; ctx->Driver.RenderFinish=NULL; + ctx->Driver.TexImage2D = fxDDTexImage2D; + ctx->Driver.TexSubImage2D = fxDDTexSubImage2D; + ctx->Driver.GetTexImage = fxDDGetTexImage; ctx->Driver.TexEnv=fxDDTexEnv; - ctx->Driver.TexImage=fxDDTexImg; - ctx->Driver.TexSubImage=fxDDTexSubImg; ctx->Driver.TexParameter=fxDDTexParam; ctx->Driver.BindTexture=fxDDTexBind; ctx->Driver.DeleteTexture=fxDDTexDel; diff --git a/xc/extras/Mesa/src/FX/fxddtex.c b/xc/extras/Mesa/src/FX/fxddtex.c index f1ba481e6..6f817ccaa 100644 --- a/xc/extras/Mesa/src/FX/fxddtex.c +++ b/xc/extras/Mesa/src/FX/fxddtex.c @@ -50,6 +50,9 @@ #if defined(FX) #include "fxdrv.h" +#include "image.h" +#include "texutil.h" + void fxPrintTextureData(tfxTexInfo *ti) { @@ -129,7 +132,6 @@ static tfxTexInfo *fxAllocTexObjData(fxMesaContext fxMesa) ti->LODblend=FXFALSE; for(i=0;i<MAX_TEXTURE_LEVELS;i++) { - ti->mipmapLevel[i].used=GL_FALSE; ti->mipmapLevel[i].data=NULL; } @@ -677,752 +679,476 @@ int fxTexGetInfo(int w, int h, GrLOD_t *lodlevel, GrAspectRatio_t *ar, void fxTexGetFormat(GLenum glformat, GrTextureFormat_t *tfmt, GLint *ifmt) { switch(glformat) { - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - if(tfmt) - (*tfmt)=GR_TEXFMT_INTENSITY_8; - if(ifmt) - (*ifmt)=GL_LUMINANCE; - break; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ALPHA_INTENSITY_88; - if(ifmt) - (*ifmt)=GL_LUMINANCE_ALPHA; - break; - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ALPHA_8; - if(ifmt) - (*ifmt)=GL_INTENSITY; - break; - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ALPHA_8; - if(ifmt) - (*ifmt)=GL_ALPHA; - break; - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - if(tfmt) - (*tfmt)=GR_TEXFMT_RGB_565; - if(ifmt) - (*ifmt)=GL_RGB; - break; - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - if(tfmt) - (*tfmt)=GR_TEXFMT_ARGB_4444; - if(ifmt) - (*ifmt)=GL_RGBA; - break; - case GL_RGB5_A1: - if(tfmt) - (*tfmt)=GR_TEXFMT_ARGB_1555; - if(ifmt) - (*ifmt)=GL_RGBA; - break; - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - if(tfmt) - (*tfmt)=GR_TEXFMT_P_8; - if(ifmt) - (*ifmt)=GL_RGBA; - break; - default: - fprintf(stderr,"fx Driver: unsupported internalFormat in fxTexGetFormat()\n"); - fxCloseHardware(); - exit(-1); - break; + case 1: + case GL_LUMINANCE: + case GL_LUMINANCE4: + case GL_LUMINANCE8: + case GL_LUMINANCE12: + case GL_LUMINANCE16: + if(tfmt) + (*tfmt)=GR_TEXFMT_INTENSITY_8; + if(ifmt) + (*ifmt)=GL_LUMINANCE; + break; + case 2: + case GL_LUMINANCE_ALPHA: + case GL_LUMINANCE4_ALPHA4: + case GL_LUMINANCE6_ALPHA2: + case GL_LUMINANCE8_ALPHA8: + case GL_LUMINANCE12_ALPHA4: + case GL_LUMINANCE12_ALPHA12: + case GL_LUMINANCE16_ALPHA16: + if(tfmt) + (*tfmt)=GR_TEXFMT_ALPHA_INTENSITY_88; + if(ifmt) + (*ifmt)=GL_LUMINANCE_ALPHA; + break; + case GL_INTENSITY: + case GL_INTENSITY4: + case GL_INTENSITY8: + case GL_INTENSITY12: + case GL_INTENSITY16: + if(tfmt) + (*tfmt)=GR_TEXFMT_ALPHA_8; + if(ifmt) + (*ifmt)=GL_INTENSITY; + break; + case GL_ALPHA: + case GL_ALPHA4: + case GL_ALPHA8: + case GL_ALPHA12: + case GL_ALPHA16: + if(tfmt) + (*tfmt)=GR_TEXFMT_ALPHA_8; + if(ifmt) + (*ifmt)=GL_ALPHA; + break; + case 3: + case GL_RGB: + case GL_R3_G3_B2: + case GL_RGB4: + case GL_RGB5: + case GL_RGB8: + case GL_RGB10: + case GL_RGB12: + case GL_RGB16: + if(tfmt) + (*tfmt)=GR_TEXFMT_RGB_565; + if(ifmt) + (*ifmt)=GL_RGB; + break; + case 4: + case GL_RGBA: + case GL_RGBA2: + case GL_RGBA4: + case GL_RGBA8: + case GL_RGB10_A2: + case GL_RGBA12: + case GL_RGBA16: + if(tfmt) + (*tfmt)=GR_TEXFMT_ARGB_4444; + if(ifmt) + (*ifmt)=GL_RGBA; + break; + case GL_RGB5_A1: + if(tfmt) + (*tfmt)=GR_TEXFMT_ARGB_1555; + if(ifmt) + (*ifmt)=GL_RGBA; + break; + case GL_COLOR_INDEX: + case GL_COLOR_INDEX1_EXT: + case GL_COLOR_INDEX2_EXT: + case GL_COLOR_INDEX4_EXT: + case GL_COLOR_INDEX8_EXT: + case GL_COLOR_INDEX12_EXT: + case GL_COLOR_INDEX16_EXT: + if(tfmt) + (*tfmt)=GR_TEXFMT_P_8; + if(ifmt) + (*ifmt)=GL_RGBA; /* XXX why is this RGBA? */ + break; + default: + fprintf(stderr, + "fx Driver: unsupported internalFormat in fxTexGetFormat()\n"); + fxCloseHardware(); + exit(-1); + break; } } -static int fxIsTexSupported(GLenum target, GLint internalFormat, - const struct gl_texture_image *image) +static GLboolean fxIsTexSupported(GLenum target, GLint internalFormat, + const struct gl_texture_image *image) { - if(target!=GL_TEXTURE_2D) - return GL_FALSE; - - switch(internalFormat) { - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - case GL_RGB5_A1: - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - break; - default: - return GL_FALSE; - } - - if(image->Width>256) - return GL_FALSE; - - if(image->Height>256) + if(target != GL_TEXTURE_2D) return GL_FALSE; if(!fxTexGetInfo(image->Width,image->Height,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL)) return GL_FALSE; + if (image->Border > 0) + return GL_FALSE; + return GL_TRUE; } -static void fxTexBuildImageMap(const struct gl_texture_image *image, - GLint internalFormat, unsigned short **dest, - GLboolean *istranslate) -{ - unsigned short *src; - unsigned char *data; - int x,y,w,h,wscale,hscale,idx; - - fxTexGetInfo(image->Width,image->Height,NULL,NULL,NULL,NULL,NULL,NULL, - &wscale,&hscale); - w=image->Width*wscale; - h=image->Height*hscale; - - data=image->Data; - switch(internalFormat) { - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - /* Optimized for GLQuake */ - - if(wscale==hscale==1) { - (*istranslate)=GL_FALSE; - - (*dest)=(unsigned short *)data; - } else { - unsigned char *srcb; - - (*istranslate)=GL_TRUE; - - if(!(*dest)) { - if(!((*dest)=src=(unsigned short *)MALLOC(sizeof(unsigned char)*w*h))) { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - } else - src=(*dest); - - srcb=(unsigned char *)src; - - for(y=0;y<h;y++) - for(x=0;x<w;x++) { - idx=(x/wscale+(y/hscale)*(w/wscale)); - srcb[x+y*w]=data[idx]; - } - } - break; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - (*istranslate)=GL_TRUE; - - if(!(*dest)) { - if(!((*dest)=src=(unsigned short *)MALLOC(sizeof(unsigned short)*w*h))) { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - } else - src=(*dest); - - if(wscale==hscale==1) { - int i=0; - int lenght=h*w; - unsigned short a,l; - - while(i++<lenght) { - l=*data++; - a=*data++; - *src++=(a << 8) | l; - } - } else { - unsigned short a,l; - - for(y=0;y<h;y++) - for(x=0;x<w;x++) { - idx=(x/wscale+(y/hscale)*(w/wscale))*2; - l=data[idx]; - a=data[idx+1]; - - src[x+y*w]=(a << 8) | l; - } - } - break; - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - (*istranslate)=GL_TRUE; - - if(!(*dest)) { - if(!((*dest)=src=(unsigned short *)MALLOC(sizeof(unsigned short)*w*h))) { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - } else - src=(*dest); - - if(wscale==hscale==1) { - int i=0; - int lenght=h*w; - unsigned int r,g,b; - - while(i++<lenght) { - r=*data++; - g=*data++; - b=*data++; - - *src++=((0xf8 & r) << (11-3)) | - ((0xfc & g) << (5-3+1)) | - ((0xf8 & b) >> 3); - } - } else { - unsigned int r,g,b; - - for(y=0;y<h;y++) - for(x=0;x<w;x++) { - idx=(x/wscale+(y/hscale)*(w/wscale))*3; - r=data[idx]; - g=data[idx+1]; - b=data[idx+2]; - - src[x+y*w]=((0xf8 & r) << (11-3)) | - ((0xfc & g) << (5-3+1)) | - ((0xf8 & b) >> 3); - } - } - break; - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - (*istranslate)=GL_TRUE; - - if(!(*dest)) { - if(!((*dest)=src=(unsigned short *)MALLOC(sizeof(unsigned short)*w*h))) { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - } else - src=(*dest); - - if(wscale==hscale==1) { - int i=0; - int lenght=h*w; - unsigned int r,g,b,a; - - while(i++<lenght) { - r=*data++; - g=*data++; - b=*data++; - a=*data++; - - *src++=((0xf0 & a) << 8) | - ((0xf0 & r) << 4) | - (0xf0 & g) | - ((0xf0 & b) >> 4); - } - } else { - unsigned int r,g,b,a; - - for(y=0;y<h;y++) - for(x=0;x<w;x++) { - idx=(x/wscale+(y/hscale)*(w/wscale))*4; - r=data[idx]; - g=data[idx+1]; - b=data[idx+2]; - a=data[idx+3]; - - src[x+y*w]=((0xf0 & a) << 8) | - ((0xf0 & r) << 4) | - (0xf0 & g) | - ((0xf0 & b) >> 4); - } - } - break; - case GL_RGB5_A1: - (*istranslate)=GL_TRUE; - - if(!(*dest)) { - if(!((*dest)=src=(unsigned short *)malloc(sizeof(unsigned short)*w*h))) { - fprintf(stderr,"fx Driver: out of memory !\n"); - fxCloseHardware(); - exit(-1); - } - } else - src=(*dest); - - if(wscale==hscale==1) { - int i=0; - int lenght=h*w; - unsigned r,g,b,a; - - while(i++<lenght) { - r=*data++; - g=*data++; - b=*data++; - a=*data++; - *src++=((0x80 & a) << 8) | - ((0xf8 & r) << 7) | - ((0xf8 & g) << 2) | - ((0xf8 & b) >> 3); - } - } else { - unsigned r,g,b,a; - - for(y=0;y<h;y++) - for(x=0;x<w;x++) { - idx=(x/wscale+(y/hscale)*(w/wscale))*4; - r=data[idx]; - g=data[idx+1]; - b=data[idx+2]; - a=data[idx+3]; - - src[x+y*w]=((0x80 & a) << 8) | - ((0xf8 & r) << 7) | - ((0xf8 & g) << 2) | - ((0xf8 & b) >> 3); - } - } - break; - default: - fprintf(stderr,"fx Driver: wrong internalFormat in texbuildimagemap()\n"); - fxCloseHardware(); - exit(-1); - break; - } -} +/**********************************************************************/ +/**** NEW TEXTURE IMAGE FUNCTIONS ****/ +/**********************************************************************/ -void fxDDTexImg(GLcontext *ctx, GLenum target, - struct gl_texture_object *tObj, GLint level, GLint internalFormat, - const struct gl_texture_image *image) +GLboolean fxDDTexImage2D(GLcontext *ctx, GLenum target, GLint level, + GLenum format, GLenum type, const GLvoid *pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage, + GLboolean *retainInternalCopy) { - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - tfxTexInfo *ti; + fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr, - "fxmesa: (%d) fxDDTexImg(...,level=%d,target=%d,format=%x,width=%d,height=%d...)\n", - tObj->Name, level, target, internalFormat, image->Width, - image->Height); - } - - if(target!=GL_TEXTURE_2D) - return; + if (target != GL_TEXTURE_2D) + return GL_FALSE; - if (!tObj->DriverData) - tObj->DriverData=fxAllocTexObjData(fxMesa); + if (!texObj->DriverData) + texObj->DriverData = fxAllocTexObjData(fxMesa); - ti=fxTMGetTexInfo(tObj); - - if(fxIsTexSupported(target,internalFormat,image)) { + if (fxIsTexSupported(target, texImage->IntFormat, texImage)) { GrTextureFormat_t gldformat; - tfxMipMapLevel *mml=&ti->mipmapLevel[level]; + tfxTexInfo *ti = fxTMGetTexInfo(texObj); + tfxMipMapLevel *mml = &ti->mipmapLevel[level]; + GLint dstWidth, dstHeight, wScale, hScale, texelSize, dstStride; + MesaIntTexFormat intFormat; + + fxTexGetFormat(texImage->IntFormat, &gldformat, NULL); - fxTexGetFormat(internalFormat,&gldformat,NULL); + fxTexGetInfo(texImage->Width, texImage->Height, NULL,NULL,NULL,NULL, + NULL,NULL, &wScale, &hScale); - if(mml->used) { - if((mml->glideFormat==gldformat) && - (mml->width==image->Width) && - (mml->height==image->Height)) { - fxTexBuildImageMap(image,internalFormat,&(mml->data), - &(mml->translated)); - - if(ti->validated && ti->isInTM) - fxTMReloadMipMapLevel(fxMesa,tObj,level); - else - fxTexInvalidate(ctx,tObj); - - return; - } else { - if(mml->translated) - FREE(mml->data); - mml->data=NULL; - } + dstWidth = texImage->Width * wScale; + dstHeight = texImage->Height * hScale; + + switch (texImage->IntFormat) { + case GL_INTENSITY: + case GL_INTENSITY4: + case GL_INTENSITY8: + case GL_INTENSITY12: + case GL_INTENSITY16: + texelSize = 1; + intFormat = MESA_I8; + break; + case 1: + case GL_LUMINANCE: + case GL_LUMINANCE4: + case GL_LUMINANCE8: + case GL_LUMINANCE12: + case GL_LUMINANCE16: + texelSize = 1; + intFormat = MESA_L8; + break; + case GL_ALPHA: + case GL_ALPHA4: + case GL_ALPHA8: + case GL_ALPHA12: + case GL_ALPHA16: + texelSize = 1; + intFormat = MESA_A8; + break; + case GL_COLOR_INDEX: + case GL_COLOR_INDEX1_EXT: + case GL_COLOR_INDEX2_EXT: + case GL_COLOR_INDEX4_EXT: + case GL_COLOR_INDEX8_EXT: + case GL_COLOR_INDEX12_EXT: + case GL_COLOR_INDEX16_EXT: + texelSize = 1; + intFormat = MESA_C8; + break; + case 2: + case GL_LUMINANCE_ALPHA: + case GL_LUMINANCE4_ALPHA4: + case GL_LUMINANCE6_ALPHA2: + case GL_LUMINANCE8_ALPHA8: + case GL_LUMINANCE12_ALPHA4: + case GL_LUMINANCE12_ALPHA12: + case GL_LUMINANCE16_ALPHA16: + texelSize = 2; + intFormat = MESA_A8_L8; + break; + case 3: + case GL_RGB: + case GL_R3_G3_B2: + case GL_RGB4: + case GL_RGB5: + case GL_RGB8: + case GL_RGB10: + case GL_RGB12: + case GL_RGB16: + texelSize = 2; + intFormat = MESA_R5_G6_B5; + break; + case 4: + case GL_RGBA: + case GL_RGBA2: + case GL_RGBA4: + case GL_RGBA8: + case GL_RGB10_A2: + case GL_RGBA12: + case GL_RGBA16: + texelSize = 2; + intFormat = MESA_A4_R4_G4_B4; + break; + case GL_RGB5_A1: + texelSize = 2; + intFormat = MESA_A1_R5_G5_B5; + break; + default: + gl_problem(NULL, "tdfx driver: texbuildimagemap() bad format"); + return GL_FALSE; } - mml->glideFormat=gldformat; - mml->width=image->Width; - mml->height=image->Height; - mml->used=GL_TRUE; + _mesa_set_teximage_component_sizes(intFormat, texImage); + + /*printf("teximage:\n");*/ + /* allocate new storage for texture image, if needed */ + if (!mml->data || mml->glideFormat != gldformat || + mml->width != dstWidth || mml->height != dstHeight) { + if (mml->data) + FREE(mml->data); + mml->data = MALLOC(dstWidth * dstHeight * texelSize); + if (!mml->data) + return GL_FALSE; + mml->glideFormat = gldformat; + mml->width = dstWidth; + mml->height = dstHeight; + fxTexInvalidate(ctx, texObj); + } - fxTexBuildImageMap(image,internalFormat,&(mml->data), - &(mml->translated)); + dstStride = dstWidth * texelSize; - fxTexInvalidate(ctx,tObj); - } -#ifndef FX_SILENT - else - fprintf(stderr,"fx Driver: unsupported texture in fxDDTexImg()\n"); -#endif -} - -static void fxTexBuildSubImageMap(const struct gl_texture_image *image, - GLint internalFormat, - GLint xoffset, GLint yoffset, GLint width, GLint height, - unsigned short *destimg) -{ - fxTexGetInfo(image->Width,image->Height,NULL,NULL,NULL,NULL,NULL,NULL, - NULL,NULL); - - switch(internalFormat) { - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - { - - int y; - unsigned char *bsrc,*bdst; - - bsrc=(unsigned char *)(image->Data+(yoffset*image->Width+xoffset)); - bdst=((unsigned char *)destimg)+(yoffset*image->Width+xoffset); - - for(y=0;y<height;y++) { - MEMCPY(bdst,bsrc,width); - bsrc += image->Width; - bdst += image->Width; - } - } - break; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - { - int x,y; - unsigned char *src; - unsigned short *dst,a,l; - int simgw,dimgw; - - src=(unsigned char *)(image->Data+(yoffset*image->Width+xoffset)*2); - dst=destimg+(yoffset*image->Width+xoffset); - - simgw=(image->Width-width)*2; - dimgw=image->Width-width; - for(y=0;y<height;y++) { - for(x=0;x<width;x++) { - l=*src++; - a=*src++; - *dst++=(a << 8) | l; - } - - src += simgw; - dst += dimgw; - } + /* store the texture image */ + if (!_mesa_convert_teximage(intFormat, dstWidth, dstHeight, mml->data, + dstStride, + texImage->Width, texImage->Height, + format, type, pixels, packing)) { + return GL_FALSE; } - break; - case 3: - case GL_RGB: - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - { - int x,y; - unsigned char *src; - unsigned short *dst,r,g,b; - int simgw,dimgw; - - src=(unsigned char *)(image->Data+(yoffset*image->Width+xoffset)*3); - dst=destimg+(yoffset*image->Width+xoffset); - simgw=(image->Width-width)*3; - dimgw=image->Width-width; - for(y=0;y<height;y++) { - for(x=0;x<width;x++) { - r=*src++; - g=*src++; - b=*src++; - *dst++=((0xf8 & r) << (11-3)) | - ((0xfc & g) << (5-3+1)) | - ((0xf8 & b) >> 3); - } - - src += simgw; - dst += dimgw; - } + if (ti->validated && ti->isInTM) { + /*printf("reloadmipmaplevels\n");*/ + fxTMReloadMipMapLevel(fxMesa, texObj, level); } - break; - case 4: - case GL_RGBA: - case GL_RGBA2: - case GL_RGBA4: - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - { - int x,y; - unsigned char *src; - unsigned short *dst,r,g,b,a; - int simgw,dimgw; - - src=(unsigned char *)(image->Data+(yoffset*image->Width+xoffset)*4); - dst=destimg+(yoffset*image->Width+xoffset); - - simgw=(image->Width-width)*4; - dimgw=image->Width-width; - for(y=0;y<height;y++) { - for(x=0;x<width;x++) { - r=*src++; - g=*src++; - b=*src++; - a=*src++; - *dst++=((0xf0 & a) << 8) | - ((0xf0 & r) << 4) | - (0xf0 & g) | - ((0xf0 & b) >> 4); - } - - src += simgw; - dst += dimgw; - } - } - break; - case GL_RGB5_A1: - { - int x,y; - unsigned char *src; - unsigned short *dst,r,g,b,a; - int simgw,dimgw; - - src=(unsigned char *)(image->Data+(yoffset*image->Width+xoffset)*4); - dst=destimg+(yoffset*image->Width+xoffset); - - simgw=(image->Width-width)*4; - dimgw=image->Width-width; - for(y=0;y<height;y++) { - for(x=0;x<width;x++) { - r=*src++; - g=*src++; - b=*src++; - a=*src++; - *dst++= - ((0x80 & a) << 8) | - ((0xf8 & r) << 7) | - ((0xf8 & g) << 2) | - ((0xf8 & b) >> 3); - } - - src += simgw; - dst += dimgw; - } + else { + /*printf("invalidate2\n");*/ + fxTexInvalidate(ctx,texObj); } - break; - default: - fprintf(stderr,"fx Driver: wrong internalFormat in fxTexBuildSubImageMap()\n"); - fxCloseHardware(); - exit(-1); - break; + + *retainInternalCopy = GL_FALSE; + return GL_TRUE; + } + else { + gl_problem(NULL, "fx Driver: unsupported texture in fxDDTexImg()\n"); + return GL_FALSE; } } - -void fxDDTexSubImg(GLcontext *ctx, GLenum target, - struct gl_texture_object *tObj, GLint level, - GLint xoffset, GLint yoffset, GLint width, GLint height, - GLint internalFormat, const struct gl_texture_image *image) + +GLboolean fxDDTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, const GLvoid *pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage) { - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; + fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx; tfxTexInfo *ti; - GrTextureFormat_t gldformat; - int wscale,hscale; + GLint wscale, hscale, dstStride; tfxMipMapLevel *mml; + GLboolean result; - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr, - "fxmesa: (%d) fxDDTexSubImg(level=%d,target=%d,format=%x,width=%d,height=%d)\n", - tObj->Name, level, target, internalFormat, image->Width, - image->Height); - } + if (target != GL_TEXTURE_2D) + return GL_FALSE; - if(target!=GL_TEXTURE_2D) - return; + if (!texObj->DriverData) + return GL_FALSE; - if (!tObj->DriverData) - return; + ti = fxTMGetTexInfo(texObj); + mml = &ti->mipmapLevel[level]; - ti=fxTMGetTexInfo(tObj); - mml=&ti->mipmapLevel[level]; + fxTexGetInfo( texImage->Width, texImage->Height, NULL,NULL,NULL,NULL, + NULL,NULL, &wscale, &hscale); - fxTexGetFormat(internalFormat,&gldformat,NULL); + assert(mml->data); /* must have an existing texture image! */ - if(mml->glideFormat!=gldformat) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: ti->info.format!=format in fxDDTexSubImg()\n"); - } - fxDDTexImg(ctx,target,tObj,level,internalFormat,image); + switch (mml->glideFormat) { + case GR_TEXFMT_INTENSITY_8: + dstStride = mml->width; + result = _mesa_convert_texsubimage(MESA_I8, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + case GR_TEXFMT_ALPHA_8: + dstStride = mml->width; + result = _mesa_convert_texsubimage(MESA_A8, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + case GR_TEXFMT_P_8: + dstStride = mml->width; + result = _mesa_convert_texsubimage(MESA_C8, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + case GR_TEXFMT_ALPHA_INTENSITY_88: + dstStride = mml->width * 2; + result = _mesa_convert_texsubimage(MESA_A8_L8, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + case GR_TEXFMT_RGB_565: + dstStride = mml->width * 2; + result = _mesa_convert_texsubimage(MESA_R5_G6_B5, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + case GR_TEXFMT_ARGB_4444: + dstStride = mml->width * 2; + result = _mesa_convert_texsubimage(MESA_A4_R4_G4_B4, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + case GR_TEXFMT_ARGB_1555: + dstStride = mml->width * 2; + result = _mesa_convert_texsubimage(MESA_A1_R5_G5_B5, xoffset, yoffset, + mml->width, mml->height, mml->data, + dstStride, width, height, + texImage->Width, texImage->Height, + format, type, pixels, packing); + break; + default: + gl_problem(NULL, "tdfx driver: fxTexBuildSubImageMap() bad format"); + result = GL_FALSE; + } - return; + if (!result) { + return GL_FALSE; } - fxTexGetInfo(image->Width,image->Height,NULL,NULL,NULL,NULL,NULL,NULL,&wscale,&hscale); + if (ti->validated && ti->isInTM) + fxTMReloadSubMipMapLevel(fxMesa, texObj, level, yoffset, height); + else + fxTexInvalidate(ctx, texObj); - if((wscale!=1) || (hscale!=1)) { - if (MESA_VERBOSE&VERBOSE_DRIVER) { - fprintf(stderr,"fxmesa: (wscale!=1) || (hscale!=1) in fxDDTexSubImg()\n"); - } - fxDDTexImg(ctx,target,tObj,level,internalFormat,image); + return GL_TRUE; +} - return; + +static void PrintTexture(int w, int h, int c, const GLubyte *data) +{ + int i, j; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + if (c==2) + printf("%02x %02x ", data[0], data[1]); + else if (c==3) + printf("%02x %02x %02x ", data[0], data[1], data[2]); + data += c; + } + printf("\n"); } +} - if(mml->translated) - fxTexBuildSubImageMap(image,internalFormat,xoffset,yoffset, - width,height,mml->data); - if(ti->validated && ti->isInTM) - fxTMReloadSubMipMapLevel(fxMesa,tObj,level,yoffset,height); - else - fxTexInvalidate(ctx,tObj); +GLvoid *fxDDGetTexImage(GLcontext *ctx, GLenum target, GLint level, + const struct gl_texture_object *texObj, + GLenum *formatOut, GLenum *typeOut, + GLboolean *freeImageOut ) +{ + tfxTexInfo *ti; + tfxMipMapLevel *mml; + + if (target != GL_TEXTURE_2D) + return NULL; + + if (!texObj->DriverData) + return NULL; + + ti = fxTMGetTexInfo(texObj); + mml = &ti->mipmapLevel[level]; + if (mml->data) { + MesaIntTexFormat mesaFormat; + GLenum glFormat; + struct gl_texture_image *texImage = texObj->Image[level]; + GLint srcStride; + + GLubyte *data = (GLubyte *) MALLOC(texImage->Width * texImage->Height * 4); + if (!data) + return NULL; + + switch (mml->glideFormat) { + case GR_TEXFMT_INTENSITY_8: + mesaFormat = MESA_I8; + glFormat = GL_INTENSITY; + srcStride = mml->width; + break; + case GR_TEXFMT_ALPHA_INTENSITY_88: + mesaFormat = MESA_A8_L8; + glFormat = GL_LUMINANCE_ALPHA; + srcStride = mml->width; + break; + case GR_TEXFMT_ALPHA_8: + mesaFormat = MESA_A8; + glFormat = GL_ALPHA; + srcStride = mml->width; + break; + case GR_TEXFMT_RGB_565: + mesaFormat = MESA_R5_G6_B5; + glFormat = GL_RGB; + srcStride = mml->width * 2; + break; + case GR_TEXFMT_ARGB_4444: + mesaFormat = MESA_A4_R4_G4_B4; + glFormat = GL_RGBA; + srcStride = mml->width * 2; + break; + case GR_TEXFMT_ARGB_1555: + mesaFormat = MESA_A1_R5_G5_B5; + glFormat = GL_RGBA; + srcStride = mml->width * 2; + break; + case GR_TEXFMT_P_8: + mesaFormat = MESA_C8; + glFormat = GL_COLOR_INDEX; + srcStride = mml->width; + break; + default: + gl_problem(NULL, "Bad glideFormat in fxDDGetTexImage"); + return NULL; + } + _mesa_unconvert_teximage(mesaFormat, mml->width, mml->height, mml->data, + srcStride, texImage->Width, texImage->Height, + glFormat, data); + *formatOut = glFormat; + *typeOut = GL_UNSIGNED_BYTE; + *freeImageOut = GL_TRUE; + return data; + } + else { + return NULL; + } } diff --git a/xc/extras/Mesa/src/FX/fxdrv.h b/xc/extras/Mesa/src/FX/fxdrv.h index fb009535a..64ac9ee49 100644 --- a/xc/extras/Mesa/src/FX/fxdrv.h +++ b/xc/extras/Mesa/src/FX/fxdrv.h @@ -272,11 +272,9 @@ typedef struct MemRange_t { } MemRange; typedef struct { - GLsizei width, height; - GLint glideFormat; - - unsigned short *data; - GLboolean translated, used; + GLsizei width, height; /* image size */ + GrTextureFormat_t glideFormat; /* Glide image format */ + unsigned short *data; /* Glide-formated texture image */ } tfxMipMapLevel; typedef struct tfxTexInfo_t { @@ -568,17 +566,29 @@ extern void fxUpdateDDSpanPointers(GLcontext *); extern void fxSetupDDSpanPointers(GLcontext *); extern void fxPrintTextureData(tfxTexInfo *ti); +extern GLboolean fxDDTexImage2D(GLcontext *ctx, GLenum target, GLint level, + GLenum format, GLenum type, const GLvoid *pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage, + GLboolean *retainInternalCopy); +extern GLboolean fxDDTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, const GLvoid *pixels, + const struct gl_pixelstore_attrib *packing, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern GLvoid *fxDDGetTexImage(GLcontext *ctx, GLenum target, GLint level, + const struct gl_texture_object *texObj, + GLenum *formatOut, GLenum *typeOut, + GLboolean *freeImageOut ); extern void fxDDTexEnv(GLcontext *, GLenum, GLenum, const GLfloat *); -extern void fxDDTexImg(GLcontext *, GLenum, struct gl_texture_object *, - GLint, GLint, const struct gl_texture_image *); extern void fxDDTexParam(GLcontext *, GLenum, struct gl_texture_object *, GLenum, const GLfloat *); extern void fxDDTexBind(GLcontext *, GLenum, struct gl_texture_object *); extern void fxDDTexDel(GLcontext *, struct gl_texture_object *); extern void fxDDTexPalette(GLcontext *, struct gl_texture_object *); -extern void fxDDTexuseGlbPalette(GLcontext *, GLboolean); -extern void fxDDTexSubImg(GLcontext *, GLenum, struct gl_texture_object *, GLint, - GLint, GLint, GLint, GLint, GLint, const struct gl_texture_image *); extern void fxDDTexUseGlbPalette(GLcontext *, GLboolean); extern void fxDDEnable(GLcontext *, GLenum, GLboolean); diff --git a/xc/extras/Mesa/src/FX/fxsetup.c b/xc/extras/Mesa/src/FX/fxsetup.c index 7d4340d4f..b09a90ce8 100644 --- a/xc/extras/Mesa/src/FX/fxsetup.c +++ b/xc/extras/Mesa/src/FX/fxsetup.c @@ -556,7 +556,7 @@ static void fxSetupTextureSingleTMU_NoLock(GLcontext *ctx, GLuint textureset) ctx->Driver.MultipassFunc = fxMultipassBlend; #else #ifndef FX_SILENT - fprintf(stderr,"fx Driver: GL_BLEND not yet supported\n"); + /*fprintf(stderr,"fx Driver: GL_BLEND not yet supported\n");*/ #endif #endif break; diff --git a/xc/extras/Mesa/src/FX/fxtexman.c b/xc/extras/Mesa/src/FX/fxtexman.c index 87f309adc..bc20fa10b 100644 --- a/xc/extras/Mesa/src/FX/fxtexman.c +++ b/xc/extras/Mesa/src/FX/fxtexman.c @@ -651,12 +651,11 @@ void fxTMFreeTexture(fxMesaContext fxMesa, struct gl_texture_object *tObj) fxTMMoveOutTM(fxMesa, tObj); - for(i=0; i<MAX_TEXTURE_LEVELS; i++) { - if (ti->mipmapLevel[i].used && - ti->mipmapLevel[i].translated) + for (i=0; i<MAX_TEXTURE_LEVELS; i++) { + if (ti->mipmapLevel[i].data) { FREE(ti->mipmapLevel[i].data); - - (void)ti->mipmapLevel[i].data; + ti->mipmapLevel[i].data = NULL; + } } switch (ti->whichTMU) { case FX_TMU0: diff --git a/xc/extras/Mesa/src/context.c b/xc/extras/Mesa/src/context.c index ac1015d66..7f76b6bf8 100644 --- a/xc/extras/Mesa/src/context.c +++ b/xc/extras/Mesa/src/context.c @@ -1276,9 +1276,9 @@ static GLboolean alloc_proxy_textures( GLcontext *ctx ) out_of_memory = GL_FALSE; for (i=0;i<MAX_TEXTURE_LEVELS;i++) { - ctx->Texture.Proxy1D->Image[i] = gl_alloc_texture_image(); - ctx->Texture.Proxy2D->Image[i] = gl_alloc_texture_image(); - ctx->Texture.Proxy3D->Image[i] = gl_alloc_texture_image(); + ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image(); + ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image(); + ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image(); if (!ctx->Texture.Proxy1D->Image[i] || !ctx->Texture.Proxy2D->Image[i] || !ctx->Texture.Proxy3D->Image[i]) { @@ -1288,13 +1288,13 @@ static GLboolean alloc_proxy_textures( GLcontext *ctx ) if (out_of_memory) { for (i=0;i<MAX_TEXTURE_LEVELS;i++) { if (ctx->Texture.Proxy1D->Image[i]) { - gl_free_texture_image(ctx->Texture.Proxy1D->Image[i]); + _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]); } if (ctx->Texture.Proxy2D->Image[i]) { - gl_free_texture_image(ctx->Texture.Proxy2D->Image[i]); + _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]); } if (ctx->Texture.Proxy3D->Image[i]) { - gl_free_texture_image(ctx->Texture.Proxy3D->Image[i]); + _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]); } } gl_free_texture_object(NULL, ctx->Texture.Proxy1D); diff --git a/xc/extras/Mesa/src/dd.h b/xc/extras/Mesa/src/dd.h index 739905f6d..ac6ce7647 100644 --- a/xc/extras/Mesa/src/dd.h +++ b/xc/extras/Mesa/src/dd.h @@ -625,6 +625,7 @@ struct dd_function_table { */ GLvoid *(*GetTexImage)( GLcontext *ctx, GLenum target, GLint level, + const struct gl_texture_object *texObj, GLenum *formatOut, GLenum *typeOut, GLboolean *freeImageOut ); /* Called by glGetTexImage or by core Mesa when a texture image diff --git a/xc/extras/Mesa/src/teximage.c b/xc/extras/Mesa/src/teximage.c index 327c4bf92..81f6852ba 100644 --- a/xc/extras/Mesa/src/teximage.c +++ b/xc/extras/Mesa/src/teximage.c @@ -49,6 +49,29 @@ */ +#ifdef DEBUG +static void PrintTexture(int w, int h, int c, const GLubyte *data) +{ + int i, j; + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + if (c==1) + printf("%02x ", data[0]); + else if (c==2) + printf("%02x %02x ", data[0], data[1]); + else if (c==3) + printf("%02x %02x %02x ", data[0], data[1], data[2]); + else if (c==4) + printf("%02x %02x %02x %02x ", data[0], data[1], data[2], data[3]); + data += c; + } + printf("\n"); + } +} +#endif + + + /* * Compute log base 2 of n. * If n isn't an exact power of two return -1. @@ -338,7 +361,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage ) * Return new gl_texture_image struct with all fields initialized to zero. */ struct gl_texture_image * -gl_alloc_texture_image( void ) +_mesa_alloc_texture_image( void ) { return CALLOC_STRUCT(gl_texture_image); } @@ -380,7 +403,7 @@ init_texture_image( struct gl_texture_image *img, void -gl_free_texture_image( struct gl_texture_image *teximage ) +_mesa_free_texture_image( struct gl_texture_image *teximage ) { if (teximage->Data) { FREE( teximage->Data ); @@ -641,7 +664,7 @@ texture_error_check( GLcontext *ctx, GLenum target, } /* Border */ - if (border!=0 && border!=1) { + if (border != 0 && border != 1) { if (!isProxy) { char message[100]; sprintf(message, "glTexImage%dD(border)", dimensions); @@ -686,7 +709,7 @@ texture_error_check( GLcontext *ctx, GLenum target, } /* Level */ - if (level<0 || level>=ctx->Const.MaxTextureLevels) { + if (level < 0 || level >= ctx->Const.MaxTextureLevels) { if (!isProxy) { char message[100]; sprintf(message, "glTexImage%dD(level)", dimensions); @@ -1033,7 +1056,7 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, texImage = texObj->Image[level]; if (!texImage) { - texImage = gl_alloc_texture_image(); + texImage = _mesa_alloc_texture_image(); texObj->Image[level] = texImage; if (!texImage) { gl_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); @@ -1141,7 +1164,7 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, texImage = texObj->Image[level]; if (!texImage) { - texImage = gl_alloc_texture_image(); + texImage = _mesa_alloc_texture_image(); texObj->Image[level] = texImage; if (!texImage) { gl_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); @@ -1263,7 +1286,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, texImage = texObj->Image[level]; if (!texImage) { - texImage = gl_alloc_texture_image(); + texImage = _mesa_alloc_texture_image(); texObj->Image[level] = texImage; if (!texImage) { gl_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); @@ -1364,9 +1387,9 @@ _mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, * Fetch a texture image from the device driver. * Store the results in the given texture object at the given mipmap level. */ -static void -get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level, - const struct gl_texture_object *texObj ) +void +_mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level, + const struct gl_texture_object *texObj ) { GLvoid *image; GLenum imgFormat, imgType; @@ -1377,7 +1400,7 @@ get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level, if (!ctx->Driver.GetTexImage) return; - image = (*ctx->Driver.GetTexImage)( ctx, target, level, + image = (*ctx->Driver.GetTexImage)( ctx, target, level, texObj, &imgFormat, &imgType, &freeImage); if (!image) return; @@ -1503,7 +1526,7 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format, if (!texImage->Data) { /* try to get the texture image from the device driver */ - get_teximage_from_driver(ctx, target, level, texObj); + _mesa_get_teximage_from_driver(ctx, target, level, texObj); discardImage = GL_TRUE; } else { @@ -1643,7 +1666,7 @@ _mesa_TexSubImage1D( GLenum target, GLint level, const GLint xoffsetb = xoffset + texImage->Border; GLboolean retain = GL_TRUE; if (!texImage->Data) { - get_teximage_from_driver( ctx, target, level, texObj ); + _mesa_get_teximage_from_driver( ctx, target, level, texObj ); if (!texImage->Data) { make_null_texture(texImage); } @@ -1730,7 +1753,7 @@ _mesa_TexSubImage2D( GLenum target, GLint level, GLboolean retain = GL_TRUE; if (!texImage->Data) { - get_teximage_from_driver( ctx, target, level, texObj ); + _mesa_get_teximage_from_driver( ctx, target, level, texObj ); if (!texImage->Data) { make_null_texture(texImage); } @@ -1787,7 +1810,7 @@ _mesa_TexSubImage2D( GLenum target, GLint level, texImage->IntFormat, texImage); } else if (ctx->Driver.TexImage) { - (*ctx->Driver.TexImage)(ctx, GL_TEXTURE_1D, texObj, + (*ctx->Driver.TexImage)(ctx, GL_TEXTURE_2D, texObj, level, texImage->IntFormat, texImage ); } #endif @@ -2062,7 +2085,7 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level, if (teximage->Data) { copy_tex_sub_image(ctx, teximage, width, 1, x, y, xoffset, 0, 0); /* tell driver about the change */ - /* XXX call Driver.TexSubImage instead? */ + /* XXX this is obsolete */ if (ctx->Driver.TexImage) { (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_1D, texUnit->CurrentD[1], @@ -2099,7 +2122,7 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level, copy_tex_sub_image(ctx, teximage, width, height, x, y, xoffset, yoffset, 0); /* tell driver about the change */ - /* XXX call Driver.TexSubImage instead? */ + /* XXX this is obsolete */ if (ctx->Driver.TexImage) { (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_2D, texUnit->CurrentD[2], @@ -2136,7 +2159,7 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level, copy_tex_sub_image(ctx, teximage, width, height, x, y, xoffset, yoffset, zoffset); /* tell driver about the change */ - /* XXX call Driver.TexSubImage instead? */ + /* XXX this is obsolete */ if (ctx->Driver.TexImage) { (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_3D, texUnit->CurrentD[3], diff --git a/xc/extras/Mesa/src/teximage.h b/xc/extras/Mesa/src/teximage.h index 5f1bb8a27..665f39cb2 100644 --- a/xc/extras/Mesa/src/teximage.h +++ b/xc/extras/Mesa/src/teximage.h @@ -39,13 +39,17 @@ _mesa_base_tex_format( GLint format ); extern struct gl_texture_image * -gl_alloc_texture_image( void ); +_mesa_alloc_texture_image( void ); extern void -gl_free_texture_image( struct gl_texture_image *teximage ); +_mesa_free_texture_image( struct gl_texture_image *teximage ); +extern void +_mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level, + const struct gl_texture_object *texObj ); + /*** API entry point functions ***/ diff --git a/xc/extras/Mesa/src/texobj.c b/xc/extras/Mesa/src/texobj.c index 9d00bcd50..bafac922a 100644 --- a/xc/extras/Mesa/src/texobj.c +++ b/xc/extras/Mesa/src/texobj.c @@ -148,7 +148,7 @@ void gl_free_texture_object( struct gl_shared_state *shared, GLuint i; for (i=0;i<MAX_TEXTURE_LEVELS;i++) { if (t->Image[i]) { - gl_free_texture_image( t->Image[i] ); + _mesa_free_texture_image( t->Image[i] ); } } } @@ -167,7 +167,7 @@ void gl_test_texture_object_completeness( const GLcontext *ctx, struct gl_textur t->Complete = GL_TRUE; /* be optimistic */ /* Always need level zero image */ - if (!t->Image[0] || !t->Image[0]->Data) { + if (!t->Image[0]) { t->Complete = GL_FALSE; return; } @@ -206,10 +206,6 @@ void gl_test_texture_object_completeness( const GLcontext *ctx, struct gl_textur /* Test dimension-independent attributes */ for (i = minLevel; i <= maxLevel; i++) { if (t->Image[i]) { - if (!t->Image[i]->Data) { - t->Complete = GL_FALSE; - return; - } if (t->Image[i]->Format != t->Image[0]->Format) { t->Complete = GL_FALSE; return; @@ -234,10 +230,6 @@ void gl_test_texture_object_completeness( const GLcontext *ctx, struct gl_textur t->Complete = GL_FALSE; return; } - if (!t->Image[i]->Data) { - t->Complete = GL_FALSE; - return; - } if (t->Image[i]->Width2 != width ) { t->Complete = GL_FALSE; return; diff --git a/xc/extras/Mesa/src/texture.c b/xc/extras/Mesa/src/texture.c index f1e350ce4..db20c8c36 100644 --- a/xc/extras/Mesa/src/texture.c +++ b/xc/extras/Mesa/src/texture.c @@ -32,6 +32,7 @@ #include "macros.h" #include "mmath.h" #include "pb.h" +#include "teximage.h" #include "texture.h" #include "types.h" #include "xform.h" @@ -532,10 +533,10 @@ static void sample_1d_linear( const struct gl_texture_object *tObj, } { - GLfloat a = myFrac(u); + const GLfloat a = myFrac(u); /* compute sample weights in fixed point in [0,WEIGHT_SCALE] */ - GLint w0 = (GLint) ((1.0F-a) * WEIGHT_SCALE + 0.5F); - GLint w1 = (GLint) ( a * WEIGHT_SCALE + 0.5F); + const GLint w0 = (GLint) ((1.0F-a) * WEIGHT_SCALE + 0.5F); + const GLint w1 = (GLint) ( a * WEIGHT_SCALE + 0.5F); GLubyte t0[4], t1[4]; /* texels */ @@ -614,7 +615,7 @@ sample_1d_nearest_mipmap_linear( const struct gl_texture_object *tObj, } else { GLubyte t0[4], t1[4]; - GLfloat f = myFrac(lambda); + const GLfloat f = myFrac(lambda); sample_1d_nearest( tObj, tObj->Image[level ], s, t0 ); sample_1d_nearest( tObj, tObj->Image[level+1], s, t1 ); rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); @@ -643,7 +644,7 @@ sample_1d_linear_mipmap_linear( const struct gl_texture_object *tObj, } else { GLubyte t0[4], t1[4]; - GLfloat f = myFrac(lambda); + const GLfloat f = myFrac(lambda); sample_1d_linear( tObj, tObj->Image[level ], s, t0 ); sample_1d_linear( tObj, tObj->Image[level+1], s, t1 ); rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); @@ -906,13 +907,13 @@ static void sample_2d_linear( const struct gl_texture_object *tObj, } { - GLfloat a = myFrac(u); - GLfloat b = myFrac(v); + const GLfloat a = myFrac(u); + const GLfloat b = myFrac(v); /* compute sample weights in fixed point in [0,WEIGHT_SCALE] */ - GLint w00 = (GLint) ((1.0F-a)*(1.0F-b) * WEIGHT_SCALE + 0.5F); - GLint w10 = (GLint) ( a *(1.0F-b) * WEIGHT_SCALE + 0.5F); - GLint w01 = (GLint) ((1.0F-a)* b * WEIGHT_SCALE + 0.5F); - GLint w11 = (GLint) ( a * b * WEIGHT_SCALE + 0.5F); + const GLint w00 = (GLint) ((1.0F-a)*(1.0F-b) * WEIGHT_SCALE + 0.5F); + const GLint w10 = (GLint) ( a *(1.0F-b) * WEIGHT_SCALE + 0.5F); + const GLint w01 = (GLint) ((1.0F-a)* b * WEIGHT_SCALE + 0.5F); + const GLint w11 = (GLint) ( a * b * WEIGHT_SCALE + 0.5F); GLubyte t00[4]; GLubyte t10[4]; GLubyte t01[4]; @@ -1008,7 +1009,7 @@ sample_2d_nearest_mipmap_linear( const struct gl_texture_object *tObj, } else { GLubyte t0[4], t1[4]; /* texels */ - GLfloat f = myFrac(lambda); + const GLfloat f = myFrac(lambda); sample_2d_nearest( tObj, tObj->Image[level ], s, t, t0 ); sample_2d_nearest( tObj, tObj->Image[level+1], s, t, t1 ); rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); @@ -1037,7 +1038,7 @@ sample_2d_linear_mipmap_linear( const struct gl_texture_object *tObj, } else { GLubyte t0[4], t1[4]; /* texels */ - GLfloat f = myFrac(lambda); + const GLfloat f = myFrac(lambda); sample_2d_linear( tObj, tObj->Image[level ], s, t, t0 ); sample_2d_linear( tObj, tObj->Image[level+1], s, t, t1 ); rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); @@ -1385,9 +1386,9 @@ static void sample_3d_linear( const struct gl_texture_object *tObj, } { - GLfloat a = myFrac(u); - GLfloat b = myFrac(v); - GLfloat c = myFrac(w); + const GLfloat a = myFrac(u); + const GLfloat b = myFrac(v); + const GLfloat c = myFrac(w); /* compute sample weights in fixed point in [0,WEIGHT_SCALE] */ GLint w000 = (GLint) ((1.0F-a)*(1.0F-b)*(1.0F-c) * WEIGHT_SCALE + 0.5F); GLint w100 = (GLint) ( a *(1.0F-b)*(1.0F-c) * WEIGHT_SCALE + 0.5F); @@ -1525,7 +1526,7 @@ sample_3d_nearest_mipmap_linear( const struct gl_texture_object *tObj, } else { GLubyte t0[4], t1[4]; /* texels */ - GLfloat f = myFrac(lambda); + const GLfloat f = myFrac(lambda); sample_3d_nearest( tObj, tObj->Image[level ], s, t, r, t0 ); sample_3d_nearest( tObj, tObj->Image[level+1], s, t, r, t1 ); rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); @@ -1553,7 +1554,7 @@ sample_3d_linear_mipmap_linear( const struct gl_texture_object *tObj, } else { GLubyte t0[4], t1[4]; /* texels */ - GLfloat f = myFrac(lambda); + const GLfloat f = myFrac(lambda); sample_3d_linear( tObj, tObj->Image[level ], s, t, r, t0 ); sample_3d_linear( tObj, tObj->Image[level+1], s, t, r, t1 ); rgba[RCOMP] = (GLubyte) (GLint) ((1.0F-f) * t0[RCOMP] + f * t1[RCOMP]); @@ -2118,6 +2119,38 @@ void gl_texture_pixels( GLcontext *ctx, GLuint texUnit, GLuint n, } } + /* fetch texture images from device driver, if needed */ + { + static const GLenum targets[] = {GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D}; + struct gl_texture_object *texObj = textureUnit->Current; + GLboolean needLambda = (texObj->MinFilter != texObj->MagFilter); + GLenum target = targets[texObj->Dimensions - 1]; + if (needLambda) { + GLint level; + /* Get images for all mipmap levels. We might not need them + * all but this is easier. We're on a (slow) software path + * anyway. + */ + for (level = 0; level <= texObj->P; level++) { + struct gl_texture_image *texImg = texObj->Image[level]; + if (!texImg->Data) { + _mesa_get_teximage_from_driver(ctx, target, level, texObj); + if (!texImg->Data) + return; /* out of memory */ + } + } + } + else { + GLint level = texObj->BaseLevel; + struct gl_texture_image *texImg = texObj->Image[level]; + if (!texImg->Data) { + _mesa_get_teximage_from_driver(ctx, target, level, texObj); + if (!texImg->Data) + return; /* out of memory */ + } + } + } + /* Sample the texture. */ (*textureUnit->Current->SampleFunc)( textureUnit->Current, n, s, t, r, lambda, texel ); |