summaryrefslogtreecommitdiffstats
path: root/src/mesa/tnl
diff options
context:
space:
mode:
authorGareth Hughes <[email protected]>2001-03-11 18:49:11 +0000
committerGareth Hughes <[email protected]>2001-03-11 18:49:11 +0000
commitd8aa0269cdadba1608522287bcb3b446c5848c09 (patch)
tree390b1c44ee248398514cdce16359c98862ca882d /src/mesa/tnl
parentb1b403665635350df3f30db992faf50776606545 (diff)
Support for swappable tnl modules.
Core Mesa provides a neutral tnl module that verifies the currently module before installing the tnl function pointers in a lazy fashion. It also records which tnl functions have been swapped out, and only restores these when tnl modules themselves are swapped. Fallback strategies: Drivers set a bitmask of dangerous stage changes. When such a state change occurs, the driver should restore the neutral tnl module via _mesa_restore_exec_vtxfmt(). The neutral tnl module will call _mesa_update_state(), followed by ctx->Driver.ValidateTnlModule() if the validation bitmask matches the new state bitmask. The driver should call _tnl_wakeup_exec() if it can no longer handle the current state, which will revert to the default tnl module. In this case, previous vertices should be replayed as required (depending on the current primitive) after the new tnl module is installed. If the driver uses chooser functions for any part of the tnl module, these should generally be reinstalled as part of the fallback to the neutral tnl module. For example, if the lighting state changes, a driver might fall back to the neutral tnl module, verify that the current lighting state can be handled, and use the chooser function to pick the most efficient implementation of the current lighting state. It is up to the drivers to detect and handle fallback cases caused by tnl function calls themselves (such as glTexCoord4f* if the current tnl module can't handle projected textures, for example).
Diffstat (limited to 'src/mesa/tnl')
-rw-r--r--src/mesa/tnl/t_context.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c
index 71bbfd64f92..7e359bfd20f 100644
--- a/src/mesa/tnl/t_context.c
+++ b/src/mesa/tnl/t_context.c
@@ -1,4 +1,4 @@
-/* $Id: t_context.c,v 1.12 2001/03/07 05:06:13 brianp Exp $ */
+/* $Id: t_context.c,v 1.13 2001/03/11 18:49:11 gareth Exp $ */
/*
* Mesa 3-D graphics library
@@ -51,8 +51,8 @@ struct immediate *_tnl_CurrentInput = NULL;
void
-_tnl_MakeCurrent( GLcontext *ctx,
- GLframebuffer *drawBuffer,
+_tnl_MakeCurrent( GLcontext *ctx,
+ GLframebuffer *drawBuffer,
GLframebuffer *readBuffer )
{
#ifndef THREADS
@@ -92,7 +92,7 @@ _tnl_CreateContext( GLcontext *ctx )
/* Initialize the VB.
*/
- tnl->vb.Size = MAX2( IMM_SIZE,
+ tnl->vb.Size = MAX2( IMM_SIZE,
ctx->Const.MaxArrayLockSize + MAX_CLIPPED_VERTICES);
@@ -106,7 +106,7 @@ _tnl_CreateContext( GLcontext *ctx )
tnl->NeedProjCoords = GL_TRUE;
-
+
/* Hook our functions into exec and compile dispatch tables.
*/
_mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt );
@@ -157,7 +157,7 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state )
}
tnl->pipeline.run_state_changes |= new_state;
- tnl->pipeline.build_state_changes |= (new_state &
+ tnl->pipeline.build_state_changes |= (new_state &
tnl->pipeline.build_state_trigger);
tnl->eval.EvalNewState |= new_state;
@@ -168,13 +168,13 @@ void
_tnl_wakeup_exec( GLcontext *ctx )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
-
+
install_driver_callbacks(ctx);
ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;
/* Hook our functions into exec and compile dispatch tables.
*/
- _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt );
+ _mesa_restore_exec_vtxfmt( ctx, &tnl->vtxfmt );
/* Call all appropriate driver callbacks to revive state.
*/
@@ -182,7 +182,7 @@ _tnl_wakeup_exec( GLcontext *ctx )
/* Assume we haven't been getting state updates either:
*/
- _tnl_InvalidateState( ctx, ~0 );
+ _tnl_InvalidateState( ctx, ~0 );
tnl->pipeline.run_input_changes = ~0;
}