diff -ru -x CVS lib/GL/mesa/src/drv.orig/r200/r200_context.c lib/GL/mesa/src/drv/r200/r200_context.c --- lib/GL/mesa/src/drv.orig/r200/r200_context.c Tue Mar 11 17:51:23 2003 +++ lib/GL/mesa/src/drv/r200/r200_context.c Tue Mar 11 17:46:57 2003 @@ -391,6 +391,7 @@ */ _tnl_destroy_pipeline( ctx ); _tnl_install_pipeline( ctx, r200_pipeline ); + ctx->Driver.FlushVertices = r200FlushVertices; /* Try and keep materials and vertices separate: */ diff -ru -x CVS lib/GL/mesa/src/drv.orig/r200/r200_swtcl.c lib/GL/mesa/src/drv/r200/r200_swtcl.c --- lib/GL/mesa/src/drv.orig/r200/r200_swtcl.c Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/r200/r200_swtcl.c Tue Mar 11 17:46:57 2003 @@ -44,6 +44,7 @@ #include "math/m_translate.h" #include "tnl/tnl.h" #include "tnl/t_context.h" +#include "tnl/t_imm_exec.h" #include "tnl/t_pipeline.h" #include "r200_context.h" @@ -1220,6 +1221,14 @@ r200ChooseVertexState( ctx ); } + +void r200FlushVertices( GLcontext *ctx, GLuint flags ) +{ + _tnl_flush_vertices( ctx, flags ); + + if (flags & FLUSH_STORED_VERTICES) + R200_FIREVERTICES( R200_CONTEXT( ctx ) ); +} /**********************************************************************/ /* Initialization. */ diff -ru -x CVS lib/GL/mesa/src/drv.orig/r200/r200_swtcl.h lib/GL/mesa/src/drv/r200/r200_swtcl.h --- lib/GL/mesa/src/drv.orig/r200/r200_swtcl.h Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/r200/r200_swtcl.h Tue Mar 11 17:46:57 2003 @@ -42,6 +42,7 @@ extern void r200InitSwtcl( GLcontext *ctx ); extern void r200DestroySwtcl( GLcontext *ctx ); +extern void r200FlushVertices( GLcontext *ctx, GLuint flags ); extern void r200ChooseRenderState( GLcontext *ctx ); extern void r200ChooseVertexState( GLcontext *ctx ); diff -ru -x CVS lib/GL/mesa/src/drv.orig/r200/r200_vtxfmt.c lib/GL/mesa/src/drv/r200/r200_vtxfmt.c --- lib/GL/mesa/src/drv.orig/r200/r200_vtxfmt.c Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/r200/r200_vtxfmt.c Tue Mar 11 17:47:00 2003 @@ -38,6 +38,7 @@ #include "r200_ioctl.h" #include "r200_tex.h" #include "r200_tcl.h" +#include "r200_swtcl.h" #include "r200_vtxfmt.h" #include "api_noop.h" @@ -59,7 +60,7 @@ struct r200_vb vb; -static void r200FlushVertices( GLcontext *, GLuint ); +static void r200VtxFmtFlushVertices( GLcontext *, GLuint ); static void count_func( const char *name, struct dynfn *l ) { @@ -357,12 +358,13 @@ fprintf(stderr, "%s from %s\n", __FUNCTION__, caller); if (ctx->Driver.NeedFlush) - r200FlushVertices( ctx, ctx->Driver.NeedFlush ); + r200VtxFmtFlushVertices( ctx, ctx->Driver.NeedFlush ); if (ctx->NewState) _mesa_update_state( ctx ); /* clear state so fell_back sticks */ _tnl_wakeup_exec( ctx ); + ctx->Driver.FlushVertices = r200FlushVertices; assert( rmesa->dma.flush == 0 ); rmesa->vb.fell_back = GL_TRUE; @@ -404,6 +406,7 @@ prim = rmesa->vb.prim[0]; ctx->Driver.CurrentExecPrimitive = GL_POLYGON+1; _tnl_wakeup_exec( ctx ); + ctx->Driver.FlushVertices = r200FlushVertices; assert(rmesa->dma.flush == 0); rmesa->vb.fell_back = GL_TRUE; @@ -756,7 +759,7 @@ fprintf(stderr, "reinstall (new install)\n"); _mesa_install_exec_vtxfmt( ctx, &rmesa->vb.vtxfmt ); - ctx->Driver.FlushVertices = r200FlushVertices; + ctx->Driver.FlushVertices = r200VtxFmtFlushVertices; ctx->Driver.NewList = r200NewList; rmesa->vb.installed = GL_TRUE; vb.context = ctx; @@ -772,6 +775,7 @@ if (rmesa->dma.flush) rmesa->dma.flush( rmesa ); _tnl_wakeup_exec( ctx ); + ctx->Driver.FlushVertices = r200FlushVertices; rmesa->vb.installed = GL_FALSE; vb.context = 0; } @@ -931,7 +935,7 @@ return GL_TRUE; } -static void r200FlushVertices( GLcontext *ctx, GLuint flags ) +static void r200VtxFmtFlushVertices( GLcontext *ctx, GLuint flags ) { r200ContextPtr rmesa = R200_CONTEXT( ctx ); diff -ru -x CVS lib/GL/mesa/src/drv.orig/radeon/radeon_context.c lib/GL/mesa/src/drv/radeon/radeon_context.c --- lib/GL/mesa/src/drv.orig/radeon/radeon_context.c Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/radeon/radeon_context.c Tue Mar 11 17:47:00 2003 @@ -382,6 +382,7 @@ */ _tnl_destroy_pipeline( ctx ); _tnl_install_pipeline( ctx, radeon_pipeline ); + ctx->Driver.FlushVertices = radeonFlushVertices; /* Try and keep materials and vertices separate: */ diff -ru -x CVS lib/GL/mesa/src/drv.orig/radeon/radeon_swtcl.c lib/GL/mesa/src/drv/radeon/radeon_swtcl.c --- lib/GL/mesa/src/drv.orig/radeon/radeon_swtcl.c Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/radeon/radeon_swtcl.c Tue Mar 11 17:47:00 2003 @@ -45,6 +45,7 @@ #include "math/m_translate.h" #include "tnl/tnl.h" #include "tnl/t_context.h" +#include "tnl/t_imm_exec.h" #include "tnl/t_pipeline.h" #include "radeon_context.h" @@ -1133,6 +1134,14 @@ } } + +void radeonFlushVertices( GLcontext *ctx, GLuint flags ) +{ + _tnl_flush_vertices( ctx, flags ); + + if (flags & FLUSH_STORED_VERTICES) + RADEON_FIREVERTICES( RADEON_CONTEXT( ctx ) ); +} /**********************************************************************/ /* Initialization. */ diff -ru -x CVS lib/GL/mesa/src/drv.orig/radeon/radeon_swtcl.h lib/GL/mesa/src/drv/radeon/radeon_swtcl.h --- lib/GL/mesa/src/drv.orig/radeon/radeon_swtcl.h Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/radeon/radeon_swtcl.h Tue Mar 11 17:47:00 2003 @@ -43,6 +43,7 @@ extern void radeonInitSwtcl( GLcontext *ctx ); extern void radeonDestroySwtcl( GLcontext *ctx ); +extern void radeonFlushVertices( GLcontext *ctx, GLuint flags ); extern void radeonChooseRenderState( GLcontext *ctx ); extern void radeonChooseVertexState( GLcontext *ctx ); diff -ru -x CVS lib/GL/mesa/src/drv.orig/radeon/radeon_vtxfmt.c lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c --- lib/GL/mesa/src/drv.orig/radeon/radeon_vtxfmt.c Tue Mar 11 17:51:29 2003 +++ lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c Tue Mar 11 17:47:01 2003 @@ -38,6 +38,7 @@ #include "radeon_ioctl.h" #include "radeon_tex.h" #include "radeon_tcl.h" +#include "radeon_swtcl.h" #include "radeon_vtxfmt.h" #include "api_noop.h" @@ -59,7 +60,7 @@ struct radeon_vb vb; -static void radeonFlushVertices( GLcontext *, GLuint ); +static void radeonVtxfmtFlushVertices( GLcontext *, GLuint ); static void count_func( const char *name, struct dynfn *l ) { @@ -336,12 +337,13 @@ fprintf(stderr, "%s from %s\n", __FUNCTION__, caller); if (ctx->Driver.NeedFlush) - radeonFlushVertices( ctx, ctx->Driver.NeedFlush ); + radeonVtxfmtFlushVertices( ctx, ctx->Driver.NeedFlush ); if (ctx->NewState) _mesa_update_state( ctx ); /* clear state so fell_back sticks */ _tnl_wakeup_exec( ctx ); + ctx->Driver.FlushVertices = radeonFlushVertices; assert( rmesa->dma.flush == 0 ); rmesa->vb.fell_back = GL_TRUE; @@ -382,6 +384,7 @@ prim = rmesa->vb.prim[0]; ctx->Driver.CurrentExecPrimitive = GL_POLYGON+1; _tnl_wakeup_exec( ctx ); + ctx->Driver.FlushVertices = radeonFlushVertices; assert(rmesa->dma.flush == 0); rmesa->vb.fell_back = GL_TRUE; @@ -731,7 +734,7 @@ fprintf(stderr, "reinstall (new install)\n"); _mesa_install_exec_vtxfmt( ctx, &rmesa->vb.vtxfmt ); - ctx->Driver.FlushVertices = radeonFlushVertices; + ctx->Driver.FlushVertices = radeonVtxfmtFlushVertices; ctx->Driver.NewList = radeonNewList; rmesa->vb.installed = GL_TRUE; vb.context = ctx; @@ -747,6 +750,7 @@ if (rmesa->dma.flush) rmesa->dma.flush( rmesa ); _tnl_wakeup_exec( ctx ); + ctx->Driver.FlushVertices = radeonFlushVertices; rmesa->vb.installed = GL_FALSE; vb.context = 0; } @@ -905,7 +909,7 @@ return GL_TRUE; } -static void radeonFlushVertices( GLcontext *ctx, GLuint flags ) +static void radeonVtxfmtFlushVertices( GLcontext *ctx, GLuint flags ) { radeonContextPtr rmesa = RADEON_CONTEXT( ctx );