aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/glapi/glapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/glapi/glapi.c')
-rw-r--r--src/mesa/glapi/glapi.c82
1 files changed, 66 insertions, 16 deletions
diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c
index 51c24f980cc..65acafb246d 100644
--- a/src/mesa/glapi/glapi.c
+++ b/src/mesa/glapi/glapi.c
@@ -1,4 +1,4 @@
-/* $Id: glapi.c,v 1.32 2000/02/10 21:27:48 brianp Exp $ */
+/* $Id: glapi.c,v 1.33 2000/02/12 16:44:25 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -272,13 +272,16 @@ get_static_proc_address(const char *funcName)
*/
+#define MAX_EXTENSION_FUNCS 1000
+
+
struct _glapi_ext_entrypoint {
const char *Name; /* the extension function's name */
GLuint Offset; /* relative to start of dispatch table */
GLvoid *Address; /* address of dispatch function */
};
-static struct _glapi_ext_entrypoint ExtEntryTable[_GLAPI_EXTRA_SLOTS];
+static struct _glapi_ext_entrypoint ExtEntryTable[MAX_EXTENSION_FUNCS];
static GLuint NumExtEntryPoints = 0;
@@ -354,10 +357,8 @@ _glapi_add_entrypoint(const char *funcName, GLuint offset)
index = get_static_proc_offset(funcName);
if (index >= 0) {
- assert(index == offset);
- return GL_TRUE;
+ return (GLboolean) (index == offset); /* bad offset! */
}
- /* else if (offset < _glapi_get_dispatch_table_size()) { */
else {
/* be sure index and name match known data */
GLuint i;
@@ -372,24 +373,73 @@ _glapi_add_entrypoint(const char *funcName, GLuint offset)
}
}
}
- assert(NumExtEntryPoints < _GLAPI_EXTRA_SLOTS);
- ExtEntryTable[NumExtEntryPoints].Name = strdup(funcName);
- ExtEntryTable[NumExtEntryPoints].Offset = offset;
- ExtEntryTable[NumExtEntryPoints].Address = generate_entrypoint(offset);
- NumExtEntryPoints++;
- if (offset > MaxDispatchOffset)
- MaxDispatchOffset = offset;
+ /* make sure we have space */
+ if (NumExtEntryPoints >= MAX_EXTENSION_FUNCS) {
+ return GL_FALSE;
+ }
+ else {
+ void *entrypoint = generate_entrypoint(offset);
+ if (!entrypoint)
+ return GL_FALSE;
+
+ ExtEntryTable[NumExtEntryPoints].Name = strdup(funcName);
+ ExtEntryTable[NumExtEntryPoints].Offset = offset;
+ ExtEntryTable[NumExtEntryPoints].Address = entrypoint;
+ NumExtEntryPoints++;
+
+ if (offset > MaxDispatchOffset)
+ MaxDispatchOffset = offset;
- return GL_TRUE;
+ return GL_TRUE; /* success */
+ }
}
+
+ /* should never get here, but play it safe */
+ return GL_FALSE;
+}
+
+
+
+#if 0000 /* prototype code for dynamic extension slot allocation */
+
+static int NextFreeOffset = 409; /*XXX*/
+#define MAX_DISPATCH_TABLE_SIZE 1000
+
/*
- else {
- return GL_FALSE;
+ * Dynamically allocate a dispatch slot for an extension entrypoint
+ * and generate the assembly language dispatch stub.
+ * Return the dispatch offset for the function or -1 if no room or error.
+ */
+GLint
+_glapi_add_entrypoint2(const char *funcName)
+{
+ int offset;
+
+ /* first see if extension func is already known */
+ offset = _glapi_get_proc_offset(funcName);
+ if (offset >= 0)
+ return offset;
+
+ if (NumExtEntryPoints < MAX_EXTENSION_FUNCS
+ && NextFreeOffset < MAX_DISPATCH_TABLE_SIZE) {
+ void *entryPoint;
+ offset = NextFreeOffset;
+ entryPoint = generate_entrypoint(offset);
+ if (entryPoint) {
+ NextFreeOffset++;
+ ExtEntryTable[NumExtEntryPoints].Name = strdup(funcName);
+ ExtEntryTable[NumExtEntryPoints].Offset = offset;
+ ExtEntryTable[NumExtEntryPoints].Address = entryPoint;
+ NumExtEntryPoints++;
+ return offset;
+ }
}
-*/
+ return -1;
}
+#endif
+
/*