diff options
author | marha <marha@users.sourceforge.net> | 2013-12-22 12:51:45 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2013-12-22 12:51:45 +0100 |
commit | c81020559f329a516191927222b3698ba7370aca (patch) | |
tree | 6f004f5723ca41881b2ba703ed619a92faebfe16 /xorg-server/hw | |
parent | c043f97a8572e1f509251288d8bcd70d0fb96770 (diff) | |
download | vcxsrv-c81020559f329a516191927222b3698ba7370aca.tar.gz vcxsrv-c81020559f329a516191927222b3698ba7370aca.tar.bz2 vcxsrv-c81020559f329a516191927222b3698ba7370aca.zip |
libxtrans fontconfig glproto libX11 libxcb xcbproto mesa xserver pixman xkeyboard-config git update 22 Dec 2013
xserver commit a68df147421da21528b5be2d34678383922fa352
libxcb commit f653464554469b5767f1c99abced25a76bace047
libxcb/xcb-proto commit 4087fc682c5ceb849b74442e17a6b73176e5eecb
xkeyboard-config commit a224a636139d22e1dc7ca7d23782cd656e87bcf5
libX11 commit 3d69b0a83e62f8f6fbdd952fc49cdbdf8825e1e6
libXdmcp commit 089081dca4ba3598c6f9bf401c029378943b5854
libXext commit bb24f2970f2e425f4df90c9b73d078ad15a73fbb
libfontenc commit 3acba630d8b57084f7e92c15732408711ed5137a
libXinerama commit edd95182b26eb5d576d4878c559e0f17dddaa909
libXau commit 304a11be4727c5a7feeb2501e8e001466f8ce84e
xkbcomp commit e3e6e938535532bfad175c1635256ab7fb3ac943
pixman commit 945ab7a6f3eb6241f07e8f094dc0e647d1f10d9d
xextproto commit 3f355f138d6df57e067458a20f47307883048adb
randrproto commit e7526e6b5fe0966929cda10b2ded0258413744db
glproto commit f84853d97d5749308992412a215fa518b6536eb3
mkfontscale commit 880a0c4733e62e54e6a0f1238c7430727d23657b
xwininfo commit ba0d1b0da21d2dbdd81098ed5778f3792b472e13
libXft commit 4acfdaf95adb0a05c2a25550bdde036c865902f4
libXmu commit 22d9c590901e121936f50dee97dc60c4f7defb63
libxtrans commit 2c0a7840a28ae696e80e73157856d7a049fdf6c7
fontconfig commit 5c725f2f5829238d16116f782d00d8bb0defaf08
mesa commit 2efe7927d38983029784825fc4897e9b77aa237e
Diffstat (limited to 'xorg-server/hw')
-rw-r--r-- | xorg-server/hw/kdrive/ephyr/ephyr.c | 8 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/common/xf86AutoConfig.c | 17 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/common/xf86Config.c | 2 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/common/xf86Helper.c | 7 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/dri2/dri2ext.c | 5 | ||||
-rw-r--r-- | xorg-server/hw/xquartz/GL/indirect.c | 26 | ||||
-rw-r--r-- | xorg-server/hw/xquartz/X11Controller.m | 8 | ||||
-rw-r--r-- | xorg-server/hw/xwin/Makefile.am | 2 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/Makefile.am | 32 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/gen_gl_wrappers.py | 766 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/glshim.c | 124 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/glthunk.c (renamed from xorg-server/hw/xwin/glx/glwrap.c) | 77 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/glwindows.h | 7 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/indirect.c | 30 |
14 files changed, 685 insertions, 426 deletions
diff --git a/xorg-server/hw/kdrive/ephyr/ephyr.c b/xorg-server/hw/kdrive/ephyr/ephyr.c index ef4b3210c..b2a79855c 100644 --- a/xorg-server/hw/kdrive/ephyr/ephyr.c +++ b/xorg-server/hw/kdrive/ephyr/ephyr.c @@ -943,7 +943,7 @@ ephyrProcessMouseMotion(xcb_generic_event_t *xev) #ifdef XF86DRI EphyrWindowPair *pair = NULL; #endif - EPHYR_LOG("enqueuing mouse motion:%d\n", ephyrCurScreen); + EPHYR_LOG("enqueuing mouse motion:%d\n", screen->pScreen->myNum); x = motion->event_x; y = motion->event_y; EPHYR_LOG("initial (x,y):(%d,%d)\n", x, y); @@ -977,7 +977,7 @@ ephyrProcessButtonPress(xcb_generic_event_t *xev) if (!ephyrMouse || !((EphyrPointerPrivate *) ephyrMouse->driverPrivate)->enabled) { - EPHYR_LOG("skipping mouse press:%d\n", ephyrCurScreen); + EPHYR_LOG("skipping mouse press:%d\n", screen_from_window(button->event)->pScreen->myNum); return; } @@ -987,7 +987,7 @@ ephyrProcessButtonPress(xcb_generic_event_t *xev) */ mouseState |= 1 << (button->detail - 1); - EPHYR_LOG("enqueuing mouse press:%d\n", ephyrCurScreen); + EPHYR_LOG("enqueuing mouse press:%d\n", screen_from_window(button->event)->pScreen->myNum); KdEnqueuePointerEvent(ephyrMouse, mouseState | KD_MOUSE_DELTA, 0, 0, 0); } @@ -1004,7 +1004,7 @@ ephyrProcessButtonRelease(xcb_generic_event_t *xev) ephyrUpdateModifierState(button->state); mouseState &= ~(1 << (button->detail - 1)); - EPHYR_LOG("enqueuing mouse release:%d\n", ephyrCurScreen); + EPHYR_LOG("enqueuing mouse release:%d\n", screen_from_window(button->event)->pScreen->myNum); KdEnqueuePointerEvent(ephyrMouse, mouseState | KD_MOUSE_DELTA, 0, 0, 0); } diff --git a/xorg-server/hw/xfree86/common/xf86AutoConfig.c b/xorg-server/hw/xfree86/common/xf86AutoConfig.c index 95d58fe43..af2b7f8f2 100644 --- a/xorg-server/hw/xfree86/common/xf86AutoConfig.c +++ b/xorg-server/hw/xfree86/common/xf86AutoConfig.c @@ -267,14 +267,6 @@ listPossibleVideoDrivers(char *matches[], int nmatches) if (i < (nmatches - 1)) i = xf86PciMatchDriver(matches, nmatches); #endif - /* Fallback to platform default hardware */ - if (i < (nmatches - 1)) { -#if defined(__i386__) || defined(__amd64__) || defined(__hurd__) - matches[i++] = xnfstrdup("vesa"); -#elif defined(__sparc__) && !defined(sun) - matches[i++] = xnfstrdup("sunffb"); -#endif - } #if defined(__linux__) matches[i++] = xnfstrdup("modesetting"); @@ -290,6 +282,15 @@ listPossibleVideoDrivers(char *matches[], int nmatches) #endif } #endif /* !sun */ + + /* Fallback to platform default hardware */ + if (i < (nmatches - 1)) { +#if defined(__i386__) || defined(__amd64__) || defined(__hurd__) + matches[i++] = xnfstrdup("vesa"); +#elif defined(__sparc__) && !defined(sun) + matches[i++] = xnfstrdup("sunffb"); +#endif + } } /* copy a screen section and enter the desired driver diff --git a/xorg-server/hw/xfree86/common/xf86Config.c b/xorg-server/hw/xfree86/common/xf86Config.c index 74d5ed3b7..b5efc02af 100644 --- a/xorg-server/hw/xfree86/common/xf86Config.c +++ b/xorg-server/hw/xfree86/common/xf86Config.c @@ -507,7 +507,7 @@ xf86InputDriverlistFromConfig(void) static void fixup_video_driver_list(char **drivers) { - static const char *fallback[4] = { "vesa", "fbdev", "wsfb", NULL }; + static const char *fallback[4] = { "fbdev", "vesa", "wsfb", NULL }; char **end, **drv; char *x; int i; diff --git a/xorg-server/hw/xfree86/common/xf86Helper.c b/xorg-server/hw/xfree86/common/xf86Helper.c index 721159d0b..f1e6783a7 100644 --- a/xorg-server/hw/xfree86/common/xf86Helper.c +++ b/xorg-server/hw/xfree86/common/xf86Helper.c @@ -1638,9 +1638,14 @@ xf86SetBackingStore(ScreenPtr pScreen) else { if (xf86GetOptValBool(options, OPTION_BACKING_STORE, &useBS)) from = X_CONFIG; +#ifdef COMPOSITE + if (from != X_CONFIG) + useBS = xf86ReturnOptValBool(options, OPTION_BACKING_STORE, + !noCompositeExtension); +#endif } free(options); - pScreen->backingStoreSupport = useBS ? Always : NotUseful; + pScreen->backingStoreSupport = useBS ? WhenMapped : NotUseful; if (serverGeneration == 1) xf86DrvMsg(pScreen->myNum, from, "Backing store %s\n", useBS ? "enabled" : "disabled"); diff --git a/xorg-server/hw/xfree86/dri2/dri2ext.c b/xorg-server/hw/xfree86/dri2/dri2ext.c index e1decec9e..ffd66fad6 100644 --- a/xorg-server/hw/xfree86/dri2/dri2ext.c +++ b/xorg-server/hw/xfree86/dri2/dri2ext.c @@ -672,6 +672,11 @@ DRI2ExtensionInit(void) { ExtensionEntry *dri2Extension; +#ifdef PANORAMIX + if (!noPanoramiXExtension) + return; +#endif + dri2Extension = AddExtension(DRI2_NAME, DRI2NumberEvents, DRI2NumberErrors, diff --git a/xorg-server/hw/xquartz/GL/indirect.c b/xorg-server/hw/xquartz/GL/indirect.c index c4999b5ff..8dabda14d 100644 --- a/xorg-server/hw/xquartz/GL/indirect.c +++ b/xorg-server/hw/xquartz/GL/indirect.c @@ -48,8 +48,6 @@ #include <glxserver.h> #include <glxutil.h> -#include <glapi.h> - #include "x-hash.h" #include "visualConfigs.h" @@ -643,15 +641,20 @@ __glFloorLog2(GLuint val) "/System/Library/Frameworks/OpenGL.framework/OpenGL" #endif +static void *opengl_framework_handle; + +static glx_gpa_proc +get_proc_address(const char *sym) +{ + return (glx_gpa_proc) dlsym(opengl_framework_handle, sym); +} + static void setup_dispatch_table(void) { - static struct _glapi_table *disp = NULL; - static void *handle; const char *opengl_framework_path; - if (disp) { - _glapi_set_dispatch(disp); + if (opengl_framework_handle) { return; } @@ -661,16 +664,13 @@ setup_dispatch_table(void) } (void)dlerror(); /*drain dlerror */ - handle = dlopen(opengl_framework_path, RTLD_LOCAL); + opengl_framework_handle = dlopen(opengl_framework_path, RTLD_LOCAL); - if (!handle) { + if (!opengl_framework_handle) { ErrorF("unable to dlopen %s : %s, using RTLD_DEFAULT\n", opengl_framework_path, dlerror()); - handle = RTLD_DEFAULT; + opengl_framework_handle = RTLD_DEFAULT; } - disp = _glapi_create_table_from_handle(handle, "gl"); - assert(disp); - - _glapi_set_dispatch(disp); + __glXsetGetProcAddress(get_proc_address); } diff --git a/xorg-server/hw/xquartz/X11Controller.m b/xorg-server/hw/xquartz/X11Controller.m index 3d094bfc7..752bda35c 100644 --- a/xorg-server/hw/xquartz/X11Controller.m +++ b/xorg-server/hw/xquartz/X11Controller.m @@ -347,7 +347,7 @@ extern char *bundle_id_prefix; const char *newargv[4]; char buf[128]; char *s; -#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 int stdout_pipe[2]; int stderr_pipe[2]; #endif @@ -363,7 +363,7 @@ extern char *bundle_id_prefix; setenv("DISPLAY", buf, TRUE); } -#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 if (asl_log_descriptor) { char *asl_sender; aslmsg amsg = asl_new(ASL_TYPE_MSG); @@ -413,7 +413,7 @@ extern char *bundle_id_prefix; _exit(1); case 0: /* child2 */ -#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 if (asl_log_descriptor) { /* Replace our stdout/stderr */ dup2(stdout_pipe[1], STDOUT_FILENO); @@ -442,7 +442,7 @@ extern char *bundle_id_prefix; waitpid(child1, &status, 0); } -#if 0 && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 if (asl_log_descriptor) { /* Close the write ends of the pipe */ close(stdout_pipe[1]); diff --git a/xorg-server/hw/xwin/Makefile.am b/xorg-server/hw/xwin/Makefile.am index c7006959c..7f0eaf097 100644 --- a/xorg-server/hw/xwin/Makefile.am +++ b/xorg-server/hw/xwin/Makefile.am @@ -157,7 +157,7 @@ XWIN_LIBS += $(top_builddir)/pseudoramiX/libPseudoramiX.la XWin_DEPENDENCIES = $(MULTIWINDOWEXTWM_LIBS) $(XWIN_GLX_LIBS) $(XWIN_LIBS) $(XSERVER_LIBS) XWin_LDADD = $(MULTIWINDOW_LIBS) $(MULTIWINDOWEXTWM_LIBS) $(XWIN_GLX_LIBS) $(XWIN_GLX_LINK_FLAGS) $(XWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XWIN_SYS_LIBS) -XWin_LDFLAGS = -mwindows -static +XWin_LDFLAGS = -mwindows -static -Wl,--disable-stdcall-fixup .rc.o: $(AM_V_GEN)$(WINDRES) --use-temp-file -i $< --input-format=rc -o $@ -O coff -I $(top_builddir)/include diff --git a/xorg-server/hw/xwin/glx/Makefile.am b/xorg-server/hw/xwin/glx/Makefile.am index 067ee5b3c..f2dffbffb 100644 --- a/xorg-server/hw/xwin/glx/Makefile.am +++ b/xorg-server/hw/xwin/glx/Makefile.am @@ -1,14 +1,18 @@ noinst_LTLIBRARIES = libXwinGLX.la +lib_LTLIBRARIES = libnativeGLthunk.la libXwinGLX_la_SOURCES = \ winpriv.c \ winpriv.h \ glwindows.h \ - glwrap.c \ + glshim.c \ indirect.c \ wgl_ext_api.c \ wgl_ext_api.h +libnativeGLthunk_la_SOURCES = \ + glthunk.c + if XWIN_MULTIWINDOW DEFS_MULTIWINDOW = -DXWIN_MULTIWINDOW endif @@ -30,16 +34,32 @@ AM_CFLAGS = -DHAVE_XWIN_CONFIG_H $(DIX_CFLAGS) \ -I$(top_srcdir) \ -I$(top_srcdir)/hw/xwin/ +libnativeGLthunk_la_CFLAGS = $(AM_CFLAGS) -Wno-unused-function -Wno-missing-prototypes -Wno-missing-declarations +libnativeGLthunk_la_LDFLAGS = -shared -no-undefined -avoid-version -lopengl32 -export-symbols generated_gl_thunks.def +EXTRA_libnativeGLthunk_la_DEPENDENCIES = generated_gl_thunks.def + if XWIN_GLX_WINDOWS -generated_gl_wrappers.c: gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/gl.spec $(KHRONOS_SPEC_DIR)/gl.tm - $(AM_V_GEN)$(PYTHON) $(srcdir)/gen_gl_wrappers.py --spec=$(KHRONOS_SPEC_DIR)/gl.spec --typemap=$(KHRONOS_SPEC_DIR)/gl.tm --dispatch-header=$(top_srcdir)/glx/dispatch.h --staticwrappers >generated_gl_wrappers.c +if DEBUG +GENGLWRAPPERSOPTS="" +else +GENGLWRAPPERSOPTS="-nodebug" +endif + +generated_wgl_wrappers.c: $(srcdir)/gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/wgl.xml $(KHRONOS_SPEC_DIR)/reg.py + $(AM_V_GEN)PYTHONPATH=$(KHRONOS_SPEC_DIR) $(PYTHON3) $(srcdir)/gen_gl_wrappers.py -registry $(KHRONOS_SPEC_DIR)/wgl.xml -prefix wgl -wrapper -preresolve $(GENGLWRAPPERSOPTS) -outfile $@ + +generated_gl_shim.c: $(srcdir)/gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/gl.xml $(KHRONOS_SPEC_DIR)/reg.py + $(AM_V_GEN)PYTHONPATH=$(KHRONOS_SPEC_DIR) $(PYTHON3) $(srcdir)/gen_gl_wrappers.py -registry $(KHRONOS_SPEC_DIR)/gl.xml -shim $(GENGLWRAPPERSOPTS) -outfile $@ + +generated_gl_thunks.c: $(srcdir)/gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/gl.xml $(KHRONOS_SPEC_DIR)/reg.py + $(AM_V_GEN)PYTHONPATH=$(KHRONOS_SPEC_DIR) $(PYTHON3) $(srcdir)/gen_gl_wrappers.py -registry $(KHRONOS_SPEC_DIR)/gl.xml -thunk $(GENGLWRAPPERSOPTS) -outfile $@ -generated_wgl_wrappers.c: gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/wglext.spec $(KHRONOS_SPEC_DIR)/wgl.tm - $(AM_V_GEN)$(PYTHON) $(srcdir)/gen_gl_wrappers.py --spec=$(KHRONOS_SPEC_DIR)/wglext.spec --typemap=$(KHRONOS_SPEC_DIR)/wgl.tm --prefix=wgl --preresolve >generated_wgl_wrappers.c +generated_gl_thunks.def: $(srcdir)/gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/gl.xml $(KHRONOS_SPEC_DIR)/reg.py + $(AM_V_GEN)PYTHONPATH=$(KHRONOS_SPEC_DIR) $(PYTHON3) $(srcdir)/gen_gl_wrappers.py -registry $(KHRONOS_SPEC_DIR)/gl.xml -thunkdefs $(GENGLWRAPPERSOPTS) -outfile $@ endif -BUILT_SOURCES = generated_gl_wrappers.c generated_wgl_wrappers.c +BUILT_SOURCES = generated_gl_shim.c generated_gl_thunks.c generated_gl_thunks.def generated_wgl_wrappers.c CLEANFILES = $(BUILT_SOURCES) EXTRA_DIST = gen_gl_wrappers.py diff --git a/xorg-server/hw/xwin/glx/gen_gl_wrappers.py b/xorg-server/hw/xwin/glx/gen_gl_wrappers.py index 2273589c9..683b9d903 100644 --- a/xorg-server/hw/xwin/glx/gen_gl_wrappers.py +++ b/xorg-server/hw/xwin/glx/gen_gl_wrappers.py @@ -1,325 +1,485 @@ -#!/usr/bin/python +#!/usr/bin/python3 # -# Comedy python script to generate cdecl to stdcall wrappers for GL functions +# python script to generate cdecl to stdcall wrappers for GL functions +# adapted from genheaders.py # -# This is designed to operate on OpenGL spec files from -# http://www.opengl.org/registry/api/ -# -# -# Copyright (c) Jon TURNEY 2009 +# Copyright (c) 2013 The Khronos Group Inc. # # Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name(s) of the above copyright -# holders shall not be used in advertising or otherwise to promote the sale, -# use or other dealings in this Software without prior written authorization. -# - -import sys -import re -import getopt - -dispatchheader = '' -prefix = 'gl' -preresolve = False -staticwrappers = False - -opts, args = getopt.getopt(sys.argv[1:], "", ['spec=', 'typemap=', 'dispatch-header=', 'prefix=', 'preresolve', 'staticwrappers' ]) - -for o,a in opts: - if o == '--typemap' : - typemapfile = a - elif o == '--dispatch-header' : - dispatchheader = a - elif o == '--spec' : - specfile = a - elif o == '--prefix' : - prefix = a - elif o == '--preresolve' : - preresolve = True - elif o == '--staticwrappers' : - staticwrappers = True - +# copy of this software and/or associated documentation files (the +# "Materials"), to deal in the Materials without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Materials, and to +# permit persons to whom the Materials are furnished to do so, subject to +# the following conditions: # -# look for all the SET_ macros in dispatch.h, this is the set of functions -# we need to generate -# - -dispatch = {} - -if dispatchheader : - fh = open(dispatchheader) - dispatchh = fh.readlines() - - dispatch_regex = re.compile(r'^SET_(\S*)\(') - - for line in dispatchh : - line = line.strip() - m1 = dispatch_regex.search(line) - - if m1 : - dispatch[m1.group(1)] = 1 - - del dispatch['by_offset'] - +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Materials. # -# read the typemap .tm file -# - -typemap = {} - -fh = open(typemapfile) -tm = fh.readlines() - -typemap_regex = re.compile(r'#define\sSET_(\S*)\(') - -for line in tm : - # ignore everything after a '#' as a comment - hash = line.find('#') - if hash != -1 : - line = line[:hash-1] - - # ignore blank lines - if line.startswith('#') or len(line) == 0 : - continue - - l = line.split(',') - typemap[l[0]] = l[3].strip() - -# interestingly, * is not a C type -if typemap['void'] == '*' : - typemap['void'] = 'void' - -# -# crudely parse the .spec file -# - -r1 = re.compile(r'\t(\S*)\s+(\S*.*)') -r2 = re.compile(r'(.*)\((.*)\)') -r3 = re.compile(r'glWindowPos.*MESA') -r4 = re.compile(r'gl.*Program(s|)NV') -r5 = re.compile(r'glGetVertexAttribfvNV') - -wrappers = {} - -fh = open(specfile) -glspec = fh.readlines() -param_count = 0 - -for line in glspec : - line = line.rstrip() - - # ignore everything after a '#' as a comment - hash = line.find('#') - if hash != -1 : - line = line[:hash-1] - - # ignore blank lines - if line.startswith('#') or len(line) == 0 : - continue - - # lines containing ':' aren't intersting to us - if line.count(':') != 0 : - continue - - # attributes of each function follow the name, indented by a tab - if not line.startswith('\t') : - m1 = r2.search(line) - if m1 : - function = m1.group(1) - arglist_use = m1.group(2) - wrappers[function] = {} - - # ensure formal parameter names don't collide with reserved names or shadow global declarations - arglist_use = ',' .join([i.rstrip() + '_' for i in arglist_use.split(",")]) - - wrappers[function]['arglist_use'] = arglist_use - param_count = 0 - else : - m1 = r1.search(line) - if m1 : - attribute = m1.group(1) - value = m1.group(2) - - # make param attributes unique and ordered - if attribute == 'param' : - attribute = 'param' + '%02d' % param_count - param_count += 1 - - wrappers[function][attribute] = value - -# -# now emit code -# - -print '/* Automatically generated by ' + sys.argv[0] + ' DO NOT EDIT */' -print '/* from ' + specfile + ' and typemap ' + typemapfile + ' */' -print '' - -# -# if required, emit code for non-lazy function resolving -# - -if preresolve : - for w in sorted(wrappers.keys()) : - funcname = prefix + w - print 'RESOLVE_DECL(PFN' + funcname.upper() + 'PROC);' - - print '' - print 'void ' + prefix + 'ResolveExtensionProcs(void)' - print '{' - - for w in sorted(wrappers.keys()) : - funcname = prefix + w - print ' PRERESOLVE(PFN' + funcname.upper() + 'PROC, "' + funcname + '");' - - print '}\n' +# THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + +import sys, time, pdb, string, cProfile +from reg import * + +# Default input / log files +errFilename = None +diagFilename = 'diag.txt' +regFilename = 'gl.xml' +outFilename = 'gen_gl_wrappers.c' + +protect=True +prefix="gl" +preresolve=False +wrapper=False +shim=False +thunk=False +thunkdefs=False +staticwrappers=False +nodebug=False + +#exclude base WGL API +WinGDI={key: 1 for key in [ + "wglCopyContext" + ,"wglCreateContext" + ,"wglCreateLayerContext" + ,"wglDeleteContext" + ,"wglGetCurrentContext" + ,"wglGetCurrentDC" + ,"wglGetProcAddress" + ,"wglMakeCurrent" + ,"wglShareLists" + ,"wglUseFontBitmapsA" + ,"wglUseFontBitmapsW" + ,"wglUseFontBitmaps" + ,"SwapBuffers" + ,"wglUseFontOutlinesA" + ,"wglUseFontOutlinesW" + ,"wglUseFontOutlines" + ,"wglDescribeLayerPlane" + ,"wglSetLayerPaletteEntries" + ,"wglGetLayerPaletteEntries" + ,"wglRealizeLayerPalette" + ,"wglSwapLayerBuffers" + ,"wglSwapMultipleBuffers" + ,"ChoosePixelFormat" + ,"DescribePixelFormat" + ,"GetEnhMetaFilePixelFormat" + ,"GetPixelFormat" + ,"SetPixelFormat" +]} + +if __name__ == '__main__': + i = 1 + while (i < len(sys.argv)): + arg = sys.argv[i] + i = i + 1 + if (arg == '-noprotect'): + print('Disabling inclusion protection in output headers', file=sys.stderr) + protect = False + elif (arg == '-registry'): + regFilename = sys.argv[i] + i = i+1 + print('Using registry', regFilename, file=sys.stderr) + elif (arg == '-outfile'): + outFilename = sys.argv[i] + i = i+1 + elif (arg == '-preresolve'): + preresolve=True + elif (arg == '-wrapper'): + wrapper=True + elif (arg == '-shim'): + shim=True + elif (arg == '-thunk'): + thunk=True + elif (arg == '-thunkdefs'): + thunkdefs=True + elif (arg == '-staticwrappers'): + staticwrappers=True + elif (arg == '-prefix'): + prefix = sys.argv[i] + i = i+1 + elif (arg == '-nodebug'): + nodebug = True + elif (arg[0:1] == '-'): + print('Unrecognized argument:', arg, file=sys.stderr) + exit(1) + +print('Generating', outFilename, file=sys.stderr) + +# Load & parse registry +reg = Registry() +tree = etree.parse(regFilename) +reg.loadElementTree(tree) + +allVersions = '.*' + +genOpts = CGeneratorOptions( + apiname = prefix, + profile = 'compatibility', + versions = allVersions, + emitversions = allVersions, + defaultExtensions = prefix, # Default extensions for GL + protectFile = protect, + protectFeature = protect, + protectProto = protect, + ) + +# create error/warning & diagnostic files +if (errFilename): + errWarn = open(errFilename,'w') +else: + errWarn = sys.stderr +diag = open(diagFilename, 'w') + +class PreResolveOutputGenerator(OutputGenerator): + def __init__(self, + errFile = sys.stderr, + warnFile = sys.stderr, + diagFile = sys.stdout): + OutputGenerator.__init__(self, errFile, warnFile, diagFile) + self.wrappers={} + def beginFile(self, genOpts): + self.outFile.write('/* Automatically generated from %s - DO NOT EDIT */\n\n'%regFilename) + def endFile(self): + self.outFile.write('\nvoid ' + prefix + 'ResolveExtensionProcs(void)\n{\n') + for funcname in self.wrappers.keys(): + self.outFile.write( ' PRERESOLVE(PFN' + funcname.upper() + 'PROC, "' + funcname + '");\n') + self.outFile.write('}\n\n') + def beginFeature(self, interface, emit): + OutputGenerator.beginFeature(self, interface, emit) + def endFeature(self): + OutputGenerator.endFeature(self) + def genType(self, typeinfo, name): + OutputGenerator.genType(self, typeinfo, name) + def genEnum(self, enuminfo, name): + OutputGenerator.genEnum(self, enuminfo, name) + def genCmd(self, cmd, name): + OutputGenerator.genCmd(self, cmd, name) + + if name in WinGDI: + return + + self.outFile.write('RESOLVE_DECL(PFN' + name.upper() + 'PROC);\n') + self.wrappers[name]=1 + +class WrapperOutputGenerator(OutputGenerator): + def __init__(self, + errFile = sys.stderr, + warnFile = sys.stderr, + diagFile = sys.stdout): + OutputGenerator.__init__(self, errFile, warnFile, diagFile) + def beginFile(self, genOpts): + self.outFile.write('/* Automatically generated from %s - DO NOT EDIT */\n\n'%regFilename) + def endFile(self): + pass + def beginFeature(self, interface, emit): + OutputGenerator.beginFeature(self, interface, emit) + self.OldVersion = self.featureName.startswith('GL_VERSION_1_0') or self.featureName.startswith('GL_VERSION_1_1') + def endFeature(self): + OutputGenerator.endFeature(self) + def genType(self, typeinfo, name): + OutputGenerator.genType(self, typeinfo, name) + def genEnum(self, enuminfo, name): + OutputGenerator.genEnum(self, enuminfo, name) + def genCmd(self, cmd, name): + OutputGenerator.genCmd(self, cmd, name) + + if name in WinGDI: + return + + proto=noneStr(cmd.elem.find('proto')) + rettype=noneStr(proto.text) + if rettype.lower()!="void ": + plist = ([t for t in proto.itertext()]) + rettype = ''.join(plist[:-1]) + rettype=rettype.strip() + if staticwrappers: self.outFile.write("static ") + self.outFile.write("%s %sWrapper("%(rettype, name)) + params = cmd.elem.findall('param') + plist=[] + for param in params: + paramlist = ([t for t in param.itertext()]) + paramtype = ''.join(paramlist[:-1]) + paramname = paramlist[-1] + plist.append((paramtype, paramname)) + Comma="" + if len(plist): + for ptype, pname in plist: + self.outFile.write("%s%s%s_"%(Comma, ptype, pname)) + Comma=", " + else: + self.outFile.write("void") -# -# now emit the wrappers -# for GL 1.0 and 1.1 functions, generate stdcall wrappers which call the function directly -# for GL 1.2+ functions, generate wrappers which use wglGetProcAddress() -# + self.outFile.write(")\n{\n") -for w in sorted(wrappers.keys()) : + # for GL 1.0 and 1.1 functions, generate stdcall wrappers which call the function directly + if self.OldVersion: + if not nodebug: + self.outFile.write(' if (glxWinDebugSettings.enable%scallTrace) ErrorF("%s\\n");\n'%(prefix.upper(), name)) + self.outFile.write(" glWinDirectProcCalls++;\n") + self.outFile.write("\n") - funcname = prefix + w - returntype = wrappers[w]['return'] - if returntype != 'void' : - returntype = typemap[returntype] + if rettype.lower()=="void": + self.outFile.write(" %s( "%(name)) + else: + self.outFile.write(" return %s( "%(name)) - # Avoid generating wrappers which aren't referenced by the dispatch table - if dispatchheader and not dispatch.has_key(w) : - print '/* No wrapper for ' + funcname + ', not in dispatch table */' - continue + Comma="" + for ptype, pname in plist: + self.outFile.write("%s%s_"%(Comma, pname)) + Comma=", " - # manufacture arglist - # if no param attributes were found, it should be 'void' - al = [] - for k in sorted(wrappers[w].keys()) : - if k.startswith('param') : - l = wrappers[w][k].split() + # for GL 1.2+ functions, generate stdcall wrappers which use wglGetProcAddress() + else: + if rettype.lower()=="void": + self.outFile.write(' RESOLVE(PFN%sPROC, "%s");\n'%(name.upper(), name)) + + if not nodebug: + self.outFile.write("\n") + self.outFile.write(' if (glxWinDebugSettings.enable%scallTrace) ErrorF("%s\\n");\n'%(prefix.upper(), name)) + self.outFile.write("\n") + + self.outFile.write(" RESOLVED_PROC(PFN%sPROC)( """%(name.upper())) + else: + self.outFile.write(' RESOLVE_RET(PFN%sPROC, "%s", FALSE);\n'%(name.upper(), name)) + + if not nodebug: + self.outFile.write("\n") + self.outFile.write(' if (glxWinDebugSettings.enable%scallTrace) ErrorF("%s\\n");\n'%(prefix.upper(), name)) + self.outFile.write("\n") + + self.outFile.write(" return RESOLVED_PROC(PFN%sPROC)("%(name.upper())) + + Comma="" + for ptype, pname in plist: + self.outFile.write("%s%s_"%(Comma, pname)) + Comma=", " + self.outFile.write(" );\n}\n\n") + +class ThunkOutputGenerator(OutputGenerator): + def __init__(self, + errFile = sys.stderr, + warnFile = sys.stderr, + diagFile = sys.stdout): + OutputGenerator.__init__(self, errFile, warnFile, diagFile) + def beginFile(self, genOpts): + self.outFile.write('/* Automatically generated from %s - DO NOT EDIT */\n\n'%regFilename) + def endFile(self): + pass + def beginFeature(self, interface, emit): + OutputGenerator.beginFeature(self, interface, emit) + self.OldVersion = self.featureName.startswith('GL_VERSION_1_0') or self.featureName.startswith('GL_VERSION_1_1') + def endFeature(self): + OutputGenerator.endFeature(self) + def genType(self, typeinfo, name): + OutputGenerator.genType(self, typeinfo, name) + def genEnum(self, enuminfo, name): + OutputGenerator.genEnum(self, enuminfo, name) + def genCmd(self, cmd, name): + OutputGenerator.genCmd(self, cmd, name) + + proto=noneStr(cmd.elem.find('proto')) + rettype=noneStr(proto.text) + if rettype.lower()!="void ": + plist = ([t for t in proto.itertext()]) + rettype = ''.join(plist[:-1]) + rettype=rettype.strip() + self.outFile.write("%s %sWrapper("%(rettype, name)) + params = cmd.elem.findall('param') + plist=[] + for param in params: + paramlist = ([t for t in param.itertext()]) + paramtype = ''.join(paramlist[:-1]) + paramname = paramlist[-1] + plist.append((paramtype, paramname)) + Comma="" + if len(plist): + for ptype, pname in plist: + self.outFile.write("%s%s%s_"%(Comma, ptype, pname)) + Comma=", " + else: + self.outFile.write("void") - # ensure formal parameter names don't collide with reserved names or shadow global declarations - l[0] = l[0] + '_' + self.outFile.write(")\n{\n") - if l[2] == 'in' : - if l[3] == 'array' : - arg = 'const ' + typemap[l[1]] + ' *' + l[0] - else : - arg = typemap[l[1]] + ' ' + l[0] - elif l[2] == 'out' : - arg = typemap[l[1]] + ' *' + l[0] + # for GL 1.0 and 1.1 functions, generate stdcall thunk wrappers which call the function directly + if self.OldVersion: + if rettype.lower()=="void": + self.outFile.write(" %s( "%(name)) + else: + self.outFile.write(" return %s( "%(name)) - al.append(arg) + Comma="" + for ptype, pname in plist: + self.outFile.write("%s%s_"%(Comma, pname)) + Comma=", " - if len(al) == 0 : - arglist = 'void' + # for GL 1.2+ functions, generate wrappers which use wglGetProcAddress() else: - arglist = ', '.join(al) - - if wrappers[w]['category'].startswith('VERSION_1_0') or wrappers[w]['category'].startswith('VERSION_1_1') : - if staticwrappers : - print 'static', - print returntype + ' ' + funcname + 'Wrapper(' + arglist + ')' - print '{' - print ' if (glxWinDebugSettings.enable' + prefix.upper() + 'callTrace) ErrorF("'+ funcname + '\\n");' - print ' glWinDirectProcCalls++;' - if returntype.lower() == 'void' : - print ' ' + funcname + '(', - else : - print ' /* returntype was ' + returntype.lower() + '*/' - print ' return ' + funcname + '(', - - if arglist != 'void' : - print wrappers[w]['arglist_use'], - - print ');' - print "}\n" + if rettype.lower()=="void": + self.outFile.write(' RESOLVE(PFN%sPROC, "%s");\n'%(name.upper(), name)) + self.outFile.write(" RESOLVED_PROC(PFN%sPROC)( """%(name.upper())) + else: + self.outFile.write(' RESOLVE_RET(PFN%sPROC, "%s", FALSE);\n'%(name.upper(), name)) + self.outFile.write(" return RESOLVED_PROC(PFN%sPROC)("%(name.upper())) + + Comma="" + for ptype, pname in plist: + self.outFile.write("%s%s_"%(Comma, pname)) + Comma=", " + self.outFile.write(" );\n}\n\n") + +class ThunkDefsOutputGenerator(OutputGenerator): + def __init__(self, + errFile = sys.stderr, + warnFile = sys.stderr, + diagFile = sys.stdout): + OutputGenerator.__init__(self, errFile, warnFile, diagFile) + def beginFile(self, genOpts): + self.outFile.write("EXPORTS\n"); # this must be the first line for libtool to realize this is a .def file + self.outFile.write('; Automatically generated from %s - DO NOT EDIT\n\n'%regFilename) + def endFile(self): + pass + def beginFeature(self, interface, emit): + OutputGenerator.beginFeature(self, interface, emit) + def endFeature(self): + OutputGenerator.endFeature(self) + def genType(self, typeinfo, name): + OutputGenerator.genType(self, typeinfo, name) + def genEnum(self, enuminfo, name): + OutputGenerator.genEnum(self, enuminfo, name) + def genCmd(self, cmd, name): + OutputGenerator.genCmd(self, cmd, name) + + # export the wrapper function with the name of the function it wraps + self.outFile.write("%s = %sWrapper\n"%(name, name)) + +class ShimOutputGenerator(OutputGenerator): + def __init__(self, + errFile = sys.stderr, + warnFile = sys.stderr, + diagFile = sys.stdout): + OutputGenerator.__init__(self, errFile, warnFile, diagFile) + def beginFile(self, genOpts): + self.outFile.write('/* Automatically generated from %s - DO NOT EDIT */\n\n'%regFilename) + def endFile(self): + pass + def beginFeature(self, interface, emit): + OutputGenerator.beginFeature(self, interface, emit) + self.OldVersion = self.featureName.startswith('GL_VERSION_1_0') or self.featureName.startswith('GL_VERSION_1_1') or self.featureName.startswith('GL_VERSION_1_2') or self.featureName.startswith('GL_ARB_imaging') or self.featureName.startswith('GL_ARB_multitexture') or self.featureName.startswith('GL_ARB_texture_compression') + def endFeature(self): + OutputGenerator.endFeature(self) + def genType(self, typeinfo, name): + OutputGenerator.genType(self, typeinfo, name) + def genEnum(self, enuminfo, name): + OutputGenerator.genEnum(self, enuminfo, name) + def genCmd(self, cmd, name): + OutputGenerator.genCmd(self, cmd, name) + + if not self.OldVersion: + return + + # for GL functions which are in the ABI, generate a shim which calls the function via GetProcAddress + proto=noneStr(cmd.elem.find('proto')) + rettype=noneStr(proto.text) + if rettype.lower()!="void ": + plist = ([t for t in proto.itertext()]) + rettype = ''.join(plist[:-1]) + rettype=rettype.strip() + self.outFile.write("%s %s("%(rettype, name)) + params = cmd.elem.findall('param') + plist=[] + for param in params: + paramlist = ([t for t in param.itertext()]) + paramtype = ''.join(paramlist[:-1]) + paramname = paramlist[-1] + plist.append((paramtype, paramname)) + Comma="" + if len(plist): + for ptype, pname in plist: + self.outFile.write("%s%s%s_"%(Comma, ptype, pname)) + Comma=", " else: - if staticwrappers : - print 'static', - print returntype + ' ' + funcname + 'Wrapper(' + arglist + ')' - print '{' + self.outFile.write("void") - stringname = funcname + self.outFile.write(")\n{\n") -# -# special case: Windows OpenGL implementations are far more likely to have GL_ARB_window_pos than GL_MESA_window_pos, -# so arrange for the wrapper to use the ARB strings to find functions... -# + self.outFile.write(' typedef %s (* PFN%sPROC)(' % (rettype, name.upper())) - m2 = r3.search(funcname) - if m2 : - stringname = stringname.replace('MESA','ARB') + if len(plist): + Comma="" + for ptype, pname in plist: + self.outFile.write("%s %s %s_"%(Comma, ptype, pname)) + Comma=", " + else: + self.outFile.write("void") -# -# special case: likewise, implementations are more likely to have GL_ARB_vertex_program than GL_NV_vertex_program, -# especially if they are not NV implementations, so arrange for the wrapper to use ARB strings to find functions -# + self.outFile.write(');\n') - m3 = r4.search(funcname) - if m3 : - stringname = stringname.replace('NV','ARB') - m4 = r5.search(funcname) - if m4 : - stringname = stringname.replace('NV','ARB') - - pfntypename = 'PFN' + funcname.upper() + 'PROC' - - if returntype.lower() == 'void' : - print ' RESOLVE(' + pfntypename + ', "' + stringname + '");' - print ' if (glxWinDebugSettings.enable' + prefix.upper() + 'callTrace) ErrorF("'+ funcname + '\\n");' - print ' RESOLVED_PROC(' + pfntypename + ')(', - else : - print ' RESOLVE_RET(' + pfntypename + ', "' + stringname + '", FALSE);' - print ' if (glxWinDebugSettings.enable' + prefix.upper() + 'callTrace) ErrorF("'+ funcname + '\\n");' - print ' return RESOLVED_PROC(' + pfntypename + ')(', - - if arglist != 'void' : - print wrappers[w]['arglist_use'], - - print ');' - print "}\n" - - -# generate function to setup the dispatch table, which sets each -# dispatch table entry to point to it's wrapper function -# (assuming we were able to make one) - -if dispatchheader : - print 'void glWinSetupDispatchTable(void)' - print '{' - print ' static struct _glapi_table *disp = NULL;' - print '' - print ' if (!disp)' - print ' {' - print ' disp = calloc(sizeof(void *), _glapi_get_dispatch_table_size());' - print ' assert(disp);' - - for d in sorted(dispatch.keys()) : - if wrappers.has_key(d) : - print ' SET_'+ d + '(disp, (void *)' + prefix + d + 'Wrapper);' - else : - print '#warning No wrapper for ' + prefix + d + ' !' - - print ' }' - print '' - print ' _glapi_set_dispatch(disp);' - print '}' + if rettype.lower()=="void": + self.outFile.write(' RESOLVE(PFN%sPROC, "%s");\n'%(name.upper(), name)) + self.outFile.write(' RESOLVED_PROC(') + else: + self.outFile.write(' RESOLVE_RET(PFN%sPROC, "%s", 0);\n'%(name.upper(), name)) + self.outFile.write(' return RESOLVED_PROC(') + + Comma="" + for ptype, pname in plist: + self.outFile.write("%s%s_"%(Comma, pname)) + Comma=", " + + self.outFile.write(" );\n}\n\n") + +def genHeaders(): + outFile = open(outFilename,"w") + + if preresolve: + gen = PreResolveOutputGenerator(errFile=errWarn, + warnFile=errWarn, + diagFile=diag) + gen.outFile=outFile + reg.setGenerator(gen) + reg.apiGen(genOpts) + + if wrapper: + gen = WrapperOutputGenerator(errFile=errWarn, + warnFile=errWarn, + diagFile=diag) + gen.outFile=outFile + reg.setGenerator(gen) + reg.apiGen(genOpts) + + if shim: + gen = ShimOutputGenerator(errFile=errWarn, + warnFile=errWarn, + diagFile=diag) + gen.outFile=outFile + reg.setGenerator(gen) + reg.apiGen(genOpts) + + if thunk: + gen = ThunkOutputGenerator(errFile=errWarn, + warnFile=errWarn, + diagFile=diag) + gen.outFile=outFile + reg.setGenerator(gen) + reg.apiGen(genOpts) + + + if thunkdefs: + gen = ThunkDefsOutputGenerator(errFile=errWarn, + warnFile=errWarn, + diagFile=diag) + gen.outFile=outFile + reg.setGenerator(gen) + reg.apiGen(genOpts) + + outFile.close() + +genHeaders() diff --git a/xorg-server/hw/xwin/glx/glshim.c b/xorg-server/hw/xwin/glx/glshim.c new file mode 100644 index 000000000..7109196c0 --- /dev/null +++ b/xorg-server/hw/xwin/glx/glshim.c @@ -0,0 +1,124 @@ +/* + * File: glshim.c + * Purpose: GL shim which redirects to a specified DLL + * + * Copyright (c) Jon TURNEY 2013 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + A GL shim which redirects to a specified DLL + + XWin is statically linked with this, rather than the system libGL, so that + GL calls can be directed to mesa cygGL-1.dll, or cygnativeGLthunk.dll + (which contains cdecl-to-stdcall thunks to the native openGL32.dll) +*/ + +#ifdef HAVE_XWIN_CONFIG_H +#include <xwin-config.h> +#endif + +#define GL_GLEXT_LEGACY +#include <GL/gl.h> +#undef GL_ARB_imaging +#undef GL_VERSION_1_3 +#include <GL/glext.h> + +#include <X11/Xwindows.h> +#include <os.h> +#include "glwindows.h" +#include <glx/glxserver.h> + +static HMODULE hMod = NULL; + +/* + Implement the __glGetProcAddress function by just using GetProcAddress() on the selected DLL +*/ +void *glXGetProcAddressARB(const char *symbol) +{ + void *proc; + + /* Default to the mesa GL implementation if one hasn't been selected yet */ + if (!hMod) + glWinSelectImplementation(0); + + proc = GetProcAddress(hMod, symbol); + + if (glxWinDebugSettings.enableGLcallTrace) + ErrorF("glXGetProcAddressARB: Resolved '%s' in %p to %p\n", symbol, hMod, proc); + + return proc; +} + +/* + Select a GL implementation DLL +*/ +int glWinSelectImplementation(int native) +{ + const char *dllname; + + if (native) { + dllname = "cygnativeGLthunk.dll"; + } + else { + dllname = "cygGL-1.dll"; + } + + hMod = LoadLibraryEx(dllname, NULL, 0); + if (hMod == NULL) { + ErrorF("glWinSelectGLimplementation: Could not load '%s'\n", dllname); + return -1; + } + + ErrorF("glWinSelectGLimplementation: Loaded '%s'\n", dllname); + + /* Connect __glGetProcAddress() to our implementation of glXGetProcAddressARB() above */ + __glXsetGetProcAddress((glx_gpa_proc)glXGetProcAddressARB); + + return 0; +} + +#define RESOLVE_RET(proctype, symbol, retval) \ + proctype proc = (proctype)glXGetProcAddressARB(symbol); \ + if (proc == NULL) return retval; + +#define RESOLVE(proctype, symbol) RESOLVE_RET(proctype, symbol,) +#define RESOLVED_PROC proc + +/* Include generated shims for direct linkage to GL functions which are in the ABI */ +#include "generated_gl_shim.c" + +/* + Special wrapper for glAddSwapHintRectWIN for copySubBuffers + + Only used with native GL if the GL_WIN_swap_hint extension is present, so we enable + GLX_MESA_copy_sub_buffer +*/ +typedef void (__stdcall * PFNGLADDSWAPHINTRECTWIN) (GLint x, GLint y, + GLsizei width, + GLsizei height); + +void +glAddSwapHintRectWINWrapper(GLint x, GLint y, GLsizei width, + GLsizei height) +{ + RESOLVE(PFNGLADDSWAPHINTRECTWIN, "glAddSwapHintRectWIN"); + RESOLVED_PROC(x, y, width, height); +} diff --git a/xorg-server/hw/xwin/glx/glwrap.c b/xorg-server/hw/xwin/glx/glthunk.c index 73cff3cc1..d49fe487c 100644 --- a/xorg-server/hw/xwin/glx/glwrap.c +++ b/xorg-server/hw/xwin/glx/glthunk.c @@ -1,13 +1,8 @@ /* - * File: glwrap.c - * Purpose: Wrapper functions for Win32 OpenGL functions - * - * Authors: Alexander Gottwald - * Jon TURNEY - * - * Copyright (c) Jon TURNEY 2009 - * Copyright (c) Alexander Gottwald 2004 + * File: glthunk.c + * Purpose: cdecl thunk wrapper library for Win32 stdcall OpenGL library * + * Copyright (c) Jon TURNEY 2009,2013 * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -37,34 +32,12 @@ #endif #include <X11/Xwindows.h> + +#define GL_GLEXT_LEGACY #include <GL/gl.h> +#undef GL_ARB_imaging +#undef GL_VERSION_1_3 #include <GL/glext.h> -#include <glx/glxserver.h> -#include <glx/glxext.h> -#include <glx/glapi.h> -#include <glx/dispatch.h> -#include <glwindows.h> - -static unsigned int glWinIndirectProcCalls = 0; -static unsigned int glWinDirectProcCalls = 0; - -void -glWinCallDelta(void) -{ - static unsigned int glWinIndirectProcCallsLast = 0; - static unsigned int glWinDirectProcCallsLast = 0; - - if ((glWinIndirectProcCalls != glWinIndirectProcCallsLast) || - (glWinDirectProcCalls != glWinDirectProcCallsLast)) { - if (glxWinDebugSettings.enableTrace) { - ErrorF("after %d direct and %d indirect GL calls\n", - glWinDirectProcCalls - glWinDirectProcCallsLast, - glWinIndirectProcCalls - glWinIndirectProcCallsLast); - } - glWinDirectProcCallsLast = glWinDirectProcCalls; - glWinIndirectProcCallsLast = glWinIndirectProcCalls; - } -} static PROC glWinResolveHelper(PROC * cache, const char *symbol) @@ -75,11 +48,9 @@ glWinResolveHelper(PROC * cache, const char *symbol) if ((*cache) == NULL) { proc = wglGetProcAddress(symbol); if (proc == NULL) { - ErrorF("glwrap: Can't resolve \"%s\"\n", symbol); (*cache) = (PROC) - 1; } else { - ErrorF("glwrap: Resolved \"%s\"\n", symbol); (*cache) = proc; } } @@ -99,10 +70,8 @@ glWinResolveHelper(PROC * cache, const char *symbol) static PROC cache = NULL; \ __stdcall proctype proc = (proctype)glWinResolveHelper(&cache, symbol); \ if (proc == NULL) { \ - __glXErrorCallBack(0); \ return retval; \ - } \ - glWinIndirectProcCalls++; + } #define RESOLVE(proctype, symbol) RESOLVE_RET(proctype, symbol,) @@ -113,34 +82,6 @@ glWinResolveHelper(PROC * cache, const char *symbol) OpenGL 1.2 and upward is treated as extensions, function address must found using wglGetProcAddress(), but also stdcall so still need wrappers... - - Include generated dispatch table setup function */ -#include "generated_gl_wrappers.c" - -/* - Special non-static wrapper for glGetString for debug output -*/ - -const GLubyte * -glGetStringWrapperNonstatic(GLenum name) -{ - return glGetString(name); -} - -/* - Special non-static wrapper for glAddSwapHintRectWIN for copySubBuffers -*/ - -typedef void (__stdcall * PFNGLADDSWAPHINTRECTWIN) (GLint x, GLint y, - GLsizei width, - GLsizei height); - -void -glAddSwapHintRectWINWrapperNonstatic(GLint x, GLint y, GLsizei width, - GLsizei height) -{ - RESOLVE(PFNGLADDSWAPHINTRECTWIN, "glAddSwapHintRectWIN"); - proc(x, y, width, height); -} +#include "generated_gl_thunks.c" diff --git a/xorg-server/hw/xwin/glx/glwindows.h b/xorg-server/hw/xwin/glx/glwindows.h index ec1d1f51b..4f859b498 100644 --- a/xorg-server/hw/xwin/glx/glwindows.h +++ b/xorg-server/hw/xwin/glx/glwindows.h @@ -42,12 +42,9 @@ typedef struct { extern glxWinDebugSettingsRec glxWinDebugSettings; -void glWinCallDelta(void); void glxWinPushNativeProvider(void); -const GLubyte *glGetStringWrapperNonstatic(GLenum name); -void glAddSwapHintRectWINWrapperNonstatic(GLint x, GLint y, GLsizei width, - GLsizei height); -void glWinSetupDispatchTable(void); +void glAddSwapHintRectWINWrapper(GLint x, GLint y, GLsizei width, GLsizei height); +int glWinSelectImplementation(int native); #if 1 #define GLWIN_TRACE_MSG(msg, args...) if (glxWinDebugSettings.enableTrace) ErrorF(msg " [%s:%d]\n" , ##args , __FUNCTION__, __LINE__ ) diff --git a/xorg-server/hw/xwin/glx/indirect.c b/xorg-server/hw/xwin/glx/indirect.c index 4f09652f0..3d01bed39 100644 --- a/xorg-server/hw/xwin/glx/indirect.c +++ b/xorg-server/hw/xwin/glx/indirect.c @@ -550,7 +550,9 @@ glxWinScreenProbe(ScreenPtr pScreen) if (NULL == screen) return NULL; - /* Dump out some useful information about the native renderer */ + // Select the native GL implementation (WGL) + if (glWinSelectImplementation(1)) + return NULL; // create window class #define WIN_GL_TEST_WINDOW_CLASS "XWinGLTest" @@ -597,11 +599,12 @@ glxWinScreenProbe(ScreenPtr pScreen) // (but we need to have a current context for them to be resolvable) wglResolveExtensionProcs(); - ErrorF("GL_VERSION: %s\n", glGetStringWrapperNonstatic(GL_VERSION)); - ErrorF("GL_VENDOR: %s\n", glGetStringWrapperNonstatic(GL_VENDOR)); - gl_renderer = (const char *) glGetStringWrapperNonstatic(GL_RENDERER); + /* Dump out some useful information about the native renderer */ + ErrorF("GL_VERSION: %s\n", glGetString(GL_VERSION)); + ErrorF("GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + gl_renderer = (const char *) glGetString(GL_RENDERER); ErrorF("GL_RENDERER: %s\n", gl_renderer); - gl_extensions = (const char *) glGetStringWrapperNonstatic(GL_EXTENSIONS); + gl_extensions = (const char *) glGetString(GL_EXTENSIONS); wgl_extensions = wglGetExtensionsStringARBWrapper(hdc); if (!wgl_extensions) wgl_extensions = ""; @@ -615,7 +618,7 @@ glxWinScreenProbe(ScreenPtr pScreen) free(screen); LogMessage(X_ERROR, "AIGLX: Won't use generic native renderer as it is not accelerated\n"); - return NULL; + goto error; } // Can you see the problem here? The extensions string is DC specific @@ -726,7 +729,7 @@ glxWinScreenProbe(ScreenPtr pScreen) free(screen); LogMessage(X_ERROR, "AIGLX: No fbConfigs could be made from native OpenGL pixel formats\n"); - return NULL; + goto error; } /* These will be set by __glXScreenInit */ @@ -789,6 +792,13 @@ glxWinScreenProbe(ScreenPtr pScreen) pScreen->CopyWindow = glxWinCopyWindow; return &screen->base; + + error: + // Something went wrong and we can't use the native GL implementation + // so make sure the mesa GL implementation is selected instead + glWinSelectImplementation(0); + + return NULL; } /* ---------------------------------------------------------------------- */ @@ -910,7 +920,7 @@ static void glxWinDrawableCopySubBuffer(__GLXdrawable * drawable, int x, int y, int w, int h) { - glAddSwapHintRectWINWrapperNonstatic(x, y, w, h); + glAddSwapHintRectWINWrapper(x, y, w, h); glxWinDrawableSwapBuffers(NULL, drawable); } @@ -1458,7 +1468,6 @@ glxWinContextMakeCurrent(__GLXcontext * base) GLWIN_TRACE_MSG("glxWinContextMakeCurrent context %p (native ctx %p)", gc, gc->ctx); - glWinCallDelta(); /* Keep a note of the last active context in the drawable */ drawPriv = gc->base.drawPriv; @@ -1528,7 +1537,6 @@ glxWinContextLoseCurrent(__GLXcontext * base) GLWIN_TRACE_MSG("glxWinContextLoseCurrent context %p (native ctx %p)", gc, gc->ctx); - glWinCallDelta(); /* An error seems to be reported if we try to make no context current @@ -1623,8 +1631,6 @@ glxWinCreateContext(__GLXscreen * screen, context->ctx = NULL; context->shareContext = shareContext; - glWinSetupDispatchTable(); - GLWIN_DEBUG_MSG("GLXcontext %p created", context); return &(context->base); |