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

📄 fxtexman.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
      ti->tm[where] = fxTMAddObj(fxMesa, tObj, where, texmemsize);      fxMesa->stats.memTexUpload += texmemsize;      for (i = FX_largeLodValue(ti->info), l = ti->minLevel;	   i <= FX_smallLodValue(ti->info); i++, l++) {	 struct gl_texture_image *texImage = tObj->Image[0][l];	 grTexDownloadMipMapLevel(where,					    ti->tm[where]->startAddr,					    FX_valueToLod(i),					    FX_largeLodLog2(ti->info),					    FX_aspectRatioLog2(ti->info),					    ti->info.format,					    GR_MIPMAPLEVELMASK_BOTH,					    texImage->Data);      }      break;   case FX_TMU_SPLIT:      texmemsize = (int)grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, &(ti->info));      ti->tm[FX_TMU0] = fxTMAddObj(fxMesa, tObj, FX_TMU0, texmemsize);      fxMesa->stats.memTexUpload += texmemsize;      texmemsize = (int)grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, &(ti->info));      ti->tm[FX_TMU1] = fxTMAddObj(fxMesa, tObj, FX_TMU1, texmemsize);      fxMesa->stats.memTexUpload += texmemsize;      for (i = FX_largeLodValue(ti->info), l = ti->minLevel;	   i <= FX_smallLodValue(ti->info); i++, l++) {	 struct gl_texture_image *texImage = tObj->Image[0][l];	 grTexDownloadMipMapLevel(GR_TMU0,					    ti->tm[FX_TMU0]->startAddr,					    FX_valueToLod(i),					    FX_largeLodLog2(ti->info),					    FX_aspectRatioLog2(ti->info),					    ti->info.format,					    GR_MIPMAPLEVELMASK_ODD,					    texImage->Data);	 grTexDownloadMipMapLevel(GR_TMU1,					    ti->tm[FX_TMU1]->startAddr,					    FX_valueToLod(i),					    FX_largeLodLog2(ti->info),					    FX_aspectRatioLog2(ti->info),					    ti->info.format,					    GR_MIPMAPLEVELMASK_EVEN,					    texImage->Data);      }      break;   case FX_TMU_BOTH:      texmemsize = (int)grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, &(ti->info));      ti->tm[FX_TMU0] = fxTMAddObj(fxMesa, tObj, FX_TMU0, texmemsize);      fxMesa->stats.memTexUpload += texmemsize;      /*texmemsize = (int)grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, &(ti->info));*/      ti->tm[FX_TMU1] = fxTMAddObj(fxMesa, tObj, FX_TMU1, texmemsize);      fxMesa->stats.memTexUpload += texmemsize;      for (i = FX_largeLodValue(ti->info), l = ti->minLevel;	   i <= FX_smallLodValue(ti->info); i++, l++) {	 struct gl_texture_image *texImage = tObj->Image[0][l];	 grTexDownloadMipMapLevel(GR_TMU0,					    ti->tm[FX_TMU0]->startAddr,					    FX_valueToLod(i),					    FX_largeLodLog2(ti->info),					    FX_aspectRatioLog2(ti->info),					    ti->info.format,					    GR_MIPMAPLEVELMASK_BOTH,					    texImage->Data);	 grTexDownloadMipMapLevel(GR_TMU1,					    ti->tm[FX_TMU1]->startAddr,					    FX_valueToLod(i),					    FX_largeLodLog2(ti->info),					    FX_aspectRatioLog2(ti->info),					    ti->info.format,					    GR_MIPMAPLEVELMASK_BOTH,					    texImage->Data);      }      break;   default:      fprintf(stderr, "fxTMMoveInTM_NoLock: INTERNAL ERROR: wrong tmu (%d)\n", where);      fxCloseHardware();      exit(-1);   }   fxMesa->stats.texUpload++;   ti->isInTM = GL_TRUE;}voidfxTMMoveInTM(fxMesaContext fxMesa, struct gl_texture_object *tObj,	     GLint where){   BEGIN_BOARD_LOCK();   fxTMMoveInTM_NoLock(fxMesa, tObj, where);   END_BOARD_LOCK();}voidfxTMReloadMipMapLevel(fxMesaContext fxMesa, struct gl_texture_object *tObj,		      GLint level){   tfxTexInfo *ti = fxTMGetTexInfo(tObj);   GrLOD_t lodlevel;   GLint tmu;   struct gl_texture_image *texImage = tObj->Image[0][level];   tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage);   if (TDFX_DEBUG & VERBOSE_TEXTURE) {      fprintf(stderr, "fxTMReloadMipMapLevel(%p (%d), %d)\n", (void *)tObj, tObj->Name, level);   }   assert(mml);   assert(mml->width > 0);   assert(mml->height > 0);   assert(mml->glideFormat > 0);   assert(ti->isInTM);   if (!ti->validated) {      fprintf(stderr, "fxTMReloadMipMapLevel: INTERNAL ERROR: not validated\n");      fxCloseHardware();      exit(-1);   }   tmu = (int) ti->whichTMU;   fxMesa->stats.reqTexUpload++;   fxMesa->stats.texUpload++;   lodlevel =  ti->info.largeLodLog2 - (level - ti->minLevel);   switch (tmu) {   case FX_TMU0:   case FX_TMU1:      grTexDownloadMipMapLevel(tmu,				  ti->tm[tmu]->startAddr,				  lodlevel,				  FX_largeLodLog2(ti->info),				  FX_aspectRatioLog2(ti->info),				  ti->info.format,				  GR_MIPMAPLEVELMASK_BOTH, texImage->Data);      break;   case FX_TMU_SPLIT:      grTexDownloadMipMapLevel(GR_TMU0,				  ti->tm[GR_TMU0]->startAddr,				  lodlevel,				  FX_largeLodLog2(ti->info),				  FX_aspectRatioLog2(ti->info),				  ti->info.format,				  GR_MIPMAPLEVELMASK_ODD, texImage->Data);      grTexDownloadMipMapLevel(GR_TMU1,				  ti->tm[GR_TMU1]->startAddr,				  lodlevel,				  FX_largeLodLog2(ti->info),				  FX_aspectRatioLog2(ti->info),				  ti->info.format,				  GR_MIPMAPLEVELMASK_EVEN, texImage->Data);      break;   case FX_TMU_BOTH:      grTexDownloadMipMapLevel(GR_TMU0,				  ti->tm[GR_TMU0]->startAddr,				  lodlevel,				  FX_largeLodLog2(ti->info),				  FX_aspectRatioLog2(ti->info),				  ti->info.format,				  GR_MIPMAPLEVELMASK_BOTH, texImage->Data);      grTexDownloadMipMapLevel(GR_TMU1,				  ti->tm[GR_TMU1]->startAddr,				  lodlevel,				  FX_largeLodLog2(ti->info),				  FX_aspectRatioLog2(ti->info),				  ti->info.format,				  GR_MIPMAPLEVELMASK_BOTH, texImage->Data);      break;   default:      fprintf(stderr, "fxTMReloadMipMapLevel: INTERNAL ERROR: wrong tmu (%d)\n", tmu);      fxCloseHardware();      exit(-1);   }}voidfxTMReloadSubMipMapLevel(fxMesaContext fxMesa,			 struct gl_texture_object *tObj,			 GLint level, GLint yoffset, GLint height){   tfxTexInfo *ti = fxTMGetTexInfo(tObj);   GrLOD_t lodlevel;   unsigned short *data;   GLint tmu;   struct gl_texture_image *texImage = tObj->Image[0][level];   tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage);   assert(mml);   if (!ti->validated) {      fprintf(stderr, "fxTMReloadSubMipMapLevel: INTERNAL ERROR: not validated\n");      fxCloseHardware();      exit(-1);   }   tmu = (int) ti->whichTMU;   fxTMMoveInTM(fxMesa, tObj, tmu);   fxTexGetInfo(mml->width, mml->height,		&lodlevel, NULL, NULL, NULL, NULL, NULL);   if ((ti->info.format == GR_TEXFMT_INTENSITY_8) ||       (ti->info.format == GR_TEXFMT_P_8) ||       (ti->info.format == GR_TEXFMT_ALPHA_8))	 data = (GLushort *) texImage->Data + ((yoffset * mml->width) >> 1);   else      data = (GLushort *) texImage->Data + yoffset * mml->width;   switch (tmu) {   case FX_TMU0:   case FX_TMU1:      grTexDownloadMipMapLevelPartial(tmu,					 ti->tm[tmu]->startAddr,					 FX_valueToLod(FX_lodToValue(lodlevel)						       + level),					 FX_largeLodLog2(ti->info),					 FX_aspectRatioLog2(ti->info),					 ti->info.format,					 GR_MIPMAPLEVELMASK_BOTH, data,					 yoffset, yoffset + height - 1);      break;   case FX_TMU_SPLIT:      grTexDownloadMipMapLevelPartial(GR_TMU0,					 ti->tm[FX_TMU0]->startAddr,					 FX_valueToLod(FX_lodToValue(lodlevel)						       + level),					 FX_largeLodLog2(ti->info),					 FX_aspectRatioLog2(ti->info),					 ti->info.format,					 GR_MIPMAPLEVELMASK_ODD, data,					 yoffset, yoffset + height - 1);      grTexDownloadMipMapLevelPartial(GR_TMU1,					 ti->tm[FX_TMU1]->startAddr,					 FX_valueToLod(FX_lodToValue(lodlevel)						       + level),					 FX_largeLodLog2(ti->info),					 FX_aspectRatioLog2(ti->info),					 ti->info.format,					 GR_MIPMAPLEVELMASK_EVEN, data,					 yoffset, yoffset + height - 1);      break;   case FX_TMU_BOTH:      grTexDownloadMipMapLevelPartial(GR_TMU0,					 ti->tm[FX_TMU0]->startAddr,					 FX_valueToLod(FX_lodToValue(lodlevel)						       + level),					 FX_largeLodLog2(ti->info),					 FX_aspectRatioLog2(ti->info),					 ti->info.format,					 GR_MIPMAPLEVELMASK_BOTH, data,					 yoffset, yoffset + height - 1);      grTexDownloadMipMapLevelPartial(GR_TMU1,					 ti->tm[FX_TMU1]->startAddr,					 FX_valueToLod(FX_lodToValue(lodlevel)						       + level),					 FX_largeLodLog2(ti->info),					 FX_aspectRatioLog2(ti->info),					 ti->info.format,					 GR_MIPMAPLEVELMASK_BOTH, data,					 yoffset, yoffset + height - 1);      break;   default:      fprintf(stderr, "fxTMReloadSubMipMapLevel: INTERNAL ERROR: wrong tmu (%d)\n", tmu);      fxCloseHardware();      exit(-1);   }}voidfxTMMoveOutTM(fxMesaContext fxMesa, struct gl_texture_object *tObj){   tfxTexInfo *ti = fxTMGetTexInfo(tObj);   if (TDFX_DEBUG & VERBOSE_DRIVER) {      fprintf(stderr, "fxTMMoveOutTM(%p (%d))\n", (void *)tObj, tObj->Name);   }   if (!ti->isInTM)      return;   switch (ti->whichTMU) {   case FX_TMU0:   case FX_TMU1:      fxTMRemoveRange(fxMesa, (int) ti->whichTMU, ti->tm[ti->whichTMU]);      break;   case FX_TMU_SPLIT:   case FX_TMU_BOTH:      fxTMRemoveRange(fxMesa, FX_TMU0, ti->tm[FX_TMU0]);      fxTMRemoveRange(fxMesa, FX_TMU1, ti->tm[FX_TMU1]);      break;   default:      fprintf(stderr, "fxTMMoveOutTM: INTERNAL ERROR: bad TMU (%ld)\n", ti->whichTMU);      fxCloseHardware();      exit(-1);   }   ti->isInTM = GL_FALSE;   ti->whichTMU = FX_TMU_NONE;}voidfxTMFreeTexture(fxMesaContext fxMesa, struct gl_texture_object *tObj){   tfxTexInfo *ti = fxTMGetTexInfo(tObj);   int i;   if (TDFX_DEBUG & VERBOSE_TEXTURE) {      fprintf(stderr, "fxTMFreeTexture(%p (%d))\n", (void *)tObj, tObj->Name);   }   fxTMMoveOutTM(fxMesa, tObj);   for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {      struct gl_texture_image *texImage = tObj->Image[0][i];      if (texImage) {         if (texImage->DriverData) {            FREE(texImage->DriverData);            texImage->DriverData = NULL;         }      }   }   switch (ti->whichTMU) {   case FX_TMU0:   case FX_TMU1:      fxTMDeleteRangeNode(fxMesa, ti->tm[ti->whichTMU]);      break;   case FX_TMU_SPLIT:   case FX_TMU_BOTH:      fxTMDeleteRangeNode(fxMesa, ti->tm[FX_TMU0]);      fxTMDeleteRangeNode(fxMesa, ti->tm[FX_TMU1]);      break;   }}voidfxTMInit(fxMesaContext fxMesa){   fxMesa->texBindNumber = 0;   fxMesa->tmPool = 0;   if (fxMesa->HaveTexUma) {      grEnable(GR_TEXTURE_UMA_EXT);   }   fxTMUInit(fxMesa, FX_TMU0);   if (!fxMesa->HaveTexUma && fxMesa->haveTwoTMUs)      fxTMUInit(fxMesa, FX_TMU1);   texBoundMask = (fxMesa->type >= GR_SSTTYPE_Banshee) ? -1 : (FX_2MB_SPLIT - 1);}voidfxTMClose(fxMesaContext fxMesa){   MemRange *tmp, *next;   tmp = fxMesa->tmPool;   while (tmp) {      next = tmp->next;      FREE(tmp);      tmp = next;   }   tmp = fxMesa->tmFree[FX_TMU0];   while (tmp) {      next = tmp->next;      FREE(tmp);      tmp = next;   }   if (fxMesa->haveTwoTMUs) {      tmp = fxMesa->tmFree[FX_TMU1];      while (tmp) {	 next = tmp->next;	 FREE(tmp);	 tmp = next;      }   }}voidfxTMRestoreTextures_NoLock(fxMesaContext ctx){   struct _mesa_HashTable *textures = ctx->glCtx->Shared->TexObjects;   GLuint id;   for (id = _mesa_HashFirstEntry(textures);        id;        id = _mesa_HashNextEntry(textures, id)) {      struct gl_texture_object *tObj         = (struct gl_texture_object *) _mesa_HashLookup(textures, id);      tfxTexInfo *ti = fxTMGetTexInfo(tObj);      if (ti && ti->isInTM) {         int i;	 for (i = 0; i < MAX_TEXTURE_UNITS; i++) {	    if (ctx->glCtx->Texture.Unit[i]._Current == tObj) {	       /* Force the texture onto the board, as it could be in use */	       int where = ti->whichTMU;	       fxTMMoveOutTM_NoLock(ctx, tObj);	       fxTMMoveInTM_NoLock(ctx, tObj, where);	       break;	    }         }	 if (i == MAX_TEXTURE_UNITS)	/* Mark the texture as off the board */	    fxTMMoveOutTM_NoLock(ctx, tObj);      }   }}#else/* * Need this to provide at least one external definition. */extern int gl_fx_dummy_function_texman(void);intgl_fx_dummy_function_texman(void){   return 0;}#endif /* FX */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -