summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon Turney <[email protected]>2018-01-16 16:26:57 +0000
committerEmil Velikov <[email protected]>2018-02-05 19:06:02 +0000
commit9d7a80f4ae3919072a8a02ced0ad856d91632ca8 (patch)
treea696f0e6a937838a19817eebd67de6fc26db9081 /src
parentac08cc687345b6124153b20e9f21eef8eebc3b15 (diff)
glx/apple: locate dispatch table functions to wrap by name
Avoid reaching into the dispatch table internals (and thus having to deal with the complexities of remap etc.) by identifying functions to wrap by name. See: https://lists.freedesktop.org/archives/mesa-dev/2015-June/086721.html et seq. https://bugs.freedesktop.org/show_bug.cgi?id=90311 Signed-off-by: Jon Turney <[email protected]> Reviewed-by: Emil Velikov <[email protected]> (cherry picked from commit d3540b405b975450b9c2f9d8eb273be062cbf73a)
Diffstat (limited to 'src')
-rw-r--r--src/glx/apple/apple_glapi.c12
-rw-r--r--src/mapi/glapi/gen/gl_gentable.py14
-rw-r--r--src/mapi/glapi/glapi.h3
3 files changed, 22 insertions, 7 deletions
diff --git a/src/glx/apple/apple_glapi.c b/src/glx/apple/apple_glapi.c
index 4d19f7f6a3e..f2248ab01a2 100644
--- a/src/glx/apple/apple_glapi.c
+++ b/src/glx/apple/apple_glapi.c
@@ -41,7 +41,6 @@
#include "main/glheader.h"
#include "glapi.h"
#include "glapitable.h"
-#include "main/dispatch.h"
#include "apple_glx.h"
#include "apple_xgl_api.h"
@@ -61,12 +60,11 @@ static void _apple_glapi_create_table(void) {
assert(__applegl_api);
memcpy(__applegl_api, __ogl_framework_api, sizeof(struct _glapi_table));
- SET_ReadPixels(__applegl_api, __applegl_glReadPixels);
- SET_CopyPixels(__applegl_api, __applegl_glCopyPixels);
- SET_CopyColorTable(__applegl_api, __applegl_glCopyColorTable);
- SET_DrawBuffer(__applegl_api, __applegl_glDrawBuffer);
- SET_DrawBuffers(__applegl_api, __applegl_glDrawBuffers);
- SET_Viewport(__applegl_api, __applegl_glViewport);
+ _glapi_table_patch(__applegl_api, "ReadPixels", __applegl_glReadPixels);
+ _glapi_table_patch(__applegl_api, "CopyPixels", __applegl_glCopyPixels);
+ _glapi_table_patch(__applegl_api, "CopyColorTable", __applegl_glCopyColorTable);
+ _glapi_table_patch(__applegl_api, "DrawBuffers", __applegl_glDrawBuffer);
+ _glapi_table_patch(__applegl_api, "Viewport", __applegl_glViewport);
}
void apple_glapi_set_dispatch(void) {
diff --git a/src/mapi/glapi/gen/gl_gentable.py b/src/mapi/glapi/gen/gl_gentable.py
index 2f54d1d5792..50153bbabd5 100644
--- a/src/mapi/glapi/gen/gl_gentable.py
+++ b/src/mapi/glapi/gen/gl_gentable.py
@@ -56,6 +56,7 @@ header = """/* GLXEXT is the define used in the xserver when the GLX extension i
#endif
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
#include "main/glheader.h"
@@ -144,6 +145,19 @@ _glapi_create_table_from_handle(void *handle, const char *symbol_prefix) {
return disp;
}
+
+void
+ _glapi_table_patch(struct _glapi_table *table, const char *name, void *wrapper)
+{
+ for (int func_index = 0; func_index < GLAPI_TABLE_COUNT; ++func_index) {
+ if (!strcmp(_glapi_table_func_names[func_index], name)) {
+ ((void **)table)[func_index] = wrapper;
+ return;
+ }
+ }
+ fprintf(stderr, "could not patch %s in dispatch table\\n", name);
+}
+
"""
diff --git a/src/mapi/glapi/glapi.h b/src/mapi/glapi/glapi.h
index f1ad4c1b5e8..d5d4e0a03a6 100644
--- a/src/mapi/glapi/glapi.h
+++ b/src/mapi/glapi/glapi.h
@@ -161,6 +161,9 @@ _glapi_get_proc_name(unsigned int offset);
#if defined(GLX_USE_APPLEGL) || defined(GLX_USE_WINDOWSGL)
_GLAPI_EXPORT struct _glapi_table *
_glapi_create_table_from_handle(void *handle, const char *symbol_prefix);
+
+_GLAPI_EXPORT void
+_glapi_table_patch(struct _glapi_table *, const char *name, void *wrapper);
#endif