📄 via_tris.c
字号:
} if (setupIndex != vmesa->setupIndex) { vmesa->vertexSize = _tnl_install_attrs( ctx, vmesa->vertex_attrs, vmesa->vertex_attr_count, vmesa->ViewportMatrix.m, 0 ); vmesa->vertexSize >>= 2; vmesa->setupIndex = setupIndex; vmesa->regCmdB &= ~HC_HVPMSK_MASK; vmesa->regCmdB |= regCmdB; if (vmesa->ptexHack) vmesa->hwVertexSize = vmesa->vertexSize - 1; else vmesa->hwVertexSize = vmesa->vertexSize; }}/* Check if projective texture coordinates are used and if we can fake * them. Fallback to swrast if we can't. Returns GL_TRUE if projective * texture coordinates must be faked, GL_FALSE otherwise. */static GLboolean viaCheckPTexHack( GLcontext *ctx ){ TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; DECLARE_RENDERINPUTS(index_bitset); GLboolean fallback = GL_FALSE; GLboolean ptexHack = GL_FALSE; RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 ) && VB->TexCoordPtr[0]->size == 4) { if (!RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_ATTRIB_TEX1, _TNL_LAST_TEX )) ptexHack = GL_TRUE; else fallback = GL_TRUE; } if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 ) && VB->TexCoordPtr[1]->size == 4) fallback = GL_TRUE; FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_PROJ_TEXTURE, fallback); return ptexHack;}/**********************************************************************//* High level hooks for t_vb_render.c *//**********************************************************************/static void viaRenderStart(GLcontext *ctx){ struct via_context *vmesa = VIA_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; { GLboolean ptexHack = viaCheckPTexHack( ctx ); if (ptexHack != vmesa->ptexHack) { vmesa->ptexHack = ptexHack; vmesa->newRenderState |= _VIA_NEW_RENDERSTATE; } } if (vmesa->newState) { vmesa->newRenderState |= vmesa->newState; viaValidateState( ctx ); } if (vmesa->Fallback) { tnl->Driver.Render.Start(ctx); return; } if (vmesa->newRenderState) { viaChooseVertexState(ctx); viaChooseRenderState(ctx); vmesa->newRenderState = 0; } /* Important: */ VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;}static void viaRenderFinish(GLcontext *ctx){ VIA_FINISH_PRIM(VIA_CONTEXT(ctx));}/* System to flush dma and emit state changes based on the rasterized * primitive. */void viaRasterPrimitive(GLcontext *ctx, GLenum glprim, GLenum hwprim){ struct via_context *vmesa = VIA_CONTEXT(ctx); GLuint regCmdB; RING_VARS; if (VIA_DEBUG & DEBUG_PRIMS) fprintf(stderr, "%s: %s/%s/%s\n", __FUNCTION__, _mesa_lookup_enum_by_nr(glprim), _mesa_lookup_enum_by_nr(hwprim), _mesa_lookup_enum_by_nr(ctx->Light.ShadeModel)); assert (!vmesa->newState); vmesa->renderPrimitive = glprim; if (hwprim != vmesa->hwPrimitive || ctx->Light.ShadeModel != vmesa->hwShadeModel) { VIA_FINISH_PRIM(vmesa); /* Ensure no wrapping inside this function */ viaCheckDma( vmesa, 1024 ); if (vmesa->newEmitState) { viaEmitState(vmesa); } vmesa->regCmdA_End = HC_ACMD_HCmdA; if (ctx->Light.ShadeModel == GL_SMOOTH) { vmesa->regCmdA_End |= HC_HShading_Gouraud; } vmesa->hwShadeModel = ctx->Light.ShadeModel; regCmdB = vmesa->regCmdB; switch (hwprim) { case GL_POINTS: vmesa->regCmdA_End |= HC_HPMType_Point | HC_HVCycle_Full; vmesa->regCmdA_End |= HC_HShading_Gouraud; /* always Gouraud shade points?!? */ break; case GL_LINES: vmesa->regCmdA_End |= HC_HPMType_Line | HC_HVCycle_Full; regCmdB |= HC_HLPrst_MASK; if (ctx->Light.ShadeModel == GL_FLAT) vmesa->regCmdA_End |= HC_HShading_FlatB; break; case GL_LINE_LOOP: case GL_LINE_STRIP: vmesa->regCmdA_End |= HC_HPMType_Line | HC_HVCycle_AFP | HC_HVCycle_AB | HC_HVCycle_NewB; regCmdB |= HC_HVCycle_AB | HC_HVCycle_NewB | HC_HLPrst_MASK; if (ctx->Light.ShadeModel == GL_FLAT) vmesa->regCmdA_End |= HC_HShading_FlatB; break; case GL_TRIANGLES: vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_Full; if (ctx->Light.ShadeModel == GL_FLAT) vmesa->regCmdA_End |= HC_HShading_FlatC; break; case GL_TRIANGLE_STRIP: vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_AFP | HC_HVCycle_AC | HC_HVCycle_BB | HC_HVCycle_NewC; regCmdB |= HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC; if (ctx->Light.ShadeModel == GL_FLAT) vmesa->regCmdA_End |= HC_HShading_FlatC; break; case GL_TRIANGLE_FAN: vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_AFP | HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC; regCmdB |= HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC; if (ctx->Light.ShadeModel == GL_FLAT) vmesa->regCmdA_End |= HC_HShading_FlatC; break; case GL_QUADS: abort(); return; case GL_QUAD_STRIP: abort(); return; case GL_POLYGON: vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_AFP | HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC; regCmdB |= HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC; if (ctx->Light.ShadeModel == GL_FLAT) vmesa->regCmdA_End |= HC_HShading_FlatC; break; default: abort(); return; } /* assert((vmesa->dmaLow & 0x4) == 0); */ if (vmesa->dmaCliprectAddr == ~0) { if (VIA_DEBUG & DEBUG_DMA) fprintf(stderr, "reserve cliprect space at %x\n", vmesa->dmaLow); vmesa->dmaCliprectAddr = vmesa->dmaLow; BEGIN_RING(8); OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_NotTex << 16) ); OUT_RING( 0xCCCCCCCC ); OUT_RING( 0xCCCCCCCC ); OUT_RING( 0xCCCCCCCC ); OUT_RING( 0xCCCCCCCC ); OUT_RING( 0xCCCCCCCC ); OUT_RING( 0xCCCCCCCC ); ADVANCE_RING(); } assert(vmesa->dmaLastPrim == 0); BEGIN_RING(8); OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_NotTex << 16) ); OUT_RING( 0xCCCCCCCC ); OUT_RING( 0xDDDDDDDD ); OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_CmdVdata << 16) ); OUT_RING( regCmdB ); OUT_RING( vmesa->regCmdA_End ); ADVANCE_RING(); vmesa->hwPrimitive = hwprim; vmesa->dmaLastPrim = vmesa->dmaLow; } else { assert(!vmesa->newEmitState); }}/* Callback for mesa: */static void viaRenderPrimitive( GLcontext *ctx, GLuint prim ){ viaRasterPrimitive( ctx, prim, hwPrim[prim] );}void viaFinishPrimitive(struct via_context *vmesa){ if (VIA_DEBUG & (DEBUG_DMA|DEBUG_PRIMS)) fprintf(stderr, "%s\n", __FUNCTION__); if (!vmesa->dmaLastPrim || vmesa->dmaCliprectAddr == ~0) { assert(0); } else if (vmesa->dmaLow != vmesa->dmaLastPrim) { GLuint cmdA = (vmesa->regCmdA_End | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK); RING_VARS; vmesa->dmaLastPrim = 0; /* KW: modified 0x1 to 0x4 below: */ if ((vmesa->dmaLow & 0x4) || !vmesa->useAgp) { BEGIN_RING_NOCHECK( 1 ); OUT_RING( cmdA ); ADVANCE_RING(); } else { BEGIN_RING_NOCHECK( 2 ); OUT_RING( cmdA ); OUT_RING( cmdA ); ADVANCE_RING(); } if (vmesa->dmaLow > VIA_DMA_HIGHWATER) viaFlushDma( vmesa ); } else { if (VIA_DEBUG & (DEBUG_DMA|DEBUG_PRIMS)) fprintf(stderr, "remove empty primitive\n"); /* Remove the primitive header: */ vmesa->dmaLastPrim = 0; vmesa->dmaLow -= 8 * sizeof(GLuint); /* Maybe remove the cliprect as well: */ if (vmesa->dmaCliprectAddr == vmesa->dmaLow - 8 * sizeof(GLuint)) { vmesa->dmaLow -= 8 * sizeof(GLuint); vmesa->dmaCliprectAddr = ~0; } } vmesa->renderPrimitive = GL_POLYGON + 1; vmesa->hwPrimitive = GL_POLYGON + 1; vmesa->dmaLastPrim = 0;}/**********************************************************************//* Transition to/from hardware rasterization. *//**********************************************************************/void viaFallback(struct via_context *vmesa, GLuint bit, GLboolean mode){ GLcontext *ctx = vmesa->glCtx; TNLcontext *tnl = TNL_CONTEXT(ctx); GLuint oldfallback = vmesa->Fallback; if (mode) { vmesa->Fallback |= bit; if (oldfallback == 0) { VIA_FLUSH_DMA(vmesa); if (VIA_DEBUG & DEBUG_FALLBACKS) fprintf(stderr, "ENTER FALLBACK %x\n", bit); _swsetup_Wakeup(ctx); vmesa->renderIndex = ~0; } } else { vmesa->Fallback &= ~bit; if (oldfallback == bit) { _swrast_flush( ctx ); if (VIA_DEBUG & DEBUG_FALLBACKS) fprintf(stderr, "LEAVE FALLBACK %x\n", bit); tnl->Driver.Render.Start = viaRenderStart; tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive; tnl->Driver.Render.Finish = viaRenderFinish; tnl->Driver.Render.BuildVertices = _tnl_build_vertices; tnl->Driver.Render.CopyPV = _tnl_copy_pv; tnl->Driver.Render.Interp = _tnl_interp; tnl->Driver.Render.ResetLineStipple = viaResetLineStipple; _tnl_invalidate_vertex_state( ctx, ~0 ); _tnl_invalidate_vertices( ctx, ~0 ); _tnl_install_attrs( ctx, vmesa->vertex_attrs, vmesa->vertex_attr_count, vmesa->ViewportMatrix.m, 0 ); vmesa->newState |= (_VIA_NEW_RENDERSTATE|_VIA_NEW_VERTEX); } } }static void viaRunPipeline( GLcontext *ctx ){ struct via_context *vmesa = VIA_CONTEXT(ctx); if (vmesa->newState) { vmesa->newRenderState |= vmesa->newState; viaValidateState( ctx ); } _tnl_run_pipeline( ctx );}/**********************************************************************//* Initialization. *//**********************************************************************/void viaInitTriFuncs(GLcontext *ctx){ struct via_context *vmesa = VIA_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); static int firsttime = 1; if (firsttime) { init_rast_tab(); firsttime = 0; } tnl->Driver.RunPipeline = viaRunPipeline; tnl->Driver.Render.Start = viaRenderStart; tnl->Driver.Render.Finish = viaRenderFinish; tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive; tnl->Driver.Render.ResetLineStipple = viaResetLineStipple; tnl->Driver.Render.BuildVertices = _tnl_build_vertices; tnl->Driver.Render.CopyPV = _tnl_copy_pv; tnl->Driver.Render.Interp = _tnl_interp; _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12, (6 + 2*ctx->Const.MaxTextureUnits) * sizeof(GLfloat) ); vmesa->verts = (GLubyte *)tnl->clipspace.vertex_buf;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -