Hi all,

 I've been tracking through src/mesa/vbo and tracking down the dispatch stuff 
in relation to the stuff in src/mesa/vbo. I see how the function entries in 
vbo_context#exec and vbo_context#save are filled (by essentially macros defined 
in of src/mesa/vbo/vbo_attrib_tmp.h interacting with macros defined in 
src/mesa/vbo/vbo_save_api.c for save and src/mesa/vbo/vbo_exec_api.c for exec). 
I also see the functions in src/mesa/main:

 _mesa_install_exec_vtxfmt
and
 _mesa_install_save_vtxfmt

The save one is very simple, it just inserts the functions from 
vbo_context#save into the GL dispatch table gl_context#Save. What is trickier 
for me to follow is what is happening on exec. The function 
_mesa_install_exec_vtxfmt sets both gl_context#BeginEnd and gl_context#Exec 
table values to that which is in  vbo_context#exec, but leaves 
gl_context#OutsideBeginEnd as is, i.e. nothing but no-op functions.

_A_ dispatch table is initialized as having no-ops for all functions and then 
is filled with _mesa_initialize_dispatch_tables(), which uses  
_mesa_initialize_exec_table() and _mesa_initialize_save_table(),
which populate gl_context#Exec and gl_context#Save respectively. However I dot 
not see anything that populates gl_context#OutsideBeginEnd (except for it's 
initialization of all no-op functions). This would be okay, but...

My confusion starts in vbo_exec_Begin():


ctx->Exec = ctx->BeginEnd;
/* We may have been called from a display list, in which case we should
 * leave dlist.c's dispatch table in place.
 */
  if (ctx->CurrentDispatch == ctx->OutsideBeginEnd) {
         ctx->CurrentDispatch = ctx->BeginEnd;
         _glapi_set_dispatch(ctx->CurrentDispatch);
      } else {
         assert(ctx->CurrentDispatch == ctx->Save);
   }

and this block in  vbo_exec_End():

ctx->Exec = ctx->OutsideBeginEnd;
if (ctx->CurrentDispatch == ctx->BeginEnd) {
       ctx->CurrentDispatch = ctx->OutsideBeginEnd;
      _glapi_set_dispatch(ctx->CurrentDispatch);
 }

for i965, there is a chain of calls so that _mesa_install_exec_vtxfmt() is 
called at context creation,
which sets both Exec and BeginEnd (for compatibility profiles) to the value as 
found in vbo_context#exec. The initial value of CurrentDispatch is 
OutsideBeginEnd, atleast afaik set in  _mesa_initialize_context(). Thus I see 
that after a glBegin, CurrentDispatch is set to BeginEnd and after glEnd(), 
CurrentDispatch is set to OutsideBeginEnd, which I cannot track down where it 
is populated with something besides no-op functions... what am I missing?

-Kevin










_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to