Commit 9022fb38 authored by Jesse Natalie's avatar Jesse Natalie
Browse files

Fix static glapi on Windows

On Linux, the static glapi path sees libGL.so implementing the static
glapi, and the drivers (libgallium_dri.so) updating/reading the TLS
vars.

On Windows, to allow libgallium_wgl.dll to be a full ICD, it's
responsible for implementing the actual static glapi. However, before
this change, OpenGL32.dll was also implementing the static glapi,
meaning that GL API calls from OpenGL32.dll didn't route to the driver
correctly because the TLS vars were never actually set - the driver set
its copy, and OpenGL32.dll read its own copy.

Now, always build a bridge and static version of glapi when not using
shared. The bridge version is linked into OpenGL32.dll, and the static
version is linked into the driver on Windows. GLES only builds with
shared glapi - but after this, shared glapi is not really needed on
Windows for GLES, since the driver has all of the data.

Fixes: f36921ef ("wgl: Refactor drivers to a libgallium_wgl.dll")
Closes: #6560
parent 96d9093c
Pipeline #595975 waiting for manual action with stages
in 15 seconds
......@@ -38,7 +38,7 @@ libopengl32 = shared_library(
inc_include, inc_wgl, inc_src,
],
link_with : [
libgallium_wgl, libglapi_static, libglapi
libgallium_wgl, libglapi_bridge, libglapi
],
dependencies : [
idep_mesautil
......
......@@ -91,7 +91,7 @@ _GLAPI_EXPORT extern __THREAD_INITIAL_EXEC void * _glapi_tls_Context;
_GLAPI_EXPORT extern const struct _glapi_table *_glapi_Dispatch;
_GLAPI_EXPORT extern const void *_glapi_Context;
#if defined (USE_TLS_BEHIND_FUNCTIONS)
#if defined (USE_TLS_BEHIND_FUNCTIONS) || defined(MAPI_MODE_BRIDGE)
# define GET_DISPATCH() _glapi_get_dispatch()
# define GET_CURRENT_CONTEXT(C) struct gl_context *C = (struct gl_context *) _glapi_get_context()
#else
......
......@@ -29,62 +29,77 @@ if with_dri and ['apple', 'windows'].contains(with_dri_platform)
static_glapi_files += [glapi_gentable_c, glapitable_h]
endif
if with_shared_glapi
static_glapi_files += files(
'../entry.c',
'../entry.h',
'../entry_x86-64_tls.h',
'../entry_x86_tls.h',
'../entry_x86_tsd.h',
'../entry_ppc64le_tls.h',
'../entry_ppc64le_tsd.h',
'../mapi_tmp.h',
)
static_glapi_files += glapi_mapi_tmp_h
static_glapi_args += [
'-DMAPI_MODE_BRIDGE',
'-DMAPI_ABI_HEADER="@0@"'.format(glapi_mapi_tmp_h.full_path()),
gcc_lto_quirk,
]
if with_platform_windows
static_glapi_args += ['-D_GDI32_']
endif
else
static_glapi_args += '-DMAPI_MODE_UTIL'
if with_platform_windows
static_glapi_args += ['-D_GDI32_', '-DKHRONOS_DLL_EXPORTS', '-D_GLAPI_NO_EXPORTS']
endif
static_glapi_files += files(
'glapi_dispatch.c',
'glapi_entrypoint.c',
'glapi_getproc.c',
'glapi_nop.c',
'glapi.c',
'glapi.h',
'glapi_priv.h',
)
static_glapi_files += files_mapi_util
static_glapi_files += [
glapitable_h, glapi_mapi_tmp_h, glprocs_h, glapitemp_h,
]
if with_asm_arch == 'x86'
static_glapi_files += glapi_x86_s
elif with_asm_arch == 'x86_64'
static_glapi_files += glapi_x86_64_s
elif with_asm_arch == 'sparc'
static_glapi_files += glapi_sparc_s
endif
bridge_glapi_files = static_glapi_files
bridge_glapi_args = static_glapi_args
bridge_glapi_files += files(
'../entry.c',
'../entry.h',
'../entry_x86-64_tls.h',
'../entry_x86_tls.h',
'../entry_x86_tsd.h',
'../entry_ppc64le_tls.h',
'../entry_ppc64le_tsd.h',
'../mapi_tmp.h',
)
bridge_glapi_files += glapi_mapi_tmp_h
bridge_glapi_args += [
'-DMAPI_MODE_BRIDGE',
'-DMAPI_ABI_HEADER="@0@"'.format(glapi_mapi_tmp_h.full_path()),
gcc_lto_quirk,
]
if with_platform_windows
bridge_glapi_args += ['-D_GDI32_']
endif
static_glapi_args += '-DMAPI_MODE_UTIL'
if with_platform_windows
static_glapi_args += ['-D_GDI32_', '-DKHRONOS_DLL_EXPORTS', '-D_GLAPI_DLL_EXPORTS']
endif
static_glapi_files += files(
'glapi_dispatch.c',
'glapi_entrypoint.c',
'glapi_getproc.c',
'glapi_nop.c',
'glapi.c',
'glapi.h',
'glapi_priv.h',
)
static_glapi_files += files_mapi_util
static_glapi_files += [
glapitable_h, glapi_mapi_tmp_h, glprocs_h, glapitemp_h,
]
if with_asm_arch == 'x86'
static_glapi_files += glapi_x86_s
elif with_asm_arch == 'x86_64'
static_glapi_files += glapi_x86_64_s
elif with_asm_arch == 'sparc'
static_glapi_files += glapi_sparc_s
endif
libglapi_static = static_library(
'glapi_static',
static_glapi_files,
libglapi_bridge = static_library(
'glapi_bridge',
bridge_glapi_files,
include_directories : [inc_mesa, inc_include, inc_src, inc_mapi],
c_args : [c_msvc_compat_args, static_glapi_args],
c_args : [c_msvc_compat_args, bridge_glapi_args],
dependencies : [dep_thread, dep_selinux],
build_by_default : false,
)
if with_shared_glapi
libglapi_static = libglapi_bridge
else
libglapi_static = static_library(
'glapi_static',
static_glapi_files,
include_directories : [inc_mesa, inc_include, inc_src, inc_mapi],
c_args : [c_msvc_compat_args, static_glapi_args],
dependencies : [dep_thread, dep_selinux],
build_by_default : false,
)
endif
# TODO: this test doesn't compile on windows with mingw or msvc due to
# undefined symbols from libglapi_static, but that should be fixable.
if with_any_opengl and not with_shared_glapi and with_tests and not with_platform_windows
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment