From: Derek Lesho dlesho@codeweavers.com
Signed-off-by: Derek Lesho dlesho@codeweavers.com --- dlls/opengl32/make_opengl | 2 ++ dlls/opengl32/unix_thunks.c | 12 ++++------ dlls/opengl32/unix_thunks.h | 2 ++ dlls/opengl32/unix_wgl.c | 31 ++++++++++++++++++++++++ dlls/win32u/opengl.c | 46 ++++++++++++++++++++++++++++++++++++ dlls/win32u/tests/d3dkmt.c | 10 ++++---- dlls/win32u/vulkan.c | 2 +- dlls/win32u/win32u_private.h | 1 + include/wine/opengl_driver.h | 3 ++- 9 files changed, 94 insertions(+), 15 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index c52e803070d..ee457d6ca55 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -210,6 +210,8 @@ my %manual_unix_thunks = "glGetUnsignedBytevEXT" => 1, "glImportMemoryWin32HandleEXT" => 1, "glImportMemoryWin32NameEXT" => 1, + "glImportSemaphoreWin32HandleEXT" => 1, + "glImportSemaphoreWin32NameEXT" => 1, "glNamedFramebufferDrawBuffer" => 1, "glNamedFramebufferDrawBuffers" => 1, "glNamedFramebufferReadBuffer" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index d0b1873cf72..d0d4cc4c56d 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -12394,8 +12394,7 @@ static NTSTATUS ext_glImportSemaphoreFdEXT( void *args ) static NTSTATUS ext_glImportSemaphoreWin32HandleEXT( void *args ) { struct glImportSemaphoreWin32HandleEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glImportSemaphoreWin32HandleEXT( params->semaphore, params->handleType, params->handle ); + wrap_glImportSemaphoreWin32HandleEXT( params->teb, params->semaphore, params->handleType, params->handle ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -12403,8 +12402,7 @@ static NTSTATUS ext_glImportSemaphoreWin32HandleEXT( void *args ) static NTSTATUS ext_glImportSemaphoreWin32NameEXT( void *args ) { struct glImportSemaphoreWin32NameEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glImportSemaphoreWin32NameEXT( params->semaphore, params->handleType, params->name ); + wrap_glImportSemaphoreWin32NameEXT( params->teb, params->semaphore, params->handleType, params->name ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -53262,8 +53260,7 @@ static NTSTATUS wow64_ext_glImportSemaphoreWin32HandleEXT( void *args ) PTR32 handle; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glImportSemaphoreWin32HandleEXT( params->semaphore, params->handleType, ULongToPtr(params->handle) ); + wrap_glImportSemaphoreWin32HandleEXT( teb, params->semaphore, params->handleType, ULongToPtr(params->handle) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -53278,8 +53275,7 @@ static NTSTATUS wow64_ext_glImportSemaphoreWin32NameEXT( void *args ) PTR32 name; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glImportSemaphoreWin32NameEXT( params->semaphore, params->handleType, ULongToPtr(params->name) ); + wrap_glImportSemaphoreWin32NameEXT( teb, params->semaphore, params->handleType, ULongToPtr(params->name) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_thunks.h b/dlls/opengl32/unix_thunks.h index 7a837814568..550cc38426f 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -36,6 +36,8 @@ extern const GLubyte *wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ); extern void wrap_glGetUnsignedBytevEXT( TEB *teb, GLenum pname, GLubyte *data ); extern void wrap_glImportMemoryWin32HandleEXT( TEB *teb, GLuint memory, GLuint64 size, GLenum handleType, void *handle ); extern void wrap_glImportMemoryWin32NameEXT( TEB *teb, GLuint memory, GLuint64 size, GLenum handleType, const void *name ); +extern void wrap_glImportSemaphoreWin32HandleEXT( TEB *teb, GLuint semaphore, GLenum handleType, void *handle ); +extern void wrap_glImportSemaphoreWin32NameEXT( TEB *teb, GLuint semaphore, GLenum handleType, const void *name ); extern void wrap_glNamedFramebufferDrawBuffer( TEB *teb, GLuint framebuffer, GLenum buf ); extern void wrap_glNamedFramebufferDrawBuffers( TEB *teb, GLuint framebuffer, GLsizei n, const GLenum *bufs ); extern void wrap_glNamedFramebufferReadBuffer( TEB *teb, GLuint framebuffer, GLenum src ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 300105e1071..d526ccecce1 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -546,6 +546,7 @@ static const char *legacy_extensions[] = static const char *platform_extensions[] = { "GL_EXT_memory_object_fd", "GL_EXT_memory_object_win32", + "GL_EXT_semaphore_fd", "GL_EXT_semaphore_win32", NULL };
@@ -2176,6 +2177,36 @@ void wrap_glImportMemoryWin32NameEXT( TEB *teb, GLuint memory, GLuint64 size, GL set_gl_error( teb, err ); }
+void wrap_glImportSemaphoreWin32HandleEXT( TEB *teb, GLuint semaphore, GLenum handleType, void *handle ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLenum err; + + if (!funcs->p_import_semaphore) + { + set_gl_error( teb, GL_INVALID_OPERATION ); + return; + } + + if ((err = funcs->p_import_semaphore( semaphore, handleType, handle, NULL )) != GL_NO_ERROR) + set_gl_error( teb, err ); +} + +void wrap_glImportSemaphoreWin32NameEXT( TEB *teb, GLuint semaphore, GLenum handleType, const void *name ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLenum err; + + if (!funcs->p_import_semaphore) + { + set_gl_error( teb, GL_INVALID_OPERATION ); + return; + } + + if ((err = funcs->p_import_semaphore( semaphore, handleType, NULL, name )) != GL_NO_ERROR) + set_gl_error( teb, err ); +} + NTSTATUS process_attach( void *args ) { struct process_attach_params *params = args; diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 105e2d6f3a9..d8107b18f1b 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -2499,6 +2499,49 @@ static GLenum win32u_import_memory( GLuint memory, GLuint64 size, GLenum handleT return prev_err != GL_NO_ERROR ? prev_err : err; }
+static GLenum win32u_import_semaphore( GLuint semaphore, GLenum handleType, void *handle, const void *name ) +{ + const struct opengl_funcs *funcs = &display_funcs; + GLenum prev_err, err; + D3DKMT_HANDLE local; + int fd; + + if (name && handleType == GL_HANDLE_TYPE_OPAQUE_WIN32_EXT) + handle = open_shared_semaphore_from_name( (const WCHAR *)name ); + + if (!handle) + return GL_INVALID_VALUE; + + switch (handleType) + { + case GL_HANDLE_TYPE_OPAQUE_WIN32_EXT: + local = d3dkmt_open_sync( 0, handle ); + break; + case GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT: + local = d3dkmt_open_sync( PtrToUlong( handle ), NULL ); + break; + default: + return GL_INVALID_ENUM; + } + + if (name) + NtClose( handle ); + + if ((fd = d3dkmt_object_get_fd( local )) < 0) + return GL_INVALID_VALUE; + + d3dkmt_destroy_sync( local ); + + prev_err = funcs->p_glGetError(); + + funcs->p_glImportSemaphoreFdEXT( semaphore, GL_HANDLE_TYPE_OPAQUE_FD_EXT, fd ); + + if ((err = funcs->p_glGetError()) != GL_NO_ERROR) + close(fd); + + return prev_err != GL_NO_ERROR ? prev_err : err; +} + static void display_funcs_init(void) { struct egl_platform *egl; @@ -2609,10 +2652,13 @@ static void display_funcs_init(void) display_funcs.p_##func = default_funcs->p_##func; \ } USE_GL_FUNC(glImportMemoryFdEXT) + USE_GL_FUNC(glImportSemaphoreFdEXT) #undef USE_GL_FUNC
if (display_funcs.p_glImportMemoryFdEXT) display_funcs.p_import_memory = win32u_import_memory; + if (display_funcs.p_glImportSemaphoreFdEXT) + display_funcs.p_import_semaphore = win32u_import_semaphore;
if (!list_empty( &devices_egl )) { diff --git a/dlls/win32u/tests/d3dkmt.c b/dlls/win32u/tests/d3dkmt.c index 3d102489949..2b99ae7bed5 100644 --- a/dlls/win32u/tests/d3dkmt.c +++ b/dlls/win32u/tests/d3dkmt.c @@ -4252,7 +4252,7 @@ static struct opengl_device *create_opengl_device( HWND hwnd, LUID *luid ) ptr = find_opengl_extension( extensions, "GL_EXT_memory_object_win32" ); ok_ptr( ptr, !=, NULL ); ptr = find_opengl_extension( extensions, "GL_EXT_semaphore_win32" ); - todo_wine ok_ptr( ptr, !=, NULL ); + ok_ptr( ptr, !=, NULL ); ptr = find_opengl_extension( extensions, "GL_EXT_win32_keyed_mutex" ); dev->broken = !winetest_platform_is_wine && ptr == NULL; /* missing on AMD, as is support for importing D3D handles */
@@ -6418,7 +6418,7 @@ static void test_import_opengl_semaphore( struct opengl_device *dev, const WCHAR if (name) { PFN_glImportSemaphoreWin32NameEXT p_glImportSemaphoreWin32NameEXT = (void *)wglGetProcAddress( "glImportSemaphoreWin32NameEXT" ); - todo_wine ok_ptr( p_glImportSemaphoreWin32NameEXT, !=, NULL ); + ok_ptr( p_glImportSemaphoreWin32NameEXT, !=, NULL ); if (!p_glImportSemaphoreWin32NameEXT) return;
p_glGenSemaphoresEXT( 1, &semaphore ); @@ -6428,7 +6428,7 @@ static void test_import_opengl_semaphore( struct opengl_device *dev, const WCHAR else { PFN_glImportSemaphoreWin32HandleEXT p_glImportSemaphoreWin32HandleEXT = (void *)wglGetProcAddress( "glImportSemaphoreWin32HandleEXT" ); - todo_wine ok_ptr( p_glImportSemaphoreWin32HandleEXT, !=, NULL ); + ok_ptr( p_glImportSemaphoreWin32HandleEXT, !=, NULL ); if (!p_glImportSemaphoreWin32HandleEXT) return;
p_glGenSemaphoresEXT( 1, &semaphore ); @@ -6699,8 +6699,8 @@ static void test_shared_fences(void) if (test == MAKETEST(2, 4)) ok_x4( glGetError(), ==, 0 ); else ok( (gl_err = glGetError()) == 0 || broken(gl_err == GL_INVALID_VALUE) /* NVIDIA */, "glGetError returned %#x\n", gl_err); test_import_opengl_semaphore( opengl_imp, name, handle, GL_HANDLE_TYPE_D3D12_FENCE_EXT ); - if (test != MAKETEST(2, 4)) ok_x4( glGetError(), ==, 0 ); - else ok( (gl_err = glGetError()) == 0 || broken(gl_err == GL_INVALID_VALUE) /* NVIDIA */, "glGetError returned %#x\n", gl_err); + if (test != MAKETEST(2, 4)) todo_wine ok_x4( glGetError(), ==, 0 ); + else todo_wine ok( (gl_err = glGetError()) == 0 || broken(gl_err == GL_INVALID_VALUE) /* NVIDIA */, "glGetError returned %#x\n", gl_err); } }
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 98436367756..b1ca12f6be5 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -2345,7 +2345,7 @@ static HANDLE create_shared_semaphore_handle( D3DKMT_HANDLE local, const VkExpor return NULL; }
-static HANDLE open_shared_semaphore_from_name( const WCHAR *name ) +HANDLE open_shared_semaphore_from_name( const WCHAR *name ) { D3DKMT_OPENSYNCOBJECTNTHANDLEFROMNAME open_name = {0}; WCHAR bufferW[MAX_PATH * 2]; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 5b39b12d6c8..627b21c21ac 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -210,6 +210,7 @@ extern int d3dkmt_object_get_fd( D3DKMT_HANDLE local ); extern NTSTATUS d3dkmt_destroy_mutex( D3DKMT_HANDLE local );
extern HANDLE open_shared_resource_from_name( const WCHAR *name ); +extern HANDLE open_shared_semaphore_from_name( const WCHAR *name );
extern D3DKMT_HANDLE d3dkmt_create_resource( int fd, D3DKMT_HANDLE *global ); extern D3DKMT_HANDLE d3dkmt_open_resource( D3DKMT_HANDLE global, HANDLE shared, D3DKMT_HANDLE *mutex_local, D3DKMT_HANDLE *sync_local ); diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 2568214bff0..caca45ad78f 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 39 +#define WINE_OPENGL_DRIVER_VERSION 40
struct opengl_drawable; struct wgl_context; @@ -121,6 +121,7 @@ struct opengl_funcs BOOL (*p_wglSwapIntervalEXT)( int interval ); BOOL (*p_get_luid)( LUID *luid, UINT32 *node_mask ); GLenum (*p_import_memory)( GLuint memory, GLuint64 size, GLenum handleType, void *handle, const void *name ); + GLenum (*p_import_semaphore)( GLuint semaphore, GLenum handleType, void *handle, const void *name ); #define USE_GL_FUNC(x) PFN_##x p_##x; ALL_EGL_FUNCS ALL_EGL_EXT_FUNCS