📄 savagetex.c
字号:
imesa->regs.s4.texDescr.ni.tex1En = GL_TRUE; imesa->regs.s4.texDescr.ni.texBLoopEn = GL_TRUE; imesa->regs.s4.texDescr.ni.tex1Width = imesa->regs.s4.texDescr.ni.tex0Width; imesa->regs.s4.texDescr.ni.tex1Height = imesa->regs.s4.texDescr.ni.tex0Height; imesa->regs.s4.texDescr.ni.tex1Fmt = imesa->regs.s4.texDescr.ni.tex0Fmt; imesa->regs.s4.texAddr[1].ui = imesa->regs.s4.texAddr[0].ui; imesa->regs.s4.texBlendCtrl[1].ui = TBC_Blend1; imesa->regs.s4.texCtrl[0].ni.clrArg1Invert = GL_TRUE; imesa->bTexEn1 = GL_TRUE; break; case GL_LUMINANCE_ALPHA: case GL_RGBA: imesa->regs.s4.texBlendCtrl[0].ui = TBC_BlendAlpha0; imesa->regs.s4.texDescr.ni.tex1En = GL_TRUE; imesa->regs.s4.texDescr.ni.texBLoopEn = GL_TRUE; imesa->regs.s4.texDescr.ni.tex1Width = imesa->regs.s4.texDescr.ni.tex0Width; imesa->regs.s4.texDescr.ni.tex1Height = imesa->regs.s4.texDescr.ni.tex0Height; imesa->regs.s4.texDescr.ni.tex1Fmt = imesa->regs.s4.texDescr.ni.tex0Fmt; imesa->regs.s4.texAddr[1].ui = imesa->regs.s4.texAddr[0].ui; imesa->regs.s4.texBlendCtrl[1].ui = TBC_BlendAlpha1; imesa->regs.s4.texCtrl[0].ni.clrArg1Invert = GL_TRUE; imesa->bTexEn1 = GL_TRUE; break; case GL_INTENSITY: imesa->regs.s4.texBlendCtrl[0].ui = TBC_BlendInt0; imesa->regs.s4.texDescr.ni.tex1En = GL_TRUE; imesa->regs.s4.texDescr.ni.texBLoopEn = GL_TRUE; imesa->regs.s4.texDescr.ni.tex1Width = imesa->regs.s4.texDescr.ni.tex0Width; imesa->regs.s4.texDescr.ni.tex1Height = imesa->regs.s4.texDescr.ni.tex0Height; imesa->regs.s4.texDescr.ni.tex1Fmt = imesa->regs.s4.texDescr.ni.tex0Fmt; imesa->regs.s4.texAddr[1].ui = imesa->regs.s4.texAddr[0].ui; imesa->regs.s4.texBlendCtrl[1].ui = TBC_BlendInt1; imesa->regs.s4.texCtrl[0].ni.clrArg1Invert = GL_TRUE; imesa->regs.s4.texCtrl[0].ni.alphaArg1Invert = GL_TRUE; imesa->bTexEn1 = GL_TRUE; break; } __HWEnvCombineSingleUnitScale(imesa, 0, 0, &imesa->regs.s4.texBlendCtrl[0]); break; case GL_ADD: imesa->regs.s4.texCtrl[0].ni.clrArg1Invert = GL_FALSE; switch (format) { case GL_ALPHA: imesa->regs.s4.texBlendCtrl[0].ui = TBC_ModulAlpha; break; case GL_LUMINANCE: case GL_RGB: imesa->regs.s4.texBlendCtrl[0].ui = TBC_Add; break; case GL_LUMINANCE_ALPHA: case GL_RGBA: imesa->regs.s4.texBlendCtrl[0].ui = TBC_Add; break; case GL_INTENSITY: imesa->regs.s4.texBlendCtrl[0].ui = TBC_AddAlpha; break; } __HWEnvCombineSingleUnitScale(imesa, 0, 0, &imesa->regs.s4.texBlendCtrl[0]); break;#if GL_ARB_texture_env_combine case GL_COMBINE_ARB: __HWParseTexEnvCombine(imesa, 0, &imesa->regs.s4.texCtrl[0], &imesa->regs.s4.texBlendCtrl[0]); break;#endif default: fprintf(stderr, "unknown tex env mode"); exit(1); break; } savage4_set_wrap_mode( imesa, 0, t->setup.sWrapMode, t->setup.tWrapMode ); savage4_set_filter_mode( imesa, 0, t->setup.minFilter, t->setup.magFilter ); if((ctx->Texture.Unit[0].LodBias !=0.0F) || (imesa->regs.s4.texCtrl[0].ni.dBias != 0)) { int bias = (int)(ctx->Texture.Unit[0].LodBias * 32.0) + SAVAGE4_LOD_OFFSET; if (bias < -256) bias = -256; else if (bias > 255) bias = 255; imesa->regs.s4.texCtrl[0].ni.dBias = bias & 0x1ff; } image = tObj->Image[0][tObj->BaseLevel]; imesa->regs.s4.texDescr.ni.tex0En = GL_TRUE; imesa->regs.s4.texDescr.ni.tex0Width = image->WidthLog2; imesa->regs.s4.texDescr.ni.tex0Height = image->HeightLog2; imesa->regs.s4.texDescr.ni.tex0Fmt = t->hwFormat; imesa->regs.s4.texCtrl[0].ni.dMax = t->base.lastLevel - t->base.firstLevel; if (imesa->regs.s4.texDescr.ni.tex1En) imesa->regs.s4.texDescr.ni.texBLoopEn = GL_TRUE; imesa->regs.s4.texAddr[0].ui = (u_int32_t) t->setup.physAddr | 0x2; if(t->base.heap->heapId == SAVAGE_AGP_HEAP) imesa->regs.s4.texAddr[0].ui |= 0x1; return;}static void savageUpdateTex1State_s4( GLcontext *ctx ){ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); struct gl_texture_object *tObj; struct gl_texture_image *image; savageTexObjPtr t; GLuint format; /* disable */ if(imesa->bTexEn1) { imesa->bTexEn1 = GL_FALSE; return; } imesa->regs.s4.texDescr.ni.tex1En = GL_FALSE; imesa->regs.s4.texBlendCtrl[1].ui = TBC_NoTexMap1; imesa->regs.s4.texCtrl[1].ui = 0x20f040; imesa->regs.s4.texDescr.ni.texBLoopEn = GL_FALSE; if (ctx->Texture.Unit[1]._ReallyEnabled == 0) return; tObj = ctx->Texture.Unit[1]._Current; if ((ctx->Texture.Unit[1]._ReallyEnabled & ~(TEXTURE_1D_BIT|TEXTURE_2D_BIT)) || tObj->Image[0][tObj->BaseLevel]->Border > 0) { /* 3D texturing enabled, or texture border - fallback */ FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE); return; } /* Do 2D texture setup */ t = tObj->DriverData; if (!t) { t = savageAllocTexObj( tObj ); if (!t) return; } imesa->CurrentTexObj[1] = &t->base; t->base.bound |= 2; if (t->base.dirty_images[0] || t->dirtySubImages) { savageSetTexImages(imesa, tObj); savageUploadTexImages(imesa, t); } driUpdateTextureLRU( &t->base ); format = tObj->Image[0][tObj->BaseLevel]->_BaseFormat; switch (ctx->Texture.Unit[1].EnvMode) { case GL_REPLACE: imesa->regs.s4.texCtrl[1].ni.clrArg1Invert = GL_FALSE; switch (format) { case GL_LUMINANCE: case GL_RGB: imesa->regs.s4.texBlendCtrl[1].ui = TBC_Decal; break; case GL_LUMINANCE_ALPHA: case GL_INTENSITY: case GL_RGBA: imesa->regs.s4.texBlendCtrl[1].ui = TBC_Copy; break; case GL_ALPHA: imesa->regs.s4.texBlendCtrl[1].ui = TBC_CopyAlpha1; break; } __HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl); break; case GL_MODULATE: imesa->regs.s4.texCtrl[1].ni.clrArg1Invert = GL_FALSE; imesa->regs.s4.texBlendCtrl[1].ui = TBC_ModulAlpha1; __HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl); break; case GL_ADD: imesa->regs.s4.texCtrl[1].ni.clrArg1Invert = GL_FALSE; switch (format) { case GL_ALPHA: imesa->regs.s4.texBlendCtrl[1].ui = TBC_ModulAlpha1; break; case GL_LUMINANCE: case GL_RGB: imesa->regs.s4.texBlendCtrl[1].ui = TBC_Add1; break; case GL_LUMINANCE_ALPHA: case GL_RGBA: imesa->regs.s4.texBlendCtrl[1].ui = TBC_Add1; break; case GL_INTENSITY: imesa->regs.s4.texBlendCtrl[1].ui = TBC_AddAlpha1; break; } __HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl); break;#if GL_ARB_texture_env_combine case GL_COMBINE_ARB: __HWParseTexEnvCombine(imesa, 1, &texCtrl, &imesa->regs.s4.texBlendCtrl); break;#endif case GL_DECAL: imesa->regs.s4.texCtrl[1].ni.clrArg1Invert = GL_FALSE; switch (format) { case GL_LUMINANCE: case GL_RGB: imesa->regs.s4.texBlendCtrl[1].ui = TBC_Decal1; break; case GL_LUMINANCE_ALPHA: case GL_INTENSITY: case GL_RGBA: imesa->regs.s4.texBlendCtrl[1].ui = TBC_DecalAlpha1; break; /* // GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_ALPHA, GL_INTENSITY // are undefined with GL_DECAL */ case GL_ALPHA: imesa->regs.s4.texBlendCtrl[1].ui = TBC_CopyAlpha1; break; } __HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl); break; case GL_BLEND: if (format == GL_LUMINANCE) { /* // This is a hack for GLQuake, invert. */ imesa->regs.s4.texCtrl[1].ni.clrArg1Invert = GL_TRUE; imesa->regs.s4.texBlendCtrl[1].ui = 0; } __HWEnvCombineSingleUnitScale(imesa, 0, 1, &imesa->regs.s4.texBlendCtrl); break; default: fprintf(stderr, "unknown tex 1 env mode\n"); exit(1); break; } savage4_set_wrap_mode( imesa, 1, t->setup.sWrapMode, t->setup.tWrapMode ); savage4_set_filter_mode( imesa, 1, t->setup.minFilter, t->setup.magFilter ); if((ctx->Texture.Unit[1].LodBias !=0.0F) || (imesa->regs.s4.texCtrl[1].ni.dBias != 0)) { int bias = (int)(ctx->Texture.Unit[1].LodBias * 32.0) + SAVAGE4_LOD_OFFSET; if (bias < -256) bias = -256; else if (bias > 255) bias = 255; imesa->regs.s4.texCtrl[1].ni.dBias = bias & 0x1ff; } image = tObj->Image[0][tObj->BaseLevel]; imesa->regs.s4.texDescr.ni.tex1En = GL_TRUE; imesa->regs.s4.texDescr.ni.tex1Width = image->WidthLog2; imesa->regs.s4.texDescr.ni.tex1Height = image->HeightLog2; imesa->regs.s4.texDescr.ni.tex1Fmt = t->hwFormat; imesa->regs.s4.texCtrl[1].ni.dMax = t->base.lastLevel - t->base.firstLevel; imesa->regs.s4.texDescr.ni.texBLoopEn = GL_TRUE; imesa->regs.s4.texAddr[1].ui = (u_int32_t) t->setup.physAddr | 2; if(t->base.heap->heapId == SAVAGE_AGP_HEAP) imesa->regs.s4.texAddr[1].ui |= 0x1;}static void savageUpdateTexState_s3d( GLcontext *ctx ){ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); struct gl_texture_object *tObj; struct gl_texture_image *image; savageTexObjPtr t; GLuint format; /* disable */ imesa->regs.s3d.texCtrl.ui = 0; imesa->regs.s3d.texCtrl.ni.texEn = GL_FALSE; imesa->regs.s3d.texCtrl.ni.dBias = 0x08; imesa->regs.s3d.texCtrl.ni.texXprEn = GL_TRUE; if (ctx->Texture.Unit[0]._ReallyEnabled == 0) return; tObj = ctx->Texture.Unit[0]._Current; if ((ctx->Texture.Unit[0]._ReallyEnabled & ~(TEXTURE_1D_BIT|TEXTURE_2D_BIT)) || tObj->Image[0][tObj->BaseLevel]->Border > 0) { /* 3D texturing enabled, or texture border - fallback */ FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE); return; } /* Do 2D texture setup */ t = tObj->DriverData; if (!t) { t = savageAllocTexObj( tObj ); if (!t) return; } imesa->CurrentTexObj[0] = &t->base; t->base.bound |= 1; if (t->base.dirty_images[0] || t->dirtySubImages) { savageSetTexImages(imesa, tObj); savageUploadTexImages(imesa, t); } driUpdateTextureLRU( &t->base ); format = tObj->Image[0][tObj->BaseLevel]->_BaseFormat; /* FIXME: copied from utah-glx, probably needs some tuning */ switch (ctx->Texture.Unit[0].EnvMode) { case GL_DECAL: imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_DECALALPHA_S3D; break; case GL_REPLACE: switch (format) { case GL_ALPHA: /* FIXME */ imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = 1; break; case GL_LUMINANCE_ALPHA: case GL_RGBA: imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = 4; break; case GL_RGB: case GL_LUMINANCE: imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_DECAL_S3D; break; case GL_INTENSITY: imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_COPY_S3D; } break; case GL_BLEND: /* hardware can't do GL_BLEND */ FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE); return; case GL_MODULATE: imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_MODULATEALPHA_S3D; break; default: fprintf(stderr, "unknown tex env mode\n"); /*exit(1);*/ break; } /* The Savage3D can't handle different wrapping modes in s and t. * If they are not the same, fall back to software. */ if (t->setup.sWrapMode != t->setup.tWrapMode) { FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE); return; } imesa->regs.s3d.texCtrl.ni.uWrapEn = 0; imesa->regs.s3d.texCtrl.ni.vWrapEn = 0; imesa->regs.s3d.texCtrl.ni.wrapMode = (t->setup.sWrapMode == GL_REPEAT) ? TAM_Wrap : TAM_Clamp; switch (t->setup.minFilter) { case GL_NEAREST: imesa->regs.s3d.texCtrl.ni.filterMode = TFM_Point; imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_TRUE; break; case GL_LINEAR: imesa->regs.s3d.texCtrl.ni.filterMode = TFM_Bilin; imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_TRUE; break; case GL_NEAREST_MIPMAP_NEAREST: imesa->regs.s3d.texCtrl.ni.filterMode = TFM_Point; imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_FALSE; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -