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

📄 savagetex.c

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