📄 fxddtex.c
字号:
fxt1_decode_1(texImage->Data, mml->width, i, j, rgba); rgba[ACOMP] = 255;}static voidfetch_rgba_fxt1(const struct gl_texture_image *texImage, GLint i, GLint j, GLint k, GLchan *rgba){ const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); i = i * mml->wScale; j = j * mml->hScale; fxt1_decode_1(texImage->Data, mml->width, i, j, rgba);}static voidfetch_rgb_dxt1(const struct gl_texture_image *texImage, GLint i, GLint j, GLint k, GLchan *rgba){ const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); i = i * mml->wScale; j = j * mml->hScale; _mesa_texformat_rgb_dxt1.FetchTexel2D(texImage, i, j, k, rgba);}static voidfetch_rgba_dxt1(const struct gl_texture_image *texImage, GLint i, GLint j, GLint k, GLchan *rgba){ const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); i = i * mml->wScale; j = j * mml->hScale; _mesa_texformat_rgba_dxt1.FetchTexel2D(texImage, i, j, k, rgba);}static voidfetch_rgba_dxt3(const struct gl_texture_image *texImage, GLint i, GLint j, GLint k, GLchan *rgba){ const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); i = i * mml->wScale; j = j * mml->hScale; _mesa_texformat_rgba_dxt3.FetchTexel2D(texImage, i, j, k, rgba);}static voidfetch_rgba_dxt5(const struct gl_texture_image *texImage, GLint i, GLint j, GLint k, GLchan *rgba){ const tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage); i = i * mml->wScale; j = j * mml->hScale; _mesa_texformat_rgba_dxt5.FetchTexel2D(texImage, i, j, k, rgba);}#if 0 /* break glass in case of emergency */static voidPrintTexture(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) fprintf(stderr, "%02x %02x ", data[0], data[1]); else if (c == 3) fprintf(stderr, "%02x %02x %02x ", data[0], data[1], data[2]); data += c; } fprintf(stderr, "\n"); }}#endifconst struct gl_texture_format *fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat, GLenum srcFormat, GLenum srcType ){ fxMesaContext fxMesa = FX_CONTEXT(ctx); GLboolean allow32bpt = fxMesa->HaveTexFmt; if (TDFX_DEBUG & VERBOSE_TEXTURE) { fprintf(stderr, "fxDDChooseTextureFormat(...)\n"); } switch (internalFormat) { case GL_COMPRESSED_RGB: /* intentional fall through */ case 3: case GL_RGB: if ( srcFormat == GL_RGB && srcType == GL_UNSIGNED_SHORT_5_6_5 ) { return &_mesa_texformat_rgb565; } /* intentional fall through */ case GL_RGB8: case GL_RGB10: case GL_RGB12: case GL_RGB16: return (allow32bpt) ? &_mesa_texformat_argb8888 : &_mesa_texformat_rgb565; case GL_RGBA2: case GL_RGBA4: return &_mesa_texformat_argb4444; case GL_COMPRESSED_RGBA: /* intentional fall through */ case 4: case GL_RGBA: if ( srcFormat == GL_BGRA ) { if ( srcType == GL_UNSIGNED_INT_8_8_8_8_REV ) { return &_mesa_texformat_argb8888; } else if ( srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ) { return &_mesa_texformat_argb4444; } else if ( srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ) { return &_mesa_texformat_argb1555; } } /* intentional fall through */ case GL_RGBA8: case GL_RGB10_A2: case GL_RGBA12: case GL_RGBA16: return (allow32bpt) ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444; case GL_INTENSITY: case GL_INTENSITY4: case GL_INTENSITY8: case GL_INTENSITY12: case GL_INTENSITY16: case GL_COMPRESSED_INTENSITY: return &_mesa_texformat_i8; case 1: case GL_LUMINANCE: case GL_LUMINANCE4: case GL_LUMINANCE8: case GL_LUMINANCE12: case GL_LUMINANCE16: case GL_COMPRESSED_LUMINANCE: return &_mesa_texformat_l8; case GL_ALPHA: case GL_ALPHA4: case GL_ALPHA8: case GL_ALPHA12: case GL_ALPHA16: case GL_COMPRESSED_ALPHA: return &_mesa_texformat_a8; 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: return &_mesa_texformat_ci8; 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_COMPRESSED_LUMINANCE_ALPHA: return &_mesa_texformat_al88; case GL_R3_G3_B2: case GL_RGB4: case GL_RGB5: return &_mesa_texformat_rgb565; case GL_RGB5_A1: return &_mesa_texformat_argb1555; /* GL_EXT_texture_compression_s3tc */ /* GL_S3_s3tc */ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_RGB_S3TC: case GL_RGB4_S3TC: return &_mesa_texformat_rgb_dxt1; case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return &_mesa_texformat_rgba_dxt1; case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_RGBA_S3TC: case GL_RGBA4_S3TC: return &_mesa_texformat_rgba_dxt3; case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: return &_mesa_texformat_rgba_dxt5; /* GL_3DFX_texture_compression_FXT1 */ case GL_COMPRESSED_RGB_FXT1_3DFX: return &_mesa_texformat_rgb_fxt1; case GL_COMPRESSED_RGBA_FXT1_3DFX: return &_mesa_texformat_rgba_fxt1; default: _mesa_problem(NULL, "unexpected format in fxDDChooseTextureFormat"); return NULL; }}static GrTextureFormat_tfxGlideFormat(GLint mesaFormat){ switch (mesaFormat) { case MESA_FORMAT_I8: return GR_TEXFMT_ALPHA_8; case MESA_FORMAT_A8: return GR_TEXFMT_ALPHA_8; case MESA_FORMAT_L8: return GR_TEXFMT_INTENSITY_8; case MESA_FORMAT_CI8: return GR_TEXFMT_P_8; case MESA_FORMAT_AL88: return GR_TEXFMT_ALPHA_INTENSITY_88; case MESA_FORMAT_RGB565: return GR_TEXFMT_RGB_565; case MESA_FORMAT_ARGB4444: return GR_TEXFMT_ARGB_4444; case MESA_FORMAT_ARGB1555: return GR_TEXFMT_ARGB_1555; case MESA_FORMAT_ARGB8888: return GR_TEXFMT_ARGB_8888; case MESA_FORMAT_RGB_FXT1: case MESA_FORMAT_RGBA_FXT1: return GR_TEXFMT_ARGB_CMP_FXT1; case MESA_FORMAT_RGB_DXT1: case MESA_FORMAT_RGBA_DXT1: return GR_TEXFMT_ARGB_CMP_DXT1; case MESA_FORMAT_RGBA_DXT3: return GR_TEXFMT_ARGB_CMP_DXT3; case MESA_FORMAT_RGBA_DXT5: return GR_TEXFMT_ARGB_CMP_DXT5; default: _mesa_problem(NULL, "Unexpected format in fxGlideFormat"); return 0; }}static FetchTexelFuncCfxFetchFunction(GLint mesaFormat){ switch (mesaFormat) { case MESA_FORMAT_I8: return &fetch_intensity8; case MESA_FORMAT_A8: return &fetch_alpha8; case MESA_FORMAT_L8: return &fetch_luminance8; case MESA_FORMAT_CI8: return &fetch_index8; case MESA_FORMAT_AL88: return &fetch_luminance8_alpha8; case MESA_FORMAT_RGB565: return &fetch_r5g6b5; case MESA_FORMAT_ARGB4444: return &fetch_r4g4b4a4; case MESA_FORMAT_ARGB1555: return &fetch_r5g5b5a1; case MESA_FORMAT_ARGB8888: return &fetch_a8r8g8b8; case MESA_FORMAT_RGB_FXT1: return &fetch_rgb_fxt1; case MESA_FORMAT_RGBA_FXT1: return &fetch_rgba_fxt1; case MESA_FORMAT_RGB_DXT1: return &fetch_rgb_dxt1; case MESA_FORMAT_RGBA_DXT1: return &fetch_rgba_dxt1; case MESA_FORMAT_RGBA_DXT3: return &fetch_rgba_dxt3; case MESA_FORMAT_RGBA_DXT5: return &fetch_rgba_dxt5; default: _mesa_problem(NULL, "Unexpected format in fxFetchFunction"); return NULL; }}static GLbooleanadjust2DRatio (GLcontext *ctx, GLint xoffset, GLint yoffset, GLint width, GLint height, GLenum format, GLenum type, const GLvoid *pixels, const struct gl_pixelstore_attrib *packing, tfxMipMapLevel *mml, struct gl_texture_image *texImage, GLint texelBytes, GLint dstRowStride){ const GLint newWidth = width * mml->wScale; const GLint newHeight = height * mml->hScale; GLvoid *tempImage; if (!texImage->IsCompressed) { GLubyte *destAddr; tempImage = MALLOC(width * height * texelBytes); if (!tempImage) { return GL_FALSE; } texImage->TexFormat->StoreImage(ctx, 2, texImage->_BaseFormat, texImage->TexFormat, tempImage, 0, 0, 0, /* dstX/Y/Zoffset */ width * texelBytes, /* dstRowStride */ 0, /* dstImageStride */ width, height, 1, format, type, pixels, packing); /* now rescale */ /* compute address of dest subimage within the overal tex image */ destAddr = (GLubyte *) texImage->Data + (yoffset * mml->hScale * mml->width + xoffset * mml->wScale) * texelBytes; _mesa_rescale_teximage2d(texelBytes, width, dstRowStride, /* dst stride */ width, height, newWidth, newHeight, tempImage, destAddr); } else { const GLint rawBytes = 4; GLvoid *rawImage = MALLOC(width * height * rawBytes); if (!rawImage) { return GL_FALSE; } tempImage = MALLOC(newWidth * newHeight * rawBytes); if (!tempImage) { return GL_FALSE; } /* unpack image, apply transfer ops and store in rawImage */ _mesa_texstore_rgba8888(ctx, 2, GL_RGBA, &_mesa_texformat_rgba8888_rev, rawImage, 0, 0, 0, /* dstX/Y/Zoffset */ width * rawBytes, /* dstRowStride */ 0, /* dstImageStride */ width, height, 1, format, type, pixels, packing); _mesa_rescale_teximage2d(rawBytes, width, newWidth * rawBytes, /* dst stride */ width, height, /* src */ newWidth, newHeight, /* dst */ rawImage /*src*/, tempImage /*dst*/ ); texImage->TexFormat->StoreImage(ctx, 2, texImage->_BaseFormat, texImage->TexFormat, texImage->Data, xoffset * mml->wScale, yoffset * mml->hScale, 0, /* dstX/Y/Zoffset */ dstRowStride, 0, /* dstImageStride */ newWidth, newHeight, 1, GL_RGBA, CHAN_TYPE, tempImage, &ctx->DefaultPacking); FREE(rawImage); } FREE(tempImage); return GL_TRUE;}voidfxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, GLint internalFormat, GLint width, GLint height, GLint border, 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 = FX_CONTEXT(ctx); tfxTexInfo *ti; tfxMipMapLevel *mml; GLint texelBytes, dstRowStride; if (TDFX_DEBUG & VERBOSE_TEXTURE) { fprintf(stderr, "fxDDTexImage2D: id=%d int 0x%x format 0x%x type 0x%x %dx%d\n", texObj->Name, texImage->InternalFormat, format, type, texImage->Width, texImage->Height); } if (!fxIsTexSupported(target, internalFormat, texImage)) { _mesa_problem(NULL, "fx Driver: unsupported texture in fxDDTexImg()\n"); return; } if (!texObj->DriverData) { texObj->DriverData = fxAllocTexObjData(fxMesa); if (!texObj->DriverData) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); return; } } ti = fxTMGetTexInfo(texObj); if (!texImage->DriverData) { texImage->DriverData = CALLOC(sizeof(tfxMipMapLevel)); if (!texImage->DriverData) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); return; } } mml = FX_MIPMAP_DATA(texImage); fxTexGetInfo(width, height, NULL, NULL, NULL, NULL, &mml->wScale, &mml->hScale); mml->width = width * mml->wScale; mml->height = height * mml->hScale;#if FX_COMPRESS_S3TC_AS_FXT1_HACK /* [koolsmoky] substitute FXT1 for DXTn and Legacy S3TC */ if (!ctx->Mesa_DXTn && texImage->IsCompressed) { switch (internalFormat) { case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_RGB_S3TC: case GL_RGB4_S3TC: internalFormat = GL_COMPRESSED_RGB_FXT1_3DFX; break; case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: case GL_RGBA_S3TC: case GL_RGBA4_S3TC: internalFormat = GL_COMPRESSED_RGBA_FXT1_3DFX; } texImage->InternalFormat = internalFormat; }#endif#if FX_TC_NAPALM if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { GLenum texNapalm = 0; if (internalFormat == GL_COMPRESSED_RGB) { texNapalm = GL_COMPRESSED_RGB_FXT1_3DFX; } else if (internalFormat == GL_COMPRESSED_RGBA) { texNapalm = GL_COMPRESSED_RGBA_FXT1_3DFX; } if (texNapalm) { texImage->InternalFormat = internalFormat = texNapalm; texImage->IsCompressed = GL_TRUE; } }#endif /* choose the texture format */ assert(ctx->Driver.ChooseTextureFormat); texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx, internalFormat, format, type); assert(texImage->TexFormat); texelBytes = texImage->TexFormat->TexelBytes;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -