📄 via_state.c
字号:
*/ 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 + -