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

📄 via_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
				  ctx->Color.BlendSrcA,				  ctx->Color.BlendDstA);   ctx->Driver.Scissor( ctx, ctx->Scissor.X, ctx->Scissor.Y,			ctx->Scissor.Width, ctx->Scissor.Height );   ctx->Driver.DrawBuffer( ctx, ctx->Color.DrawBuffer[0] );}/** * Convert S and T texture coordinate wrap modes to hardware bits. */static u_int32_tget_wrap_mode( GLenum sWrap, GLenum tWrap ){    u_int32_t v = 0;    switch( sWrap ) {    case GL_REPEAT:	v |= HC_HTXnMPMD_Srepeat;	break;    case GL_CLAMP:    case GL_CLAMP_TO_EDGE:	v |= HC_HTXnMPMD_Sclamp;	break;    case GL_MIRRORED_REPEAT:	v |= HC_HTXnMPMD_Smirror;	break;    }    switch( tWrap ) {    case GL_REPEAT:	v |= HC_HTXnMPMD_Trepeat;	break;    case GL_CLAMP:    case GL_CLAMP_TO_EDGE:	v |= HC_HTXnMPMD_Tclamp;	break;    case GL_MIRRORED_REPEAT:	v |= HC_HTXnMPMD_Tmirror;	break;    }        return v;}static u_int32_tget_minmag_filter( GLenum min, GLenum mag ){    u_int32_t v = 0;    switch (min) {    case GL_NEAREST:        v = HC_HTXnFLSs_Nearest |            HC_HTXnFLTs_Nearest;        break;    case GL_LINEAR:        v = HC_HTXnFLSs_Linear |            HC_HTXnFLTs_Linear;        break;    case GL_NEAREST_MIPMAP_NEAREST:        v = HC_HTXnFLSs_Nearest |            HC_HTXnFLTs_Nearest;        v |= HC_HTXnFLDs_Nearest;        break;    case GL_LINEAR_MIPMAP_NEAREST:        v = HC_HTXnFLSs_Linear |            HC_HTXnFLTs_Linear;        v |= HC_HTXnFLDs_Nearest;        break;    case GL_NEAREST_MIPMAP_LINEAR:        v = HC_HTXnFLSs_Nearest |            HC_HTXnFLTs_Nearest;        v |= HC_HTXnFLDs_Linear;        break;    case GL_LINEAR_MIPMAP_LINEAR:        v = HC_HTXnFLSs_Linear |            HC_HTXnFLTs_Linear;        v |= HC_HTXnFLDs_Linear;        break;    default:        break;    }    switch (mag) {    case GL_LINEAR:        v |= HC_HTXnFLSe_Linear |             HC_HTXnFLTe_Linear;	break;    case GL_NEAREST:        v |= HC_HTXnFLSe_Nearest |             HC_HTXnFLTe_Nearest;	break;    default:        break;    }    return v;}static GLboolean viaChooseTextureState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);    struct gl_texture_unit *texUnit0 = &ctx->Texture.Unit[0];    struct gl_texture_unit *texUnit1 = &ctx->Texture.Unit[1];    if (texUnit0->_ReallyEnabled || texUnit1->_ReallyEnabled) {        vmesa->regEnable |= HC_HenTXMP_MASK | HC_HenTXCH_MASK | HC_HenTXPP_MASK;        if (texUnit0->_ReallyEnabled) {            struct gl_texture_object *texObj = texUnit0->_Current;   	    vmesa->regHTXnTB[0] = get_minmag_filter( texObj->MinFilter,						    texObj->MagFilter );	    vmesa->regHTXnMPMD[0] &= ~(HC_HTXnMPMD_SMASK | HC_HTXnMPMD_TMASK);	    vmesa->regHTXnMPMD[0] |= get_wrap_mode( texObj->WrapS,						   texObj->WrapT );	    vmesa->regHTXnTB[0] &= ~(HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T);            if (texObj->Image[0][texObj->BaseLevel]->Border > 0) {	       vmesa->regHTXnTB[0] |= (HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T);	       vmesa->regHTXnTBC[0] = 		  PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor[0]),				 FLOAT_TO_UBYTE(texObj->BorderColor[1]),				 FLOAT_TO_UBYTE(texObj->BorderColor[2]));	       vmesa->regHTXnTRAH[0] = FLOAT_TO_UBYTE(texObj->BorderColor[3]);            }	    if (texUnit0->LodBias != 0.0f) {	       GLuint b = viaComputeLodBias(texUnit0->LodBias);	       vmesa->regHTXnTB[0] &= ~HC_HTXnFLDs_MASK;	       vmesa->regHTXnTB[0] |= HC_HTXnFLDs_ConstLOD;	       vmesa->regHTXnCLOD[0] = (b&0x1f) | (((~b)&0x1f)<<10); /* FIXME */	    }	    if (!viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 )) {	       if (VIA_DEBUG & DEBUG_TEXTURE)		  fprintf(stderr, "viaTexCombineState failed for unit 0\n");	       return GL_FALSE;	    }        }        if (texUnit1->_ReallyEnabled) {            struct gl_texture_object *texObj = texUnit1->_Current;	    vmesa->regHTXnTB[1] = get_minmag_filter( texObj->MinFilter,						    texObj->MagFilter );	    vmesa->regHTXnMPMD[1] &= ~(HC_HTXnMPMD_SMASK | HC_HTXnMPMD_TMASK);	    vmesa->regHTXnMPMD[1] |= get_wrap_mode( texObj->WrapS,						   texObj->WrapT );	    vmesa->regHTXnTB[1] &= ~(HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T);            if (texObj->Image[0][texObj->BaseLevel]->Border > 0) {	       vmesa->regHTXnTB[1] |= (HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T);	       vmesa->regHTXnTBC[1] = 		  PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor[0]),				 FLOAT_TO_UBYTE(texObj->BorderColor[1]),				 FLOAT_TO_UBYTE(texObj->BorderColor[2]));	       vmesa->regHTXnTRAH[1] = FLOAT_TO_UBYTE(texObj->BorderColor[3]);            }	    if (texUnit1->LodBias != 0.0f) {	       GLuint b = viaComputeLodBias(texUnit1->LodBias);	       vmesa->regHTXnTB[1] &= ~HC_HTXnFLDs_MASK;	       vmesa->regHTXnTB[1] |= HC_HTXnFLDs_ConstLOD;	       vmesa->regHTXnCLOD[1] = (b&0x1f) | (((~b)&0x1f)<<10); /* FIXME */	    }	    if (!viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 )) {	       if (VIA_DEBUG & DEBUG_TEXTURE)		  fprintf(stderr, "viaTexCombineState failed for unit 1\n");	       return GL_FALSE;	    }        }    }    else {        vmesa->regEnable &= ~(HC_HenTXMP_MASK | HC_HenTXCH_MASK | 			      HC_HenTXPP_MASK);    }        return GL_TRUE;}static void viaChooseColorState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);    GLenum s = ctx->Color.BlendSrcRGB;    GLenum d = ctx->Color.BlendDstRGB;    /* The HW's blending equation is:     * (Ca * FCa + Cbias + Cb * FCb) << Cshift     */    if (ctx->Color.BlendEnabled) {        vmesa->regEnable |= HC_HenABL_MASK;        /* Ca  -- always from source color.         */        vmesa->regHABLCsat = HC_HABLCsat_MASK | HC_HABLCa_OPC | HC_HABLCa_Csrc;        /* Aa  -- always from source alpha.         */        vmesa->regHABLAsat = HC_HABLAsat_MASK | HC_HABLAa_OPA | HC_HABLAa_Asrc;        /* FCa -- depend on following condition.         * FAa -- depend on following condition.         */        switch (s) {        case GL_ZERO:            /* (0, 0, 0, 0)             */            vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_HABLRCa;            vmesa->regHABLAsat |= HC_HABLFAa_OPA | HC_HABLFAa_HABLFRA;            vmesa->regHABLRFCa = 0x0;            vmesa->regHABLRAa = 0x0;            break;        case GL_ONE:            /* (1, 1, 1, 1)             */            vmesa->regHABLCsat |= HC_HABLFCa_InvOPC | HC_HABLFCa_HABLRCa;            vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_HABLFRA;            vmesa->regHABLRFCa = 0x0;            vmesa->regHABLRAa = 0x0;            break;        case GL_SRC_COLOR:            /* (Rs, Gs, Bs, As)             */            vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_Csrc;            vmesa->regHABLAsat |= HC_HABLFAa_OPA | HC_HABLFAa_Asrc;            break;        case GL_ONE_MINUS_SRC_COLOR:            /* (1, 1, 1, 1) - (Rs, Gs, Bs, As)             */            vmesa->regHABLCsat |= HC_HABLFCa_InvOPC | HC_HABLFCa_Csrc;            vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_Asrc;            break;        case GL_DST_COLOR:            /* (Rd, Gd, Bd, Ad)             */            vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_Cdst;            vmesa->regHABLAsat |= HC_HABLFAa_OPA | HC_HABLFAa_Adst;            break;        case GL_ONE_MINUS_DST_COLOR:            /* (1, 1, 1, 1) - (Rd, Gd, Bd, Ad)             */            vmesa->regHABLCsat |= HC_HABLFCa_InvOPC | HC_HABLFCa_Cdst;            vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_Adst;            break;        case GL_SRC_ALPHA:            /* (As, As, As, As)             */            vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_Asrc;            vmesa->regHABLAsat |= HC_HABLFAa_OPA | HC_HABLFAa_Asrc;            break;        case GL_ONE_MINUS_SRC_ALPHA:            /* (1, 1, 1, 1) - (As, As, As, As)             */            vmesa->regHABLCsat |= HC_HABLFCa_InvOPC | HC_HABLFCa_Asrc;            vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_Asrc;            break;        case GL_DST_ALPHA:            {                if (vmesa->viaScreen->bitsPerPixel == 16) {                    /* (1, 1, 1, 1)                     */                    vmesa->regHABLCsat |= (HC_HABLFCa_InvOPC | 					   HC_HABLFCa_HABLRCa);                    vmesa->regHABLAsat |= (HC_HABLFAa_InvOPA | 					   HC_HABLFAa_HABLFRA);                    vmesa->regHABLRFCa = 0x0;                    vmesa->regHABLRAa = 0x0;                }                else {                    /* (Ad, Ad, Ad, Ad)                     */                    vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_Adst;                    vmesa->regHABLAsat |= HC_HABLFAa_OPA | HC_HABLFAa_Adst;                }            }            break;        case GL_ONE_MINUS_DST_ALPHA:            {                if (vmesa->viaScreen->bitsPerPixel == 16) {                    /* (1, 1, 1, 1) - (1, 1, 1, 1) = (0, 0, 0, 0)                     */                    vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_HABLRCa;                    vmesa->regHABLAsat |= HC_HABLFAa_OPA | HC_HABLFAa_HABLFRA;                    vmesa->regHABLRFCa = 0x0;                    vmesa->regHABLRAa = 0x0;                }                else {                    /* (1, 1, 1, 1) - (Ad, Ad, Ad, Ad)                     */                    vmesa->regHABLCsat |= HC_HABLFCa_InvOPC | HC_HABLFCa_Adst;                    vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_Adst;                }            }            break;        case GL_SRC_ALPHA_SATURATE:            {                if (vmesa->viaScreen->bitsPerPixel == 16) {                    /* (f, f, f, 1), f = min(As, 1 - Ad) = min(As, 1 - 1) = 0                     * So (f, f, f, 1) = (0, 0, 0, 1)                     */                    vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_HABLRCa;                    vmesa->regHABLAsat |= (HC_HABLFAa_InvOPA | 					   HC_HABLFAa_HABLFRA);                    vmesa->regHABLRFCa = 0x0;                    vmesa->regHABLRAa = 0x0;                }                else {                    /* (f, f, f, 1), f = min(As, 1 - Ad)                     */                    vmesa->regHABLCsat |= (HC_HABLFCa_OPC | 					   HC_HABLFCa_mimAsrcInvAdst);                    vmesa->regHABLAsat |= (HC_HABLFAa_InvOPA | 					   HC_HABLFAa_HABLFRA);                    vmesa->regHABLRFCa = 0x0;                    vmesa->regHABLRAa = 0x0;                }            }            break;        }        /* Op is add.         */        /* bias is 0.         */        vmesa->regHABLCsat |= HC_HABLCbias_HABLRCbias;        vmesa->regHABLAsat |= HC_HABLAbias_HABLRAbias;        /* Cb  -- always from destination color.         */        vmesa->regHABLCop = HC_HABLCb_OPC | HC_HABLCb_Cdst;        /* Ab  -- always from destination alpha.         */        vmesa->regHABLAop = HC_HABLAb_OPA | HC_HABLAb_Adst;        /* FCb -- depend on following condition.         */        switch (d) {        case GL_ZERO:            /* (0, 0, 0, 0)             */            vmesa->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_HABLRCb;            vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_HABLFRA;            vmesa->regHABLRFCb = 0x0;            vmesa->regHABLRAb = 0x0;            break;        case GL_ONE:            /* (1, 1, 1, 1)             */            vmesa->regHABLCop |= HC_HABLFCb_InvOPC | HC_HABLFCb_HABLRCb;            vmesa->regHABLAop |= HC_HABLFAb_InvOPA | HC_HABLFAb_HABLFRA;            vmesa->regHABLRFCb = 0x0;            vmesa->regHABLRAb = 0x0;            break;        case GL_SRC_COLOR:            /* (Rs, Gs, Bs, As)             */            vmesa->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_Csrc;            vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_Asrc;            break;        case GL_ONE_MINUS_SRC_COLOR:            /* (1, 1, 1, 1) - (Rs, Gs, Bs, As)             */            vmesa->regHABLCop |= HC_HABLFCb_InvOPC | HC_HABLFCb_Csrc;            vmesa->regHABLAop |= HC_HABLFAb_InvOPA | HC_HABLFAb_Asrc;            break;        case GL_DST_COLOR:            /* (Rd, Gd, Bd, Ad)             */            vmesa->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_Cdst;            vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_Adst;            break;        case GL_ONE_MINUS_DST_COLOR:            /* (1, 1, 1, 1) - (Rd, Gd, Bd, Ad)             */            vmesa->regHABLCop |= HC_HABLFCb_InvOPC | HC_HABLFCb_Cdst;            vmesa->regHABLAop |= HC_HABLFAb_InvOPA | HC_HABLFAb_Adst;            break;        case GL_SRC_ALPHA:            /* (As, As, As, As)

⌨️ 快捷键说明

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