From f54e142455cb3c9d1662dae7e096a32a47e5409b Mon Sep 17 00:00:00 2001 From: Jonathan Gray Date: Tue, 2 Apr 2024 09:30:07 +0000 Subject: Import Mesa 23.3.6 --- lib/mesa/src/mapi/entry.h | 6 - lib/mesa/src/mapi/glapi/gen/NV_texture_barrier.xml | 2 +- lib/mesa/src/mapi/glapi/gen/NV_vdpau_interop.xml | 4 +- lib/mesa/src/mapi/glapi/glapi_dispatch.c | 5 - lib/mesa/src/mapi/glapi/glapi_getproc.c | 462 ++------------------- lib/mesa/src/mapi/glapi/tests/check_table.cpp | 4 +- lib/mesa/src/mapi/shared-glapi/meson.build | 2 - lib/mesa/src/mapi/shared-glapi/stub.c | 106 +---- lib/mesa/src/mapi/shared-glapi/stub.h | 6 - 9 files changed, 40 insertions(+), 557 deletions(-) (limited to 'lib/mesa/src/mapi') diff --git a/lib/mesa/src/mapi/entry.h b/lib/mesa/src/mapi/entry.h index 7c8137c0c..2d2c4137a 100644 --- a/lib/mesa/src/mapi/entry.h +++ b/lib/mesa/src/mapi/entry.h @@ -37,10 +37,4 @@ entry_patch_public(void); mapi_func entry_get_public(int slot); -mapi_func -entry_generate(int slot); - -void -entry_patch(mapi_func entry, int slot); - #endif /* _ENTRY_H_ */ diff --git a/lib/mesa/src/mapi/glapi/gen/NV_texture_barrier.xml b/lib/mesa/src/mapi/glapi/gen/NV_texture_barrier.xml index b4d3d88d6..fd341a801 100644 --- a/lib/mesa/src/mapi/glapi/gen/NV_texture_barrier.xml +++ b/lib/mesa/src/mapi/glapi/gen/NV_texture_barrier.xml @@ -7,7 +7,7 @@ - + diff --git a/lib/mesa/src/mapi/glapi/gen/NV_vdpau_interop.xml b/lib/mesa/src/mapi/glapi/gen/NV_vdpau_interop.xml index 7bf8fdfb4..1f53ac4a0 100644 --- a/lib/mesa/src/mapi/glapi/gen/NV_vdpau_interop.xml +++ b/lib/mesa/src/mapi/glapi/gen/NV_vdpau_interop.xml @@ -50,12 +50,12 @@ - + - + diff --git a/lib/mesa/src/mapi/glapi/glapi_dispatch.c b/lib/mesa/src/mapi/glapi/glapi_dispatch.c index 43209b597..960ccc0e8 100644 --- a/lib/mesa/src/mapi/glapi/glapi_dispatch.c +++ b/lib/mesa/src/mapi/glapi/glapi_dispatch.c @@ -74,11 +74,6 @@ #endif /* logging */ -#ifdef GLX_INDIRECT_RENDERING -/* those link to libglapi.a should provide the entry points */ -#define _GLAPI_SKIP_PROTO_ENTRY_POINTS -#endif - /* Enable frame pointer elimination on Windows, otherwise forgetting to add * GLAPIENTRY to _mesa_* entrypoints will not cause crashes on debug builds, as * the initial ESP value is saved in the EBP in the function prologue, then diff --git a/lib/mesa/src/mapi/glapi/glapi_getproc.c b/lib/mesa/src/mapi/glapi/glapi_getproc.c index df8b4fa25..9496ff87d 100644 --- a/lib/mesa/src/mapi/glapi/glapi_getproc.c +++ b/lib/mesa/src/mapi/glapi/glapi_getproc.c @@ -37,16 +37,12 @@ #include "glapitable.h" -#define FIRST_DYNAMIC_OFFSET (sizeof(struct _glapi_table) / sizeof(void *)) - - - /********************************************************************** * Static function management. */ -#if !defined(DISPATCH_FUNCTION_SIZE) +#if !defined(DISPATCH_FUNCTION_SIZE) # define NEED_FUNCTION_POINTER #endif #include "glprocs.h" @@ -57,14 +53,14 @@ * and return the corresponding glprocs_table_t entry. */ static const glprocs_table_t * -get_static_proc( const char * n ) +get_static_proc(const char *n) { GLuint i; for (i = 0; static_functions[i].Name_offset >= 0; i++) { const char *testName = gl_string_table + static_functions[i].Name_offset; if (strcmp(testName, n) == 0) { - return &static_functions[i]; + return &static_functions[i]; } } return NULL; @@ -78,7 +74,7 @@ get_static_proc( const char * n ) static GLint get_static_proc_offset(const char *funcName) { - const glprocs_table_t * const f = get_static_proc( funcName ); + const glprocs_table_t *const f = get_static_proc(funcName); if (f == NULL) { return -1; } @@ -87,411 +83,28 @@ get_static_proc_offset(const char *funcName) } - -/** - * Return dispatch function address for the named static (built-in) function. - * Return NULL if function not found. - */ -static _glapi_proc -get_static_proc_address(const char *funcName) -{ - const glprocs_table_t * const f = get_static_proc( funcName ); - if (f == NULL) { - return NULL; - } - -#if defined(DISPATCH_FUNCTION_SIZE) && defined(GLX_INDIRECT_RENDERING) - return (f->Address == NULL) - ? get_entrypoint_address(f->Offset) - : f->Address; -#elif defined(DISPATCH_FUNCTION_SIZE) - return get_entrypoint_address(f->Offset); -#else - return f->Address; -#endif -} - - - -/** - * Return the name of the function at the given offset in the dispatch - * table. For debugging only. - */ -static const char * -get_static_proc_name( GLuint offset ) -{ - GLuint i; - for (i = 0; static_functions[i].Name_offset >= 0; i++) { - if (static_functions[i].Offset == offset) { - return gl_string_table + static_functions[i].Name_offset; - } - } - return NULL; -} - - - /********************************************************************** * Extension function management. */ - -/** - * Track information about a function added to the GL API. - */ -struct _glapi_function { - /** - * Name of the function. - */ - const char * name; - - - /** - * Text string that describes the types of the parameters passed to the - * named function. Parameter types are converted to characters using the - * following rules: - * - 'i' for \c GLint, \c GLuint, and \c GLenum - * - 'p' for any pointer type - * - 'f' for \c GLfloat and \c GLclampf - * - 'd' for \c GLdouble and \c GLclampd - */ - const char * parameter_signature; - - - /** - * Offset in the dispatch table where the pointer to the real function is - * located. If the driver has not requested that the named function be - * added to the dispatch table, this will have the value ~0. - */ - unsigned dispatch_offset; - - - /** - * Pointer to the dispatch stub for the named function. - * - * \todo - * The semantic of this field should be changed slightly. Currently, it - * is always expected to be non-\c NULL. However, it would be better to - * only allocate the entry-point stub when the application requests the - * function via \c glXGetProcAddress. This would save memory for all the - * functions that the driver exports but that the application never wants - * to call. - */ - _glapi_proc dispatch_stub; -}; - - -static struct _glapi_function ExtEntryTable[MAX_EXTENSION_FUNCS]; -static GLuint NumExtEntryPoints = 0; - - -static struct _glapi_function * -get_extension_proc(const char *funcName) -{ - GLuint i; - for (i = 0; i < NumExtEntryPoints; i++) { - if (strcmp(ExtEntryTable[i].name, funcName) == 0) { - return & ExtEntryTable[i]; - } - } - return NULL; -} - - -static GLint -get_extension_proc_offset(const char *funcName) -{ - const struct _glapi_function * const f = get_extension_proc( funcName ); - if (f == NULL) { - return -1; - } - - return f->dispatch_offset; -} - - -static _glapi_proc -get_extension_proc_address(const char *funcName) -{ - const struct _glapi_function * const f = get_extension_proc( funcName ); - if (f == NULL) { - return NULL; - } - - return f->dispatch_stub; -} - - -static const char * -get_extension_proc_name(GLuint offset) -{ - GLuint i; - for (i = 0; i < NumExtEntryPoints; i++) { - if (ExtEntryTable[i].dispatch_offset == offset) { - return ExtEntryTable[i].name; - } - } - return NULL; -} - - -/** - * strdup() is actually not a standard ANSI C or POSIX routine. - * Irix will not define it if ANSI mode is in effect. - */ -static char * -str_dup(const char *str) -{ - char *copy; - copy = malloc(strlen(str) + 1); - if (!copy) - return NULL; - strcpy(copy, str); - return copy; -} - - -/** - * Generate new entrypoint - * - * Use a temporary dispatch offset of ~0 (i.e. -1). Later, when the driver - * calls \c _glapi_add_dispatch we'll put in the proper offset. If that - * never happens, and the user calls this function, he'll segfault. That's - * what you get when you try calling a GL function that doesn't really exist. - * - * \param funcName Name of the function to create an entry-point for. - * - * \sa _glapi_add_entrypoint - */ - -static struct _glapi_function * -add_function_name( const char * funcName ) -{ - struct _glapi_function * entry = NULL; - _glapi_proc entrypoint = NULL; - char * name_dup = NULL; - - if (NumExtEntryPoints >= MAX_EXTENSION_FUNCS) - return NULL; - - if (funcName == NULL) - return NULL; - - name_dup = str_dup(funcName); - if (name_dup == NULL) - return NULL; - - entrypoint = generate_entrypoint(~0); - - if (entrypoint == NULL) { - free(name_dup); - return NULL; - } - - entry = & ExtEntryTable[NumExtEntryPoints]; - NumExtEntryPoints++; - - entry->name = name_dup; - entry->parameter_signature = NULL; - entry->dispatch_offset = ~0; - entry->dispatch_stub = entrypoint; - - return entry; -} - - -static struct _glapi_function * -set_entry_info( struct _glapi_function * entry, const char * signature, unsigned offset ) -{ - char * sig_dup = NULL; - - if (signature == NULL) - return NULL; - - sig_dup = str_dup(signature); - if (sig_dup == NULL) - return NULL; - - fill_in_entrypoint_offset(entry->dispatch_stub, offset); - - entry->parameter_signature = sig_dup; - entry->dispatch_offset = offset; - - return entry; -} - - /** - * Fill-in the dispatch stub for the named function. - * - * This function is intended to be called by a hardware driver. When called, - * a dispatch stub may be created for the function. A pointer to this - * dispatch function will be returned by glXGetProcAddress. - * - * \param function_names Array of pointers to function names that should - * share a common dispatch offset. - * \param parameter_signature String representing the types of the parameters - * passed to the named function. Parameter types - * are converted to characters using the following - * rules: - * - 'i' for \c GLint, \c GLuint, and \c GLenum - * - 'p' for any pointer type - * - 'f' for \c GLfloat and \c GLclampf - * - 'd' for \c GLdouble and \c GLclampd - * - * \returns - * The offset in the dispatch table of the named function. A pointer to the - * driver's implementation of the named function should be stored at - * \c dispatch_table[\c offset]. Return -1 if error/problem. - * - * \sa glXGetProcAddress - * - * \warning - * This function can only handle up to 8 names at a time. As far as I know, - * the maximum number of names ever associated with an existing GL function is - * 4 (\c glPointParameterfSGIS, \c glPointParameterfEXT, - * \c glPointParameterfARB, and \c glPointParameterf), so this should not be - * too painful of a limitation. - * - * \todo - * Determine whether or not \c parameter_signature should be allowed to be - * \c NULL. It doesn't seem like much of a hardship for drivers to have to - * pass in an empty string. - * - * \todo - * Determine if code should be added to reject function names that start with - * 'glX'. - * - * \bug - * Add code to compare \c parameter_signature with the parameter signature of - * a static function. In order to do that, we need to find a way to \b get - * the parameter signature of a static function. + * Initializes the glapi relocs table, and returns the offset of the given + * function in the dispatch table. */ - int -_glapi_add_dispatch( const char * const * function_names, - const char * parameter_signature ) +_glapi_add_dispatch(const char *funcName) { - static int next_dynamic_offset = FIRST_DYNAMIC_OFFSET; - const char * const real_sig = (parameter_signature != NULL) - ? parameter_signature : ""; - struct _glapi_function * entry[8]; - GLboolean is_static[8]; - unsigned i; - int offset = ~0; - init_glapi_relocs_once(); - (void) memset( is_static, 0, sizeof( is_static ) ); - (void) memset( entry, 0, sizeof( entry ) ); - - /* Find the _single_ dispatch offset for all function names that already - * exist (and have a dispatch offset). - */ - - for ( i = 0 ; function_names[i] != NULL ; i++ ) { - const char * funcName = function_names[i]; - int static_offset; - int extension_offset; - - if (funcName[0] != 'g' || funcName[1] != 'l') - return -1; - - /* search built-in functions */ - static_offset = get_static_proc_offset(funcName); - - if (static_offset >= 0) { - - is_static[i] = GL_TRUE; - - /* FIXME: Make sure the parameter signatures match! How do we get - * FIXME: the parameter signature for static functions? - */ - - if ( (offset != ~0) && (static_offset != offset) ) { - return -1; - } - - offset = static_offset; - - continue; - } - - /* search added extension functions */ - entry[i] = get_extension_proc(funcName); - - if (entry[i] != NULL) { - extension_offset = entry[i]->dispatch_offset; - - /* The offset may be ~0 if the function name was added by - * glXGetProcAddress but never filled in by the driver. - */ - - if (extension_offset == ~0) { - continue; - } - - if (strcmp(real_sig, entry[i]->parameter_signature) != 0) { - return -1; - } - - if ( (offset != ~0) && (extension_offset != offset) ) { - return -1; - } - - offset = extension_offset; - } - } - - /* If all function names are either new (or with no dispatch offset), - * allocate a new dispatch offset. - */ - - if (offset == ~0) { - offset = next_dynamic_offset; - next_dynamic_offset++; - } - - /* Fill in the dispatch offset for the new function names (and those with - * no dispatch offset). - */ - - for ( i = 0 ; function_names[i] != NULL ; i++ ) { - if (is_static[i]) { - continue; - } - - /* generate entrypoints for new function names */ - if (entry[i] == NULL) { - entry[i] = add_function_name( function_names[i] ); - if (entry[i] == NULL) { - /* FIXME: Possible memory leak here. */ - return -1; - } - } - - if (entry[i]->dispatch_offset == ~0) { - set_entry_info( entry[i], real_sig, offset ); - } - } - - return offset; + return get_static_proc_offset(funcName); } - /** * Return offset of entrypoint for named function within dispatch table. */ GLint _glapi_get_proc_offset(const char *funcName) { - GLint offset; - - /* search extension functions first */ - offset = get_extension_proc_offset(funcName); - if (offset >= 0) - return offset; - /* search static functions */ return get_static_proc_offset(funcName); } @@ -499,37 +112,31 @@ _glapi_get_proc_offset(const char *funcName) /** - * Return pointer to the named function. If the function name isn't found - * in the name of static functions, try generating a new API entrypoint on - * the fly with assembly language. + * Return dispatch function address for the named static (built-in) function. + * Return NULL if function not found. */ _glapi_proc _glapi_get_proc_address(const char *funcName) { - _glapi_proc func; - struct _glapi_function * entry; - init_glapi_relocs_once(); - if (!funcName || funcName[0] != 'g' || funcName[1] != 'l') + if (!funcName || funcName[0] != 'g' || funcName[1] != 'l') return NULL; - /* search extension functions first */ - func = get_extension_proc_address(funcName); - if (func) - return func; - - /* search static functions */ - func = get_static_proc_address(funcName); - if (func) - return func; - - /* generate entrypoint, dispatch offset must be filled in by the driver */ - entry = add_function_name(funcName); - if (entry == NULL) + const glprocs_table_t *const f = get_static_proc(funcName); + if (f == NULL) { return NULL; + } - return entry->dispatch_stub; +#if defined(DISPATCH_FUNCTION_SIZE) && defined(GLX_INDIRECT_RENDERING) + return (f->Address == NULL) + ? get_entrypoint_address(f->Offset) + : f->Address; +#elif defined(DISPATCH_FUNCTION_SIZE) + return get_entrypoint_address(f->Offset); +#else + return f->Address; +#endif } @@ -541,16 +148,13 @@ _glapi_get_proc_address(const char *funcName) const char * _glapi_get_proc_name(GLuint offset) { - const char * n; - - /* search built-in functions */ - n = get_static_proc_name(offset); - if ( n != NULL ) { - return n; + GLuint i; + for (i = 0; static_functions[i].Name_offset >= 0; i++) { + if (static_functions[i].Offset == offset) { + return gl_string_table + static_functions[i].Name_offset; + } } - - /* search added extension functions */ - return get_extension_proc_name(offset); + return NULL; } @@ -567,11 +171,5 @@ _glapi_get_proc_name(GLuint offset) GLuint _glapi_get_dispatch_table_size(void) { - /* - * The dispatch table size (number of entries) is the size of the - * _glapi_table struct plus the number of dynamic entries we can add. - * The extra slots can be filled in by DRI drivers that register new - * extension functions. - */ - return FIRST_DYNAMIC_OFFSET + MAX_EXTENSION_FUNCS; + return sizeof(struct _glapi_table) / sizeof(void *); } diff --git a/lib/mesa/src/mapi/glapi/tests/check_table.cpp b/lib/mesa/src/mapi/glapi/tests/check_table.cpp index 5b9d1e7c4..9b1bc1593 100644 --- a/lib/mesa/src/mapi/glapi/tests/check_table.cpp +++ b/lib/mesa/src/mapi/glapi/tests/check_table.cpp @@ -28,7 +28,7 @@ struct name_offset { const char *name; - unsigned int offset; + size_t offset; }; extern const struct name_offset linux_gl_abi[]; @@ -108,7 +108,7 @@ TEST(GetProcAddress, QueriedDispatchSizeBigEnough) * table. This is the size of the static table with some extra entries for * drivers to use for extensions that the core does not know about. */ - EXPECT_LT(table_entries, _glapi_get_dispatch_table_size()); + EXPECT_EQ(table_entries, _glapi_get_dispatch_table_size()); } TEST(GetProcAddress, KnownDispatchOffsetsAreConsistent) diff --git a/lib/mesa/src/mapi/shared-glapi/meson.build b/lib/mesa/src/mapi/shared-glapi/meson.build index bf84745d1..2cb93d778 100644 --- a/lib/mesa/src/mapi/shared-glapi/meson.build +++ b/lib/mesa/src/mapi/shared-glapi/meson.build @@ -22,8 +22,6 @@ files_shared_glapi = files( '../entry.c', '../u_current.c', '../u_current.h', - '../u_execmem.c', - '../u_execmem.h', 'glapi.c', 'stub.c', 'stub.h', diff --git a/lib/mesa/src/mapi/shared-glapi/stub.c b/lib/mesa/src/mapi/shared-glapi/stub.c index 1836e330c..0bf54a89f 100644 --- a/lib/mesa/src/mapi/shared-glapi/stub.c +++ b/lib/mesa/src/mapi/shared-glapi/stub.c @@ -39,19 +39,14 @@ struct mapi_stub { - const void *name; + size_t name_offset; int slot; - mapi_func addr; }; /* define public_string_pool and public_stubs */ #define MAPI_TMP_PUBLIC_STUBS #include "mapi_tmp.h" -static struct mapi_stub dynamic_stubs[MAPI_TABLE_NUM_DYNAMIC]; -static int num_dynamic_stubs; -static int next_dynamic_slot = MAPI_TABLE_NUM_STATIC; - void stub_init_once(void) { @@ -66,7 +61,7 @@ stub_compare(const void *key, const void *elem) const struct mapi_stub *stub = (const struct mapi_stub *) elem; const char *stub_name; - stub_name = &public_string_pool[(size_t) stub->name]; + stub_name = &public_string_pool[stub->name_offset]; return strcmp(name, stub_name); } @@ -81,69 +76,6 @@ stub_find_public(const char *name) ARRAY_SIZE(public_stubs), sizeof(public_stubs[0]), stub_compare); } -/** - * Add a dynamic stub. - */ -static struct mapi_stub * -stub_add_dynamic(const char *name) -{ - struct mapi_stub *stub; - int idx; - - idx = num_dynamic_stubs; - /* minus 1 to make sure we can never reach the last slot */ - if (idx >= MAPI_TABLE_NUM_DYNAMIC - 1) - return NULL; - - stub = &dynamic_stubs[idx]; - - /* dispatch to the last slot, which is reserved for no-op */ - stub->addr = entry_generate( - MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC - 1); - if (!stub->addr) - return NULL; - - stub->name = (const void *) strdup(name); - /* to be fixed later */ - stub->slot = -1; - - num_dynamic_stubs = idx + 1; - - return stub; -} - -/** - * Return the dynamic stub with the given name. If no such stub exists and - * generate is true, a new stub is generated. - */ -struct mapi_stub * -stub_find_dynamic(const char *name, int generate) -{ - static simple_mtx_t dynamic_mutex = SIMPLE_MTX_INITIALIZER; - struct mapi_stub *stub = NULL; - int count, i; - - simple_mtx_lock(&dynamic_mutex); - - if (generate) - assert(!stub_find_public(name)); - - count = num_dynamic_stubs; - for (i = 0; i < count; i++) { - if (strcmp(name, (const char *) dynamic_stubs[i].name) == 0) { - stub = &dynamic_stubs[i]; - break; - } - } - - /* generate a dynamic stub */ - if (generate && !stub) - stub = stub_add_dynamic(name); - - simple_mtx_unlock(&dynamic_mutex); - - return stub; -} static const struct mapi_stub * search_table_by_slot(const struct mapi_stub *table, size_t num_entries, @@ -162,26 +94,7 @@ stub_find_by_slot(int slot) { const struct mapi_stub *stub = search_table_by_slot(public_stubs, ARRAY_SIZE(public_stubs), slot); - if (stub) - return stub; - return search_table_by_slot(dynamic_stubs, num_dynamic_stubs, slot); -} - -void -stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias) -{ - int slot; - - if (stub->slot >= 0) - return; - - if (alias) - slot = alias->slot; - else - slot = next_dynamic_slot++; - - entry_patch(stub->addr, slot); - stub->slot = slot; + return stub; } /** @@ -190,15 +103,7 @@ stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias) const char * stub_get_name(const struct mapi_stub *stub) { - const char *name; - - if (stub >= public_stubs && - stub < public_stubs + ARRAY_SIZE(public_stubs)) - name = &public_string_pool[(size_t) stub->name]; - else - name = (const char *) stub->name; - - return name; + return &public_string_pool[stub->name_offset]; } /** @@ -216,6 +121,5 @@ stub_get_slot(const struct mapi_stub *stub) mapi_func stub_get_addr(const struct mapi_stub *stub) { - assert(stub->addr || (unsigned int) stub->slot < MAPI_TABLE_NUM_STATIC); - return (stub->addr) ? stub->addr : entry_get_public(stub->slot); + return entry_get_public(stub->slot); } diff --git a/lib/mesa/src/mapi/shared-glapi/stub.h b/lib/mesa/src/mapi/shared-glapi/stub.h index 953a0fae5..4a0e0d866 100644 --- a/lib/mesa/src/mapi/shared-glapi/stub.h +++ b/lib/mesa/src/mapi/shared-glapi/stub.h @@ -38,15 +38,9 @@ stub_init_once(void); const struct mapi_stub * stub_find_public(const char *name); -struct mapi_stub * -stub_find_dynamic(const char *name, int generate); - const struct mapi_stub * stub_find_by_slot(int slot); -void -stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias); - const char * stub_get_name(const struct mapi_stub *stub); -- cgit v1.2.3