From fd7c46f53f3a7ae5c67f3c44ba283eeb4f72b366 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Wed, 28 Sep 2011 17:06:35 -0700 Subject: [PATCH] mesa: Add dd_function_table::PrepareExecBegin This hook allows the driver to prepare for a glBegin/glEnd. i965 will use the hook to avoid avoid recursive calls to FLUSH_VERTICES during a buffer resolve meta-op. Detailed Justification ---------------------- When vertices are queued during a glBegin/glEnd block, those vertices must of course be drawn before any rendering state changes. To enusure this, Mesa calls FLUSH_VERTICES as a prehook to such state changes. Therefore, FLUSH_VERTICES itself cannot change rendering state without falling into a recursive trap. This precludes meta-ops, namely i965 buffer resolves, from occuring while any vertices are queued. To avoid that situation, i965 must satisfy the following condition: that it queues no vertex if a buffer needs resolving. To satisfy this, i965 will use the PrepareExecBegin hook to resolve all buffers on entering a glBegin/glEnd block. -------- v2: Don't add dd_function_table::CleanupExecEnd. Anholt and I discovered that hook to be unnecessary. Reviewed-by: Brian Paul Signed-off-by: Chad Versace --- src/mesa/drivers/common/driverfuncs.c | 1 + src/mesa/main/dd.h | 8 ++++++++ src/mesa/vbo/vbo_exec_api.c | 3 +++ 3 files changed, 12 insertions(+) diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index 33da934..263d402 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -208,6 +208,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver) driver->ProgramStringNotify = _tnl_program_string; driver->FlushVertices = NULL; driver->SaveFlushVertices = NULL; + driver->PrepareExecBegin = NULL; driver->NotifySaveBegin = NULL; driver->LightingSpaceChange = NULL; diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 4e017ae..8607008 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -861,6 +861,14 @@ struct dd_function_table { void (*SaveFlushVertices)( struct gl_context *ctx ); /** + * \brief Hook for drivers to prepare for a glBegin/glEnd block + * + * This hook is called in vbo_exec_Begin() before any action, including + * state updates, occurs. + */ + void (*PrepareExecBegin)( struct gl_context *ctx ); + + /** * Give the driver the opportunity to hook in its own vtxfmt for * compiling optimized display lists. This is called on each valid * glBegin() during list compilation. diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index 150589b..5f3ed9d 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -570,6 +570,9 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode ) return; } + if (ctx->Driver.PrepareExecBegin) + ctx->Driver.PrepareExecBegin(ctx); + if (ctx->NewState) { _mesa_update_state( ctx ); -- 2.7.4