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

📄 via_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
             */            vmesa->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_Asrc;            vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_Asrc;            break;        case GL_ONE_MINUS_SRC_ALPHA:            /* (1, 1, 1, 1) - (As, As, As, As)             */            vmesa->regHABLCop |= HC_HABLFCb_InvOPC | HC_HABLFCb_Asrc;            vmesa->regHABLAop |= HC_HABLFAb_InvOPA | HC_HABLFAb_Asrc;            break;        case GL_DST_ALPHA:            {                if (vmesa->viaScreen->bitsPerPixel == 16) {                    /* (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;                }                else {                    /* (Ad, Ad, Ad, Ad)                     */                    vmesa->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_Adst;                    vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_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->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_HABLRCb;                    vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_HABLFRA;                    vmesa->regHABLRFCb = 0x0;                    vmesa->regHABLRAb = 0x0;                }                else {                    /* (1, 1, 1, 1) - (Ad, Ad, Ad, Ad)                     */                    vmesa->regHABLCop |= HC_HABLFCb_InvOPC | HC_HABLFCb_Adst;                    vmesa->regHABLAop |= HC_HABLFAb_InvOPA | HC_HABLFAb_Adst;                }            }            break;        default:            vmesa->regHABLCop |= HC_HABLFCb_OPC | HC_HABLFCb_HABLRCb;            vmesa->regHABLAop |= HC_HABLFAb_OPA | HC_HABLFAb_HABLFRA;            vmesa->regHABLRFCb = 0x0;            vmesa->regHABLRAb = 0x0;            break;        }        if (vmesa->viaScreen->bitsPerPixel <= 16)            vmesa->regEnable &= ~HC_HenDT_MASK;    }    else {        vmesa->regEnable &= (~HC_HenABL_MASK);    }    if (ctx->Color.AlphaEnabled) {        vmesa->regEnable |= HC_HenAT_MASK;        vmesa->regHATMD = FLOAT_TO_UBYTE(ctx->Color.AlphaRef) |            ((ctx->Color.AlphaFunc - GL_NEVER) << 8);    }    else {        vmesa->regEnable &= (~HC_HenAT_MASK);    }    if (ctx->Color.DitherFlag && (vmesa->viaScreen->bitsPerPixel < 32)) {        if (ctx->Color.BlendEnabled) {            vmesa->regEnable &= ~HC_HenDT_MASK;        }        else {            vmesa->regEnable |= HC_HenDT_MASK;        }    }    vmesa->regEnable &= ~HC_HenDT_MASK;    if (ctx->Color.ColorLogicOpEnabled)         vmesa->regHROP = ROP[ctx->Color.LogicOp & 0xF];    else        vmesa->regHROP = HC_HROP_P;    vmesa->regHFBBMSKL = PACK_COLOR_888(ctx->Color.ColorMask[0],					ctx->Color.ColorMask[1],					ctx->Color.ColorMask[2]);    vmesa->regHROP |= ctx->Color.ColorMask[3];    if (ctx->Color.ColorMask[3])        vmesa->regEnable |= HC_HenAW_MASK;    else        vmesa->regEnable &= ~HC_HenAW_MASK;}static void viaChooseFogState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);    if (ctx->Fog.Enabled) {        GLubyte r, g, b, a;        vmesa->regEnable |= HC_HenFOG_MASK;        /* Use fog equation 0 (OpenGL's default) & local fog.         */        vmesa->regHFogLF = 0x0;        r = (GLubyte)(ctx->Fog.Color[0] * 255.0F);        g = (GLubyte)(ctx->Fog.Color[1] * 255.0F);        b = (GLubyte)(ctx->Fog.Color[2] * 255.0F);        a = (GLubyte)(ctx->Fog.Color[3] * 255.0F);        vmesa->regHFogCL = (r << 16) | (g << 8) | b;        vmesa->regHFogCH = a;    }    else {        vmesa->regEnable &= ~HC_HenFOG_MASK;    }}static void viaChooseDepthState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);    if (ctx->Depth.Test) {        vmesa->regEnable |= HC_HenZT_MASK;        if (ctx->Depth.Mask)            vmesa->regEnable |= HC_HenZW_MASK;        else            vmesa->regEnable &= (~HC_HenZW_MASK);	vmesa->regHZWTMD = (ctx->Depth.Func - GL_NEVER) << 16;	    }    else {        vmesa->regEnable &= ~HC_HenZT_MASK;                /*=* [DBG] racer : can't display cars in car selection menu *=*/	/*if (ctx->Depth.Mask)            vmesa->regEnable |= HC_HenZW_MASK;        else            vmesa->regEnable &= (~HC_HenZW_MASK);*/	vmesa->regEnable &= (~HC_HenZW_MASK);    }}static void viaChooseLineState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);    if (ctx->Line.StippleFlag) {        vmesa->regEnable |= HC_HenLP_MASK;        vmesa->regHLP = ctx->Line.StipplePattern;        vmesa->regHLPRF = ctx->Line.StippleFactor;    }    else {        vmesa->regEnable &= ~HC_HenLP_MASK;    }}static void viaChoosePolygonState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);#if 0    /* Polygon stipple is broken - see via_state.c     */    if (ctx->Polygon.StippleFlag) {        vmesa->regEnable |= HC_HenSP_MASK;    }    else {        vmesa->regEnable &= ~HC_HenSP_MASK;    }#else    FALLBACK(vmesa, VIA_FALLBACK_POLY_STIPPLE, 	     ctx->Polygon.StippleFlag);#endif    if (ctx->Polygon.CullFlag) {        vmesa->regEnable |= HC_HenFBCull_MASK;    }    else {        vmesa->regEnable &= ~HC_HenFBCull_MASK;    }}static void viaChooseStencilState(GLcontext *ctx) {    struct via_context *vmesa = VIA_CONTEXT(ctx);        if (ctx->Stencil.Enabled) {        GLuint temp;        vmesa->regEnable |= HC_HenST_MASK;        temp = (ctx->Stencil.Ref[0] & 0xFF) << HC_HSTREF_SHIFT;        temp |= 0xFF << HC_HSTOPMSK_SHIFT;        temp |= (ctx->Stencil.ValueMask[0] & 0xFF);        vmesa->regHSTREF = temp;        temp = (ctx->Stencil.Function[0] - GL_NEVER) << 16;        switch (ctx->Stencil.FailFunc[0]) {        case GL_KEEP:            temp |= HC_HSTOPSF_KEEP;            break;        case GL_ZERO:            temp |= HC_HSTOPSF_ZERO;            break;        case GL_REPLACE:            temp |= HC_HSTOPSF_REPLACE;            break;        case GL_INVERT:            temp |= HC_HSTOPSF_INVERT;            break;        case GL_INCR:            temp |= HC_HSTOPSF_INCR;            break;        case GL_DECR:            temp |= HC_HSTOPSF_DECR;            break;        }        switch (ctx->Stencil.ZFailFunc[0]) {        case GL_KEEP:            temp |= HC_HSTOPSPZF_KEEP;            break;        case GL_ZERO:            temp |= HC_HSTOPSPZF_ZERO;            break;        case GL_REPLACE:            temp |= HC_HSTOPSPZF_REPLACE;            break;        case GL_INVERT:            temp |= HC_HSTOPSPZF_INVERT;            break;        case GL_INCR:            temp |= HC_HSTOPSPZF_INCR;            break;        case GL_DECR:            temp |= HC_HSTOPSPZF_DECR;            break;        }        switch (ctx->Stencil.ZPassFunc[0]) {        case GL_KEEP:            temp |= HC_HSTOPSPZP_KEEP;            break;        case GL_ZERO:            temp |= HC_HSTOPSPZP_ZERO;            break;        case GL_REPLACE:            temp |= HC_HSTOPSPZP_REPLACE;            break;        case GL_INVERT:            temp |= HC_HSTOPSPZP_INVERT;            break;        case GL_INCR:            temp |= HC_HSTOPSPZP_INCR;            break;        case GL_DECR:            temp |= HC_HSTOPSPZP_DECR;            break;        }        vmesa->regHSTMD = temp;    }    else {        vmesa->regEnable &= ~HC_HenST_MASK;    }}static void viaChooseTriangle(GLcontext *ctx) {           struct via_context *vmesa = VIA_CONTEXT(ctx);    if (ctx->Polygon.CullFlag == GL_TRUE) {        switch (ctx->Polygon.CullFaceMode) {        case GL_FRONT:            if (ctx->Polygon.FrontFace == GL_CCW)                vmesa->regCmdB |= HC_HBFace_MASK;            else                vmesa->regCmdB &= ~HC_HBFace_MASK;            break;        case GL_BACK:            if (ctx->Polygon.FrontFace == GL_CW)                vmesa->regCmdB |= HC_HBFace_MASK;            else                vmesa->regCmdB &= ~HC_HBFace_MASK;            break;        case GL_FRONT_AND_BACK:            return;        }    }}void viaValidateState( GLcontext *ctx ){    struct via_context *vmesa = VIA_CONTEXT(ctx);    if (vmesa->newState & _NEW_TEXTURE) {       GLboolean ok = (viaChooseTextureState(ctx) &&		       viaUpdateTextureState(ctx));       FALLBACK(vmesa, VIA_FALLBACK_TEXTURE, !ok);    }    if (vmesa->newState & _NEW_COLOR)        viaChooseColorState(ctx);    if (vmesa->newState & _NEW_DEPTH)        viaChooseDepthState(ctx);    if (vmesa->newState & _NEW_FOG)        viaChooseFogState(ctx);    if (vmesa->newState & _NEW_LINE)        viaChooseLineState(ctx);    if (vmesa->newState & (_NEW_POLYGON | _NEW_POLYGONSTIPPLE)) {        viaChoosePolygonState(ctx);	viaChooseTriangle(ctx);    }    if ((vmesa->newState & _NEW_STENCIL) && vmesa->have_hw_stencil)        viaChooseStencilState(ctx);        if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)        vmesa->regEnable |= HC_HenCS_MASK;    else        vmesa->regEnable &= ~HC_HenCS_MASK;    if (ctx->Point.SmoothFlag ||	ctx->Line.SmoothFlag ||	ctx->Polygon.SmoothFlag)        vmesa->regEnable |= HC_HenAA_MASK;    else         vmesa->regEnable &= ~HC_HenAA_MASK;    vmesa->newEmitState |= vmesa->newState;    vmesa->newState = 0;}static void viaInvalidateState(GLcontext *ctx, GLuint newState){    struct via_context *vmesa = VIA_CONTEXT(ctx);    VIA_FINISH_PRIM( vmesa );    vmesa->newState |= newState;    _swrast_InvalidateState(ctx, newState);    _swsetup_InvalidateState(ctx, newState);    _vbo_InvalidateState(ctx, newState);    _tnl_InvalidateState(ctx, newState);}void viaInitStateFuncs(GLcontext *ctx){    /* Callbacks for internal Mesa events.     */    ctx->Driver.UpdateState = viaInvalidateState;    /* API callbacks     */    ctx->Driver.BlendEquationSeparate = viaBlendEquationSeparate;    ctx->Driver.BlendFuncSeparate = viaBlendFuncSeparate;    ctx->Driver.ClearColor = viaClearColor;    ctx->Driver.ColorMask = viaColorMask;    ctx->Driver.DrawBuffer = viaDrawBuffer;    ctx->Driver.RenderMode = viaRenderMode;    ctx->Driver.Scissor = viaScissor;    ctx->Driver.DepthRange = viaDepthRange;    ctx->Driver.Viewport = viaViewport;    ctx->Driver.Enable = viaEnable;    /* XXX this should go away */    ctx->Driver.ResizeBuffers = viaReAllocateBuffers;}

⌨️ 快捷键说明

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