📄 r200_vtxfmt.c
字号:
return GL_TRUE;}void r200VtxfmtInvalidate( GLcontext *ctx ){ r200ContextPtr rmesa = R200_CONTEXT( ctx ); rmesa->vb.recheck = GL_TRUE; rmesa->vb.fell_back = GL_FALSE;}static void r200VtxfmtValidate( GLcontext *ctx ){ r200ContextPtr rmesa = R200_CONTEXT( ctx ); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s\n", __FUNCTION__); if (ctx->Driver.NeedFlush) ctx->Driver.FlushVertices( ctx, ctx->Driver.NeedFlush ); rmesa->vb.recheck = GL_FALSE; if (check_vtx_fmt( ctx )) { if (!rmesa->vb.installed) { if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "reinstall (new install)\n"); _mesa_install_exec_vtxfmt( ctx, &rmesa->vb.vtxfmt ); ctx->Driver.FlushVertices = r200VtxFmtFlushVertices; rmesa->vb.installed = GL_TRUE; } else if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s: already installed", __FUNCTION__); } else { if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s: failed\n", __FUNCTION__); if (rmesa->vb.installed) { if (rmesa->dma.flush) rmesa->dma.flush( rmesa ); _tnl_wakeup_exec( ctx ); ctx->Driver.FlushVertices = r200FlushVertices; rmesa->vb.installed = GL_FALSE; } } }/* Materials: */static void r200_Materialfv( GLenum face, GLenum pname, const GLfloat *params ){ GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT( ctx ); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s\n", __FUNCTION__); if (rmesa->vb.prim[0] != GL_POLYGON+1) { VFMT_FALLBACK( __FUNCTION__ ); CALL_Materialfv(GET_DISPATCH(), (face, pname, params)); return; } _mesa_noop_Materialfv( face, pname, params ); r200UpdateMaterial( ctx );}/* Begin/End */static void r200_Begin( GLenum mode ){ GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT(ctx); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s( %s )\n", __FUNCTION__, _mesa_lookup_enum_by_nr( mode )); if (mode > GL_POLYGON) { _mesa_error( ctx, GL_INVALID_ENUM, "glBegin" ); return; } if (rmesa->vb.prim[0] != GL_POLYGON+1) { _mesa_error( ctx, GL_INVALID_OPERATION, "glBegin" ); return; } if (ctx->NewState) _mesa_update_state( ctx ); if (rmesa->NewGLState) r200ValidateState( ctx ); if (rmesa->vb.recheck) r200VtxfmtValidate( ctx ); if (!rmesa->vb.installed) { CALL_Begin(GET_DISPATCH(), (mode)); return; } if (rmesa->dma.flush && rmesa->vb.counter < 12) { if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s: flush almost-empty buffers\n", __FUNCTION__); flush_prims( rmesa ); } /* Need to arrange to save vertices here? Or always copy from dma (yuk)? */ if (!rmesa->dma.flush) { if (rmesa->dma.current.ptr + 12*rmesa->vb.vertex_size*4 > rmesa->dma.current.end) { R200_NEWPRIM( rmesa ); r200RefillCurrentDmaRegion( rmesa ); } rmesa->vb.dmaptr = (int *)(rmesa->dma.current.address + rmesa->dma.current.ptr); rmesa->vb.counter = (rmesa->dma.current.end - rmesa->dma.current.ptr) / (rmesa->vb.vertex_size * 4); rmesa->vb.counter--; rmesa->vb.initial_counter = rmesa->vb.counter; rmesa->vb.notify = wrap_buffer; rmesa->dma.flush = flush_prims; ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; } rmesa->vb.prim[0] = mode; start_prim( rmesa, mode | PRIM_BEGIN );}static void r200_End( void ){ GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT(ctx); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s\n", __FUNCTION__); if (rmesa->vb.prim[0] == GL_POLYGON+1) { _mesa_error( ctx, GL_INVALID_OPERATION, "glEnd" ); return; } note_last_prim( rmesa, PRIM_END ); rmesa->vb.prim[0] = GL_POLYGON+1;}/* Fallback on difficult entrypoints: */#define PRE_LOOPBACK( FUNC ) \do { \ if (R200_DEBUG & DEBUG_VFMT) \ fprintf(stderr, "%s\n", __FUNCTION__); \ VFMT_FALLBACK( __FUNCTION__ ); \} while (0)#define TAG(x) r200_fallback_##x#include "vtxfmt_tmp.h"static GLboolean r200NotifyBegin( GLcontext *ctx, GLenum p ){ r200ContextPtr rmesa = R200_CONTEXT( ctx ); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s\n", __FUNCTION__); assert(!rmesa->vb.installed); if (ctx->NewState) _mesa_update_state( ctx ); if (rmesa->NewGLState) r200ValidateState( ctx ); if (ctx->Driver.NeedFlush) ctx->Driver.FlushVertices( ctx, ctx->Driver.NeedFlush ); if (rmesa->vb.recheck) r200VtxfmtValidate( ctx ); if (!rmesa->vb.installed) { if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s -- failed\n", __FUNCTION__); return GL_FALSE; } r200_Begin( p ); return GL_TRUE;}static void r200VtxFmtFlushVertices( GLcontext *ctx, GLuint flags ){ r200ContextPtr rmesa = R200_CONTEXT( ctx ); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "%s\n", __FUNCTION__); assert(rmesa->vb.installed); if (flags & FLUSH_UPDATE_CURRENT) { r200_copy_to_current( ctx ); if (R200_DEBUG & DEBUG_VFMT) fprintf(stderr, "reinstall on update_current\n"); _mesa_install_exec_vtxfmt( ctx, &rmesa->vb.vtxfmt ); ctx->Driver.NeedFlush &= ~FLUSH_UPDATE_CURRENT; } if (flags & FLUSH_STORED_VERTICES) { assert (rmesa->dma.flush == 0 || rmesa->dma.flush == flush_prims); if (rmesa->dma.flush == flush_prims) flush_prims( rmesa ); ctx->Driver.NeedFlush &= ~FLUSH_STORED_VERTICES; }}/* At this point, don't expect very many versions of each function to * be generated, so not concerned about freeing them? */void r200VtxfmtInit( GLcontext *ctx, GLboolean useCodegen ){ r200ContextPtr rmesa = R200_CONTEXT( ctx ); GLvertexformat *vfmt = &(rmesa->vb.vtxfmt); MEMSET( vfmt, 0, sizeof(GLvertexformat) ); /* Hook in chooser functions for codegen, etc: */ r200VtxfmtInitChoosers( vfmt ); /* Handled fully in supported states, but no codegen: */ vfmt->Materialfv = r200_Materialfv; vfmt->ArrayElement = _ae_loopback_array_elt; /* generic helper */ vfmt->Rectf = _mesa_noop_Rectf; /* generic helper */ vfmt->Begin = r200_Begin; vfmt->End = r200_End; /* Fallback for performance reasons: (Fix with cva/elt path here and * dmatmp2.h style primitive-merging) * * These should call NotifyBegin(), as should _tnl_EvalMesh, to allow * a driver-hook. */ vfmt->DrawArrays = r200_fallback_DrawArrays; vfmt->DrawElements = r200_fallback_DrawElements; vfmt->DrawRangeElements = r200_fallback_DrawRangeElements; /* Not active in supported states; just keep ctx->Current uptodate: */ vfmt->EdgeFlag = _mesa_noop_EdgeFlag; vfmt->EdgeFlagv = _mesa_noop_EdgeFlagv; vfmt->Indexf = _mesa_noop_Indexf; vfmt->Indexfv = _mesa_noop_Indexfv; /* Active but unsupported -- fallback if we receive these: */ vfmt->CallList = r200_fallback_CallList; vfmt->CallLists = r200_fallback_CallLists; vfmt->EvalCoord1f = r200_fallback_EvalCoord1f; vfmt->EvalCoord1fv = r200_fallback_EvalCoord1fv; vfmt->EvalCoord2f = r200_fallback_EvalCoord2f; vfmt->EvalCoord2fv = r200_fallback_EvalCoord2fv; vfmt->EvalMesh1 = r200_fallback_EvalMesh1; vfmt->EvalMesh2 = r200_fallback_EvalMesh2; vfmt->EvalPoint1 = r200_fallback_EvalPoint1; vfmt->EvalPoint2 = r200_fallback_EvalPoint2; vfmt->TexCoord4f = r200_fallback_TexCoord4f; vfmt->TexCoord4fv = r200_fallback_TexCoord4fv; vfmt->MultiTexCoord4fARB = r200_fallback_MultiTexCoord4fARB; vfmt->MultiTexCoord4fvARB = r200_fallback_MultiTexCoord4fvARB; vfmt->Vertex4f = r200_fallback_Vertex4f; vfmt->Vertex4fv = r200_fallback_Vertex4fv; vfmt->VertexAttrib1fNV = r200_fallback_VertexAttrib1fNV; vfmt->VertexAttrib1fvNV = r200_fallback_VertexAttrib1fvNV; vfmt->VertexAttrib2fNV = r200_fallback_VertexAttrib2fNV; vfmt->VertexAttrib2fvNV = r200_fallback_VertexAttrib2fvNV; vfmt->VertexAttrib3fNV = r200_fallback_VertexAttrib3fNV; vfmt->VertexAttrib3fvNV = r200_fallback_VertexAttrib3fvNV; vfmt->VertexAttrib4fNV = r200_fallback_VertexAttrib4fNV; vfmt->VertexAttrib4fvNV = r200_fallback_VertexAttrib4fvNV; vfmt->FogCoordfEXT = r200_fallback_FogCoordfEXT; vfmt->FogCoordfvEXT = r200_fallback_FogCoordfvEXT; (void)r200_fallback_vtxfmt; TNL_CONTEXT(ctx)->Driver.NotifyBegin = r200NotifyBegin; rmesa->vb.enabled = 1; rmesa->vb.prim = &ctx->Driver.CurrentExecPrimitive; rmesa->vb.primflags = 0; make_empty_list( &rmesa->vb.dfn_cache.Vertex2f ); make_empty_list( &rmesa->vb.dfn_cache.Vertex2fv ); make_empty_list( &rmesa->vb.dfn_cache.Vertex3f ); make_empty_list( &rmesa->vb.dfn_cache.Vertex3fv ); make_empty_list( &rmesa->vb.dfn_cache.Color4ub ); make_empty_list( &rmesa->vb.dfn_cache.Color4ubv ); make_empty_list( &rmesa->vb.dfn_cache.Color3ub ); make_empty_list( &rmesa->vb.dfn_cache.Color3ubv ); make_empty_list( &rmesa->vb.dfn_cache.Color4f ); make_empty_list( &rmesa->vb.dfn_cache.Color4fv ); make_empty_list( &rmesa->vb.dfn_cache.Color3f ); make_empty_list( &rmesa->vb.dfn_cache.Color3fv ); make_empty_list( &rmesa->vb.dfn_cache.SecondaryColor3fEXT ); make_empty_list( &rmesa->vb.dfn_cache.SecondaryColor3fvEXT ); make_empty_list( &rmesa->vb.dfn_cache.SecondaryColor3ubEXT ); make_empty_list( &rmesa->vb.dfn_cache.SecondaryColor3ubvEXT ); make_empty_list( &rmesa->vb.dfn_cache.Normal3f ); make_empty_list( &rmesa->vb.dfn_cache.Normal3fv ); make_empty_list( &rmesa->vb.dfn_cache.TexCoord3f ); make_empty_list( &rmesa->vb.dfn_cache.TexCoord3fv ); make_empty_list( &rmesa->vb.dfn_cache.TexCoord2f ); make_empty_list( &rmesa->vb.dfn_cache.TexCoord2fv ); make_empty_list( &rmesa->vb.dfn_cache.TexCoord1f ); make_empty_list( &rmesa->vb.dfn_cache.TexCoord1fv ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord3fARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord3fvARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord2fARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fvARB );/* make_empty_list( &rmesa->vb.dfn_cache.FogCoordfEXT ); make_empty_list( &rmesa->vb.dfn_cache.FogCoordfvEXT );*/ r200InitCodegen( &rmesa->vb.codegen, useCodegen );}static void free_funcs( struct dynfn *l ){ struct dynfn *f, *tmp; foreach_s (f, tmp, l) { remove_from_list( f ); _mesa_exec_free( f->code ); _mesa_free( f ); }}void r200VtxfmtUnbindContext( GLcontext *ctx ){}void r200VtxfmtMakeCurrent( GLcontext *ctx ){}void r200VtxfmtDestroy( GLcontext *ctx ){ r200ContextPtr rmesa = R200_CONTEXT( ctx ); count_funcs( rmesa ); free_funcs( &rmesa->vb.dfn_cache.Vertex2f ); free_funcs( &rmesa->vb.dfn_cache.Vertex2fv ); free_funcs( &rmesa->vb.dfn_cache.Vertex3f ); free_funcs( &rmesa->vb.dfn_cache.Vertex3fv ); free_funcs( &rmesa->vb.dfn_cache.Color4ub ); free_funcs( &rmesa->vb.dfn_cache.Color4ubv ); free_funcs( &rmesa->vb.dfn_cache.Color3ub ); free_funcs( &rmesa->vb.dfn_cache.Color3ubv ); free_funcs( &rmesa->vb.dfn_cache.Color4f ); free_funcs( &rmesa->vb.dfn_cache.Color4fv ); free_funcs( &rmesa->vb.dfn_cache.Color3f ); free_funcs( &rmesa->vb.dfn_cache.Color3fv ); free_funcs( &rmesa->vb.dfn_cache.SecondaryColor3ubEXT ); free_funcs( &rmesa->vb.dfn_cache.SecondaryColor3ubvEXT ); free_funcs( &rmesa->vb.dfn_cache.SecondaryColor3fEXT ); free_funcs( &rmesa->vb.dfn_cache.SecondaryColor3fvEXT ); free_funcs( &rmesa->vb.dfn_cache.Normal3f ); free_funcs( &rmesa->vb.dfn_cache.Normal3fv ); free_funcs( &rmesa->vb.dfn_cache.TexCoord3f ); free_funcs( &rmesa->vb.dfn_cache.TexCoord3fv ); free_funcs( &rmesa->vb.dfn_cache.TexCoord2f ); free_funcs( &rmesa->vb.dfn_cache.TexCoord2fv ); free_funcs( &rmesa->vb.dfn_cache.TexCoord1f ); free_funcs( &rmesa->vb.dfn_cache.TexCoord1fv ); free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord3fARB ); free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord3fvARB ); free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord2fARB ); free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord1fvARB );/* free_funcs( &rmesa->vb.dfn_cache.FogCoordfEXT ); free_funcs( &rmesa->vb.dfn_cache.FogCoordfvEXT );*/}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -