mesa: Move struct _glapi_table allocation out of context.c
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 22 Apr 2010 16:40:47 +0000 (12:40 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 22 Apr 2010 17:43:28 +0000 (13:43 -0400)
We now allocate the table from api_exec.c and dlist.c where we fill out
the table.  This way, context.c doesn't need to know the actual contents
of struct _glapi_table.

src/mesa/es/main/es_generator.py
src/mesa/main/api_exec.c
src/mesa/main/api_exec.h
src/mesa/main/context.c
src/mesa/main/dlist.c
src/mesa/main/dlist.h

index f736792..dbb516a 100644 (file)
@@ -667,9 +667,15 @@ for funcName in keys:
 
 # end for each function
 
-print "void"
-print "_mesa_init_exec_table(struct _glapi_table *exec)"
+print "struct _glapi_table *"
+print "_mesa_create_exec_table(void)"
 print "{"
+print "   struct _glapi_table *exec;"
+print "   exec = _mesa_alloc_dispatch_table(sizeof *exec);"
+print "   if (exec == NULL)"
+print "      return NULL;"
+print ""
+
 for func in keys:
     prefix = "_es_" if func not in allSpecials else "_check_"
     for spec in apiutil.Categories(func):
@@ -682,4 +688,6 @@ for func in keys:
             suffix = ext[0].split("_")[0]
             entry += suffix
         print "    SET_%s(exec, %s%s);" % (entry, prefix, entry)
+print ""
+print "   return exec;"
 print "}"
index 1e1aa41..7b3f3d9 100644 (file)
  * \param ctx  GL context to which \c exec belongs.
  * \param exec dispatch table.
  */
-void
-_mesa_init_exec_table(struct _glapi_table *exec)
+struct _glapi_table *
+_mesa_create_exec_table(void)
 {
+   struct _glapi_table *exec;
+
+   exec = _mesa_alloc_dispatch_table(sizeof *exec);
+   if (exec == NULL)
+      return NULL;
+
 #if _HAVE_FULL_GL
    _mesa_loopback_init_api_table( exec );
 #endif
@@ -777,4 +783,6 @@ _mesa_init_exec_table(struct _glapi_table *exec)
    SET_ObjectUnpurgeableAPPLE(exec, _mesa_ObjectUnpurgeableAPPLE);
    SET_GetObjectParameterivAPPLE(exec, _mesa_GetObjectParameterivAPPLE);
 #endif
+
+   return exec;
 }
index 4bd7150..dd8d500 100644 (file)
 
 struct _glapi_table;
 
+extern struct _glapi_table *
+_mesa_alloc_dispatch_table(int size);
 
-extern void
-_mesa_init_exec_table(struct _glapi_table *exec);
+extern struct _glapi_table *
+_mesa_create_exec_table(void);
 
 
 #endif
index 25288a4..8d71cef 100644 (file)
 #include "version.h"
 #include "viewport.h"
 #include "vtxfmt.h"
-#include "glapi/glthread.h"
-#include "glapi/glapitable.h"
 #include "shader/program.h"
 #include "shader/prog_print.h"
 #include "shader/shader_api.h"
@@ -749,8 +747,8 @@ generic_nop(void)
 /**
  * Allocate and initialize a new dispatch table.
  */
-static struct _glapi_table *
-alloc_dispatch_table(void)
+struct _glapi_table *
+_mesa_alloc_dispatch_table(int size)
 {
    /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
     * In practice, this'll be the same for stand-alone Mesa.  But for DRI
@@ -758,7 +756,7 @@ alloc_dispatch_table(void)
     * DRI drivers.
     */
    GLint numEntries = MAX2(_glapi_get_dispatch_table_size(),
-                           sizeof(struct _glapi_table) / sizeof(_glapi_proc));
+                           size / sizeof(_glapi_proc));
    struct _glapi_table *table =
       (struct _glapi_table *) malloc(numEntries * sizeof(_glapi_proc));
    if (table) {
@@ -853,22 +851,24 @@ _mesa_initialize_context_for_api(GLcontext *ctx,
       return GL_FALSE;
    }
 
+#if FEATURE_dispatch
    /* setup the API dispatch tables */
-   ctx->Exec = alloc_dispatch_table();
-   ctx->Save = alloc_dispatch_table();
-   if (!ctx->Exec || !ctx->Save) {
+   ctx->Exec = _mesa_create_exec_table();
+   if (!ctx->Exec) {
       _mesa_release_shared_state(ctx, ctx->Shared);
-      if (ctx->Exec)
-         free(ctx->Exec);
       return GL_FALSE;
    }
-#if FEATURE_dispatch
-   _mesa_init_exec_table(ctx->Exec);
 #endif
    ctx->CurrentDispatch = ctx->Exec;
 
 #if FEATURE_dlist
-   _mesa_init_save_table(ctx->Save);
+   ctx->Save = _mesa_create_save_table();
+   if (!ctx->Save) {
+      _mesa_release_shared_state(ctx, ctx->Shared);
+      free(ctx->Exec);
+      return GL_FALSE;
+   }
+
    _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
 #endif
 
index f869a58..168c424 100644 (file)
@@ -8747,9 +8747,15 @@ exec_MultiModeDrawElementsIBM(const GLenum * mode,
  * initialized from _mesa_init_api_defaults and from the active vtxfmt
  * struct.
  */
-void
-_mesa_init_save_table(struct _glapi_table *table)
+struct _glapi_table *
+_mesa_create_save_table(void)
 {
+   struct _glapi_table *table;
+
+   table = _mesa_alloc_dispatch_table(sizeof *table);
+   if (table == NULL)
+      return NULL;
+
    _mesa_loopback_init_api_table(table);
 
    /* GL 1.0 */
@@ -9349,6 +9355,8 @@ _mesa_init_save_table(struct _glapi_table *table)
    (void) save_ClearBufferfv;
    (void) save_ClearBufferfi;
 #endif
+
+   return table;
 }
 
 
index f37a93a..f8255fa 100644 (file)
@@ -72,7 +72,7 @@ extern void _mesa_delete_list(GLcontext *ctx, struct gl_display_list *dlist);
 
 extern void _mesa_save_vtxfmt_init( GLvertexformat *vfmt );
 
-extern void _mesa_init_save_table( struct _glapi_table *table );
+extern struct _glapi_table *_mesa_create_save_table(void);
 
 extern void _mesa_install_dlist_vtxfmt(struct _glapi_table *disp,
                                        const GLvertexformat *vfmt);