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