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 f736792deca828be2ef522dcee7afd7a715b5c2d..dbb516a4c163e6a3e51010d453d3359b7562f3c0 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 1e1aa4161188ced57e91a49debc2e086e976f2c1..7b3f3d9ea19d021c9c23b7dd034c55bec80a136d 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 4bd715053ab5c3ff270fbfbf5567a8374a8a73a4..dd8d500865b94531861cad6949239ec5631cbd47 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 25288a4e9c11d057c86f080a4f6bfdf045fd78c0..8d71cefdcf39f477c42facac571da7dfb29d7c68 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 f869a585d6bc979ebcf532240611270dcb7e6666..168c424ea1c555f33c3d51d292abeb28629dc686 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 f37a93a7f4bf4e6631bcdc1f0f72900e2b641747..f8255facc5e6f7be818919ce46c79d2245e1f4c8 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);