📄 tdfx_texman.c
字号:
GLint l; FxU32 targetTMU; assert(tObj); ti = TDFX_TEXTURE_DATA(tObj); assert(ti); targetTMU = ti->whichTMU; switch (targetTMU) { case TDFX_TMU0: case TDFX_TMU1: if (ti->tm[targetTMU]) { for (l = ti->minLevel; l <= ti->maxLevel && tObj->Image[0][l]->Data; l++) { GrLOD_t glideLod = ti->info.largeLodLog2 - l + tObj->BaseLevel; fxMesa->Glide.grTexDownloadMipMapLevel(targetTMU, ti->tm[targetTMU]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_BOTH, tObj->Image[0][l]->Data); } } break; case TDFX_TMU_SPLIT: if (ti->tm[TDFX_TMU0] && ti->tm[TDFX_TMU1]) { for (l = ti->minLevel; l <= ti->maxLevel && tObj->Image[0][l]->Data; l++) { GrLOD_t glideLod = ti->info.largeLodLog2 - l + tObj->BaseLevel; fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0, ti->tm[TDFX_TMU0]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_ODD, tObj->Image[0][l]->Data); fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1, ti->tm[TDFX_TMU1]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_EVEN, tObj->Image[0][l]->Data); } } break; case TDFX_TMU_BOTH: if (ti->tm[TDFX_TMU0] && ti->tm[TDFX_TMU1]) { for (l = ti->minLevel; l <= ti->maxLevel && tObj->Image[0][l]->Data; l++) { GrLOD_t glideLod = ti->info.largeLodLog2 - l + tObj->BaseLevel; fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0, ti->tm[TDFX_TMU0]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_BOTH, tObj->Image[0][l]->Data); fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1, ti->tm[TDFX_TMU1]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_BOTH, tObj->Image[0][l]->Data); } } break; default: _mesa_problem(NULL, "%s: bad tmu (%d)", __FUNCTION__, (int)targetTMU); return; }}voidtdfxTMReloadMipMapLevel(GLcontext *ctx, struct gl_texture_object *tObj, GLint level){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj); GrLOD_t glideLod; FxU32 tmu; tmu = ti->whichTMU; glideLod = ti->info.largeLodLog2 - level + tObj->BaseLevel; ASSERT(ti->isInTM); LOCK_HARDWARE(fxMesa); switch (tmu) { case TDFX_TMU0: case TDFX_TMU1: fxMesa->Glide.grTexDownloadMipMapLevel(tmu, ti->tm[tmu]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_BOTH, tObj->Image[0][level]->Data); break; case TDFX_TMU_SPLIT: fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0, ti->tm[GR_TMU0]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_ODD, tObj->Image[0][level]->Data); fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1, ti->tm[GR_TMU1]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_EVEN, tObj->Image[0][level]->Data); break; case TDFX_TMU_BOTH: fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU0, ti->tm[GR_TMU0]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_BOTH, tObj->Image[0][level]->Data); fxMesa->Glide.grTexDownloadMipMapLevel(GR_TMU1, ti->tm[GR_TMU1]->startAddr, glideLod, ti->info.largeLodLog2, ti->info.aspectRatioLog2, ti->info.format, GR_MIPMAPLEVELMASK_BOTH, tObj->Image[0][level]->Data); break; default: _mesa_problem(ctx, "%s: bad tmu (%d)", __FUNCTION__, (int)tmu); break; } UNLOCK_HARDWARE(fxMesa);}/* * Allocate space for the given texture in texture memory then * download (copy) it into that space. */voidtdfxTMMoveInTM_NoLock( tdfxContextPtr fxMesa, struct gl_texture_object *tObj, FxU32 targetTMU ){ tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj); FxU32 texmemsize; fxMesa->stats.reqTexUpload++; if (ti->isInTM) { if (ti->whichTMU == targetTMU) return; if (targetTMU == TDFX_TMU_SPLIT || ti->whichTMU == TDFX_TMU_SPLIT) { tdfxTMMoveOutTM_NoLock(fxMesa, tObj); } else { if (ti->whichTMU == TDFX_TMU_BOTH) return; targetTMU = TDFX_TMU_BOTH; } } ti->whichTMU = targetTMU; switch (targetTMU) { case TDFX_TMU0: case TDFX_TMU1: texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, &(ti->info)); ti->tm[targetTMU] = AllocTexMem(fxMesa, targetTMU, texmemsize); break; case TDFX_TMU_SPLIT: texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_ODD, &(ti->info)); ti->tm[TDFX_TMU0] = AllocTexMem(fxMesa, TDFX_TMU0, texmemsize); if (ti->tm[TDFX_TMU0]) fxMesa->stats.memTexUpload += texmemsize; texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_EVEN, &(ti->info)); ti->tm[TDFX_TMU1] = AllocTexMem(fxMesa, TDFX_TMU1, texmemsize); break; case TDFX_TMU_BOTH: texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, &(ti->info)); ti->tm[TDFX_TMU0] = AllocTexMem(fxMesa, TDFX_TMU0, texmemsize); if (ti->tm[TDFX_TMU0]) fxMesa->stats.memTexUpload += texmemsize; /*texmemsize = fxMesa->Glide.grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, &(ti->info));*/ ti->tm[TDFX_TMU1] = AllocTexMem(fxMesa, TDFX_TMU1, texmemsize); break; default: _mesa_problem(NULL, "%s: bad tmu (%d)", __FUNCTION__, (int)targetTMU); return; } ti->reloadImages = GL_TRUE; ti->isInTM = GL_TRUE; fxMesa->stats.texUpload++;}/* * Move the given texture out of hardware texture memory. * This deallocates the texture's memory space. */voidtdfxTMMoveOutTM_NoLock( tdfxContextPtr fxMesa, struct gl_texture_object *tObj ){ struct gl_shared_state *mesaShared = fxMesa->glCtx->Shared; struct tdfxSharedState *shared = (struct tdfxSharedState *) mesaShared->DriverData; tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj); if (MESA_VERBOSE & VERBOSE_DRIVER) { fprintf(stderr, "fxmesa: %s(%p (%d))\n", __FUNCTION__, (void *)tObj, tObj->Name); } /* VerifyFreeList(fxMesa, 0); VerifyFreeList(fxMesa, 1); */ if (!ti || !ti->isInTM) return; switch (ti->whichTMU) { case TDFX_TMU0: case TDFX_TMU1: RemoveRange_NoLock(fxMesa, ti->whichTMU, ti->tm[ti->whichTMU]); break; case TDFX_TMU_SPLIT: case TDFX_TMU_BOTH: assert(!shared->umaTexMemory); RemoveRange_NoLock(fxMesa, TDFX_TMU0, ti->tm[TDFX_TMU0]); RemoveRange_NoLock(fxMesa, TDFX_TMU1, ti->tm[TDFX_TMU1]); break; default: _mesa_problem(NULL, "%s: bad tmu (%d)", __FUNCTION__, (int)ti->whichTMU); return; } ti->isInTM = GL_FALSE; ti->tm[0] = NULL; ti->tm[1] = NULL; ti->whichTMU = TDFX_TMU_NONE; /* VerifyFreeList(fxMesa, 0); VerifyFreeList(fxMesa, 1); */}/* * Called via glDeleteTexture to delete a texture object. */voidtdfxTMFreeTexture(tdfxContextPtr fxMesa, struct gl_texture_object *tObj){ tdfxTexInfo *ti = TDFX_TEXTURE_DATA(tObj); if (ti) { tdfxTMMoveOutTM(fxMesa, tObj); FREE(ti); tObj->DriverData = NULL; } /* VerifyFreeList(fxMesa, 0); VerifyFreeList(fxMesa, 1); */}/* * After a context switch this function will be called to restore * texture memory for the new context. */void tdfxTMRestoreTextures_NoLock( tdfxContextPtr fxMesa ){ GLcontext *ctx = fxMesa->glCtx; struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects; GLuint id; for (id = _mesa_HashFirstEntry(textures); id; id = _mesa_HashNextEntry(textures, id)) { struct gl_texture_object *tObj = _mesa_lookup_texture(fxMesa->glCtx, id); tdfxTexInfo *ti = TDFX_TEXTURE_DATA( tObj ); if ( ti && ti->isInTM ) { int i; for ( i = 0 ; i < MAX_TEXTURE_UNITS ; i++ ) { if ( ctx->Texture.Unit[i]._Current == tObj ) { tdfxTMDownloadTexture( fxMesa, tObj ); break; } } if ( i == MAX_TEXTURE_UNITS ) { tdfxTMMoveOutTM_NoLock( fxMesa, tObj ); } } } /* VerifyFreeList(fxMesa, 0); VerifyFreeList(fxMesa, 1); */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -