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

📄 tdfx_texman.c

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