⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxddtex.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -