From: Derek Lesho dlesho@codeweavers.com
Signed-off-by: Derek Lesho dlesho@codeweavers.com --- dlls/opengl32/make_opengl | 1 + dlls/opengl32/unix_wgl.c | 29 +++++++++++++++++++++++++++++ dlls/win32u/opengl.c | 16 ++++++++++++++++ include/wine/opengl_driver.h | 3 ++- 4 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 011b3d21878..7acaed9669e 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -206,6 +206,7 @@ my %manual_unix_thunks = "glGetIntegerv" => 1, "glGetString" => 1, "glGetStringi" => 1, + "glGetUnsignedBytevEXT" => 1, "glNamedFramebufferDrawBuffer" => 1, "glNamedFramebufferDrawBuffers" => 1, "glNamedFramebufferReadBuffer" => 1, diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index d81c503f2d1..03a3dcb35ec 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -850,8 +850,11 @@ static BOOL get_default_fbo_integer( struct context *ctx, struct opengl_drawable
static BOOL get_integer( TEB *teb, GLenum pname, GLint *data ) { + struct opengl_funcs *funcs = teb->glTable; struct opengl_drawable *draw, *read; struct context *ctx; + UINT32 node_mask; + LUID luid;
if (!(ctx = get_current_context( teb, &draw, &read ))) return FALSE;
@@ -874,11 +877,29 @@ static BOOL get_integer( TEB *teb, GLenum pname, GLint *data ) if (!read->read_fbo) break; *data = ctx->read_fbo; return TRUE; + case GL_DEVICE_NODE_MASK_EXT: + funcs->p_get_luid(&luid, &node_mask); + *data = node_mask; + return TRUE; }
return get_default_fbo_integer( ctx, draw, read, pname, data ); }
+static BOOL get_luid( TEB *teb, GLenum pname, LUID *luid) +{ + const struct opengl_funcs *funcs = teb->glTable; + UINT32 node_mask; + + switch (pname) + { + case GL_DEVICE_LUID_EXT: + return funcs->p_get_luid(luid, &node_mask); + } + + return false; +} + const GLubyte *wrap_glGetString( TEB *teb, GLenum name ) { const struct opengl_funcs *funcs = teb->glTable; @@ -2049,6 +2070,14 @@ void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ) else funcs->p_glGetInteger64v( pname, data ); }
+void wrap_glGetUnsignedBytevEXT( TEB *teb, GLenum pname, GLubyte *data ) +{ + const struct opengl_funcs *funcs = teb->glTable; + LUID luid; + if (get_luid( teb, pname, &luid )) memcpy( data, &luid, sizeof(luid) ); + else funcs->p_glGetUnsignedBytevEXT( pname, data ); +} + void wrap_glGetFramebufferParameterivEXT( TEB *teb, GLuint fbo, GLenum pname, GLint *params ) { const struct opengl_funcs *funcs = teb->glTable; diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 57a0c773cbc..d110b051149 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -2439,6 +2439,20 @@ static const char *win32u_wglQueryCurrentRendererStringWINE( GLenum attribute ) return query_renderer_string( LIST_ENTRY( ptr, struct egl_platform, entry ), attribute ); }
+static BOOL win32u_get_luid( LUID *luid, UINT32 *node_mask ) +{ + const struct opengl_funcs *funcs = &display_funcs; + GLint uuid_count = 0; + GUID uuid; + + funcs->p_glGetIntegerv( GL_NUM_DEVICE_UUIDS_EXT, &uuid_count ); + if (!uuid_count) + return FALSE; + + funcs->p_glGetUnsignedBytei_vEXT( GL_DEVICE_UUID_EXT, 0, (GLubyte *) &uuid ); + return get_luid_from_vulkan_uuid(&uuid, luid, node_mask); +} + static void display_funcs_init(void) { struct egl_platform *egl; @@ -2540,6 +2554,8 @@ static void display_funcs_init(void) display_funcs.p_wglSwapIntervalEXT = win32u_wglSwapIntervalEXT; display_funcs.p_wglGetSwapIntervalEXT = win32u_wglGetSwapIntervalEXT;
+ display_funcs.p_get_luid = win32u_get_luid; + if (!list_empty( &devices_egl )) { register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_WINE_query_renderer" ); diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 77d1c818438..f393d6bd8b8 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -64,7 +64,7 @@ struct wgl_pixel_format #include "wine/gdi_driver.h"
/* Wine internal opengl driver version, needs to be bumped upon opengl_funcs changes. */ -#define WINE_OPENGL_DRIVER_VERSION 37 +#define WINE_OPENGL_DRIVER_VERSION 38
struct opengl_drawable; struct wgl_context; @@ -119,6 +119,7 @@ struct opengl_funcs BOOL (*p_wglSetPbufferAttribARB)( struct wgl_pbuffer * hPbuffer, const int *piAttribList ); BOOL (*p_wglSetPixelFormatWINE)( HDC hdc, int format ); BOOL (*p_wglSwapIntervalEXT)( int interval ); + BOOL (*p_get_luid)( LUID *luid, UINT32 *node_mask ); #define USE_GL_FUNC(x) PFN_##x p_##x; ALL_EGL_FUNCS ALL_EGL_EXT_FUNCS