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.tags/mesa-7.9-rc1
@@ -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 "}" |
@@ -119,9 +119,15 @@ | |||
* \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; | |||
} |
@@ -29,9 +29,11 @@ | |||
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 |
@@ -129,8 +129,6 @@ | |||
#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 | |||
@@ -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; | |||
} | |||
@@ -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); |