From: Derek Lesho dlesho@codeweavers.com
Signed-off-by: Derek Lesho dlesho@codeweavers.com --- dlls/opengl32/make_opengl | 4 +- dlls/opengl32/unix_thunks.c | 23 +++----- dlls/opengl32/unix_thunks.h | 5 +- dlls/opengl32/unix_wgl.c | 109 +++++++++++++++++++++++++++-------- dlls/win32u/opengl.c | 58 +++++++++++++++++++ dlls/win32u/tests/d3dkmt.c | 42 +++++++------- dlls/win32u/vulkan.c | 2 +- dlls/win32u/win32u_private.h | 2 + include/wine/opengl_driver.h | 3 +- 9 files changed, 184 insertions(+), 64 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 7acaed9669e..02ddd01cab7 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -200,6 +200,7 @@ my %manual_unix_thunks = "glFramebufferReadBufferEXT" => 1, "glGetBooleanv" => 1, "glGetDoublev" => 1, + "glGetError" => 1, "glGetFloatv" => 1, "glGetFramebufferParameterivEXT" => 1, "glGetInteger64v" => 1, @@ -207,6 +208,8 @@ my %manual_unix_thunks = "glGetString" => 1, "glGetStringi" => 1, "glGetUnsignedBytevEXT" => 1, + "glImportMemoryWin32HandleEXT" => 1, + "glImportMemoryWin32NameEXT" => 1, "glNamedFramebufferDrawBuffer" => 1, "glNamedFramebufferDrawBuffers" => 1, "glNamedFramebufferReadBuffer" => 1, @@ -289,7 +292,6 @@ my %manual_wow64_wrappers = "glFlushMappedNamedBufferRangeEXT" => 0, "glGetBufferPointerv" => 0, "glGetBufferPointervARB" => 0, - "glGetError" => 0, "glGetNamedBufferPointerv" => 0, "glGetNamedBufferPointervEXT" => 0, "glGetSynciv" => 0, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 19596967d23..af51b233224 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -1019,8 +1019,7 @@ static NTSTATUS gl_glGetDoublev( void *args ) static NTSTATUS gl_glGetError( void *args ) { struct glGetError_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - params->ret = funcs->p_glGetError(); + params->ret = wrap_glGetError( params->teb ); return STATUS_SUCCESS; }
@@ -11538,8 +11537,7 @@ static NTSTATUS ext_glGetUnsignedBytei_vEXT( void *args ) static NTSTATUS ext_glGetUnsignedBytevEXT( void *args ) { struct glGetUnsignedBytevEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glGetUnsignedBytevEXT( params->pname, params->data ); + wrap_glGetUnsignedBytevEXT( params->teb, params->pname, params->data ); return STATUS_SUCCESS; }
@@ -12371,8 +12369,7 @@ static NTSTATUS ext_glImportMemoryFdEXT( void *args ) static NTSTATUS ext_glImportMemoryWin32HandleEXT( void *args ) { struct glImportMemoryWin32HandleEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glImportMemoryWin32HandleEXT( params->memory, params->size, params->handleType, params->handle ); + wrap_glImportMemoryWin32HandleEXT( params->teb, params->memory, params->size, params->handleType, params->handle ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -12380,8 +12377,7 @@ static NTSTATUS ext_glImportMemoryWin32HandleEXT( void *args ) static NTSTATUS ext_glImportMemoryWin32NameEXT( void *args ) { struct glImportMemoryWin32NameEXT_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glImportMemoryWin32NameEXT( params->memory, params->size, params->handleType, params->name ); + wrap_glImportMemoryWin32NameEXT( params->teb, params->memory, params->size, params->handleType, params->name ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -32252,7 +32248,7 @@ static NTSTATUS wow64_gl_glGetError( void *args ) GLenum ret; } *params = args; TEB *teb = get_teb64( params->teb ); - params->ret = wow64_glGetError( teb ); + params->ret = wrap_glGetError( teb ); return STATUS_SUCCESS; }
@@ -51622,8 +51618,7 @@ static NTSTATUS wow64_ext_glGetUnsignedBytevEXT( void *args ) PTR32 data; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glGetUnsignedBytevEXT( params->pname, ULongToPtr(params->data) ); + wrap_glGetUnsignedBytevEXT( teb, params->pname, ULongToPtr(params->data) ); return STATUS_SUCCESS; }
@@ -53207,8 +53202,7 @@ static NTSTATUS wow64_ext_glImportMemoryWin32HandleEXT( void *args ) PTR32 handle; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glImportMemoryWin32HandleEXT( params->memory, params->size, params->handleType, ULongToPtr(params->handle) ); + wrap_glImportMemoryWin32HandleEXT( teb, params->memory, params->size, params->handleType, ULongToPtr(params->handle) ); set_context_attribute( teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -53224,8 +53218,7 @@ static NTSTATUS wow64_ext_glImportMemoryWin32NameEXT( void *args ) PTR32 name; } *params = args; TEB *teb = get_teb64( params->teb ); - const struct opengl_funcs *funcs = teb->glTable; - funcs->p_glImportMemoryWin32NameEXT( params->memory, params->size, params->handleType, ULongToPtr(params->name) ); + wrap_glImportMemoryWin32NameEXT( teb, params->memory, params->size, 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 4bf2d13c476..7a837814568 100644 --- a/dlls/opengl32/unix_thunks.h +++ b/dlls/opengl32/unix_thunks.h @@ -16,6 +16,7 @@ extern void wrap_glFinish( TEB *teb ); extern void wrap_glFlush( TEB *teb ); extern void wrap_glGetBooleanv( TEB *teb, GLenum pname, GLboolean *data ); extern void wrap_glGetDoublev( TEB *teb, GLenum pname, GLdouble *data ); +extern GLenum wrap_glGetError( TEB *teb ); extern void wrap_glGetFloatv( TEB *teb, GLenum pname, GLfloat *data ); extern void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ); extern const GLubyte *wrap_glGetString( TEB *teb, GLenum name ); @@ -32,6 +33,9 @@ extern void wrap_glFramebufferReadBufferEXT( TEB *teb, GLuint framebuffer, GLenu extern void wrap_glGetFramebufferParameterivEXT( TEB *teb, GLuint framebuffer, GLenum pname, GLint *params ); extern void wrap_glGetInteger64v( TEB *teb, GLenum pname, GLint64 *data ); 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_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 ); @@ -47,7 +51,6 @@ extern BOOL wrap_wglReleaseTexImageARB( TEB *teb, HPBUFFERARB hPbuffer, int iBuf extern BOOL wrap_wglSetPbufferAttribARB( TEB *teb, HPBUFFERARB hPbuffer, const int *piAttribList );
#ifdef _WIN64 -extern GLenum wow64_glGetError( TEB *teb ); extern void wow64_glBufferStorage( TEB *teb, GLenum target, GLsizeiptr size, const void *data, GLbitfield flags ); extern GLenum wow64_glClientWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout ); extern void wow64_glDeleteBuffers( TEB *teb, GLsizei n, const GLuint *buffers ); diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 03a3dcb35ec..c09d5afd659 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -541,6 +541,12 @@ static const char *legacy_extensions[] = NULL, };
+static const char *platform_extensions[] = +{ + "GL_EXT_memory_object_fd", "GL_EXT_memory_object_win32", + NULL +}; + static const char *parse_gl_version( const char *gl_version, int *major, int *minor ) { const char *ptr = gl_version; @@ -734,6 +740,7 @@ static GLubyte *filter_extensions( struct context *ctx, const char *extensions )
size = strlen( extensions ) + 2; for (extra = legacy_extensions; *extra; extra++) size += strlen( *extra ) + 1; + for (extra = platform_extensions; *extra; extra+=2) size += strlen( extra[1] + 1 ); if (!(p = str = malloc( size ))) return NULL;
TRACE( "GL_EXTENSIONS:\n" ); @@ -747,10 +754,22 @@ static GLubyte *filter_extensions( struct context *ctx, const char *extensions ) memcpy( p, extensions, end - extensions ); p[end - extensions] = 0;
+ for (extra = platform_extensions; *extra; extra += 2) + { + if (strcmp(p, extra[0])) + continue; + + TRACE("Replace platform extension %s with:\n", p); + + size = strlen( extra[1] ); + memcpy( p, extra[1], size ); + p[size] = 0; + } + if (is_extension_supported( ctx, p )) { TRACE( "++ %s\n", p ); - p += end - extensions; + p += strlen(p); *p++ = ' '; } else @@ -1252,6 +1271,7 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD if (ctx->major_version >= 3) { GLint extensions_count; + const char **platform_ext;
if (!funcs->p_glGetStringi) { @@ -1262,7 +1282,18 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD funcs->p_glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); size += extensions_count; if (!(extensions = malloc( size * sizeof(*extensions) ))) return; - for (i = 0; i < extensions_count; i++) extensions[count++] = (const char *)funcs->p_glGetStringi( GL_EXTENSIONS, i ); + for (i = 0; i < extensions_count; i++) + { + extensions[count] = (const char *)funcs->p_glGetStringi( GL_EXTENSIONS, i ); + + for (platform_ext = platform_extensions; *platform_ext; platform_ext+=2) + { + if (!strcmp(extensions[count], platform_ext[0])) + extensions[count] = platform_ext[1]; + } + + count++; + } } else { @@ -2090,6 +2121,58 @@ void wrap_glGetFramebufferParameterivEXT( TEB *teb, GLuint fbo, GLenum pname, GL funcs->p_glGetFramebufferParameterivEXT( fbo, pname, params ); }
+static void set_gl_error( TEB *teb, GLenum gl_error ) +{ + const struct opengl_funcs *funcs = teb->glTable; + struct context *ctx; + + if (!(ctx = get_current_context( teb, NULL, NULL )) || ctx->gl_error) return; + if (!(ctx->gl_error = funcs->p_glGetError())) ctx->gl_error = gl_error; +} + +GLenum wrap_glGetError( TEB *teb ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLenum gl_err, prev_err; + struct context *ctx; + + if (!(ctx = get_current_context( teb, NULL, NULL ))) return GL_INVALID_OPERATION; + gl_err = funcs->p_glGetError(); + prev_err = ctx->gl_error; + ctx->gl_error = GL_NO_ERROR; + return prev_err ? prev_err : gl_err; +} + +void wrap_glImportMemoryWin32HandleEXT( TEB *teb, GLuint memory, GLuint64 size, GLenum handleType, void *handle ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLenum err; + + if (!funcs->p_import_memory) + { + set_gl_error( teb, GL_INVALID_OPERATION ); + return; + } + + if ((err = funcs->p_import_memory( memory, size, handleType, handle, NULL )) != GL_NO_ERROR) + set_gl_error( teb, err ); +} + +void wrap_glImportMemoryWin32NameEXT( TEB *teb, GLuint memory, GLuint64 size, GLenum handleType, const void *name ) +{ + const struct opengl_funcs *funcs = teb->glTable; + GLenum err; + + if (!funcs->p_import_memory) + { + set_gl_error( teb, GL_INVALID_OPERATION ); + return; + } + + if ((err = funcs->p_import_memory( memory, size, handleType, NULL, name )) != GL_NO_ERROR) + set_gl_error( teb, err ); +} + NTSTATUS process_attach( void *args ) { struct process_attach_params *params = args; @@ -2187,28 +2270,6 @@ NTSTATUS return_wow64_string( const void *str, PTR32 *wow64_str ) return STATUS_BUFFER_TOO_SMALL; }
-GLenum wow64_glGetError( TEB *teb ) -{ - const struct opengl_funcs *funcs = teb->glTable; - GLenum gl_err, prev_err; - struct context *ctx; - - if (!(ctx = get_current_context( teb, NULL, NULL ))) return GL_INVALID_OPERATION; - gl_err = funcs->p_glGetError(); - prev_err = ctx->gl_error; - ctx->gl_error = GL_NO_ERROR; - return prev_err ? prev_err : gl_err; -} - -static void set_gl_error( TEB *teb, GLenum gl_error ) -{ - const struct opengl_funcs *funcs = teb->glTable; - struct context *ctx; - - if (!(ctx = get_current_context( teb, NULL, NULL )) || ctx->gl_error) return; - if (!(ctx->gl_error = funcs->p_glGetError())) ctx->gl_error = gl_error; -} - static struct wgl_handle *get_sync_ptr( TEB *teb, GLsync sync ) { struct wgl_handle *handle = get_handle_ptr( sync ); diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index d110b051149..64917ef53a8 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -26,6 +26,7 @@ #include <assert.h> #include <pthread.h> #include <dlfcn.h> +#include <unistd.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -2453,6 +2454,51 @@ static BOOL win32u_get_luid( LUID *luid, UINT32 *node_mask ) return get_luid_from_vulkan_uuid(&uuid, luid, node_mask); }
+static GLenum win32u_import_memory( GLuint memory, GLuint64 size, GLenum handleType, void *handle, const void *name ) +{ + const struct opengl_funcs *funcs = &display_funcs; + D3DKMT_HANDLE local, mutex, sync; + GLenum prev_err, err; + int fd; + + TRACE( "(%u %lu %#x %p %s)\n", memory, size, handleType, handle, debugstr_w( name ) ); + + switch (handleType) + { + case GL_HANDLE_TYPE_OPAQUE_WIN32_EXT: + if (name) handle = open_shared_resource_from_name( (const WCHAR *)name ); + if (!handle) return GL_INVALID_VALUE; + local = d3dkmt_open_resource( 0, handle, &mutex, &sync ); + if (name) NtClose( handle ); + break; + case GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT: + if (!handle) return GL_INVALID_ENUM; + local = d3dkmt_open_resource( PtrToUlong( handle ), NULL, &mutex, &sync ); + break; + default: + return GL_INVALID_ENUM; + } + + if (mutex) + d3dkmt_destroy_mutex( mutex ); + if (sync) + d3dkmt_destroy_sync( sync ); + + if ((fd = d3dkmt_object_get_fd( local )) < 0) + return GL_INVALID_VALUE; + + d3dkmt_destroy_resource( local ); + + prev_err = funcs->p_glGetError(); + + funcs->p_glImportMemoryFdEXT( memory, size, 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; @@ -2556,6 +2602,18 @@ static void display_funcs_init(void)
display_funcs.p_get_luid = win32u_get_luid;
+#define USE_GL_FUNC(func) \ + if (!display_funcs.p_##func && !(display_funcs.p_##func = driver_funcs->p_get_proc_address( #func ))) \ + { \ + WARN( "%s not found for external objects.\n", #func ); \ + display_funcs.p_##func = default_funcs->p_##func; \ + } + USE_GL_FUNC(glImportMemoryFdEXT) +#undef USE_GL_FUNC + + if (display_funcs.p_glImportMemoryFdEXT) + display_funcs.p_import_memory = win32u_import_memory; + if (!list_empty( &devices_egl )) { register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_WINE_query_renderer" ); diff --git a/dlls/win32u/tests/d3dkmt.c b/dlls/win32u/tests/d3dkmt.c index 3dcaa747d50..8685b207050 100644 --- a/dlls/win32u/tests/d3dkmt.c +++ b/dlls/win32u/tests/d3dkmt.c @@ -4250,7 +4250,7 @@ static struct opengl_device *create_opengl_device( HWND hwnd, LUID *luid ) ok_ptr( extensions, !=, NULL );
ptr = find_opengl_extension( extensions, "GL_EXT_memory_object_win32" ); - todo_wine ok_ptr( ptr, !=, NULL ); + ok_ptr( ptr, !=, NULL ); ptr = find_opengl_extension( extensions, "GL_EXT_semaphore_win32" ); todo_wine ok_ptr( ptr, !=, NULL ); ptr = find_opengl_extension( extensions, "GL_EXT_win32_keyed_mutex" ); @@ -4274,7 +4274,7 @@ static struct opengl_device *create_opengl_device( HWND hwnd, LUID *luid ) ok_x4( glGetError(), ==, 0 ); ok( !IsEqualGUID( &GUID_NULL, &guid ), "got GL_DRIVER_UUID_EXT %s\n", debugstr_guid( &guid ) );
- if (!winetest_platform_is_wine) /* crashes in host drivers */ + if (find_opengl_extension( extensions, "GL_EXT_memory_object_win32" ) || find_opengl_extension( extensions, "GL_EXT_semaphore_win32" )) /* crashes in host drivers */ { LUID device_luid = {0}; unsigned int nodes = 0; @@ -4328,7 +4328,7 @@ static GLuint import_opengl_image( struct opengl_device *dev, UINT width, UINT h if (name) { PFN_glImportMemoryWin32NameEXT p_glImportMemoryWin32NameEXT = (void *)wglGetProcAddress( "glImportMemoryWin32NameEXT" ); - todo_wine ok_ptr( p_glImportMemoryWin32NameEXT, !=, NULL ); + ok_ptr( p_glImportMemoryWin32NameEXT, !=, NULL ); if (!p_glImportMemoryWin32NameEXT) return 0;
p_glCreateMemoryObjectsEXT( 1, &memory ); @@ -4339,7 +4339,7 @@ static GLuint import_opengl_image( struct opengl_device *dev, UINT width, UINT h else { PFN_glImportMemoryWin32HandleEXT p_glImportMemoryWin32HandleEXT = (void *)wglGetProcAddress( "glImportMemoryWin32HandleEXT" ); - todo_wine ok_ptr( p_glImportMemoryWin32HandleEXT, !=, NULL ); + ok_ptr( p_glImportMemoryWin32HandleEXT, !=, NULL ); if (!p_glImportMemoryWin32HandleEXT) return 0;
p_glCreateMemoryObjectsEXT( 1, &memory ); @@ -5701,25 +5701,25 @@ static void test_shared_resources(void) test_import_opengl_image( opengl_imp, resource_size, 1, 1, 1, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, resource_size, 1, 1, 1, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; case 1: test_import_opengl_image( opengl_imp, width_1d, 1, array_1d, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_1d, 1, array_1d, 4, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; case 2: test_import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; case 3: test_import_opengl_image( opengl_imp, width_3d, height_3d, depth_3d, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_3d, height_3d, depth_3d, 4, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; } } @@ -5731,41 +5731,41 @@ static void test_shared_resources(void) test_import_opengl_image( opengl_imp, resource_size, 1, 1, 1, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, resource_size, 1, 1, 1, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, resource_size, 1, 1, 1, name, handle, GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, resource_size, 1, 1, 1, name, handle, GL_HANDLE_TYPE_D3D12_RESOURCE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; case 1: test_import_opengl_image( opengl_imp, width_1d, 1, array_1d, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_1d, 1, array_1d, 4, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_1d, 1, array_1d, 4, name, handle, GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_1d, 1, array_1d, 4, name, handle, GL_HANDLE_TYPE_D3D12_RESOURCE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; case 2: test_import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_D3D12_RESOURCE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; case 3: test_import_opengl_image( opengl_imp, width_3d, height_3d, depth_3d, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT ); ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_3d, height_3d, depth_3d, 4, name, handle, GL_HANDLE_TYPE_D3D11_IMAGE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_3d, height_3d, depth_3d, 4, name, handle, GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); test_import_opengl_image( opengl_imp, width_3d, height_3d, depth_3d, 4, name, handle, GL_HANDLE_TYPE_D3D12_RESOURCE_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 ); break; } } @@ -5804,7 +5804,7 @@ static void test_shared_resources(void) if (opengl_imp && GET_DIM(test) == 2 && !opengl_imp->broken) { gl_img = import_opengl_image( opengl_imp, width_2d, height_2d, 1, 4, name, handle, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT ); - ok_x4( glGetError(), ==, 0 ); + todo_wine ok_x4( glGetError(), ==, 0 );
CloseHandle( handle ); status = open_shared_resource( path, &handle ); diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index d0bcffcb458..98436367756 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -312,7 +312,7 @@ static HANDLE create_shared_resource_handle( D3DKMT_HANDLE local, const VkExport return NULL; }
-static HANDLE open_shared_resource_from_name( const WCHAR *name ) +HANDLE open_shared_resource_from_name( const WCHAR *name ) { D3DKMT_OPENNTHANDLEFROMNAME open_name = {0}; WCHAR bufferW[MAX_PATH * 2]; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index ee76854c7e4..60f7fcf9ea6 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -209,6 +209,8 @@ extern BOOL get_luid_from_vulkan_uuid( const GUID *uuid, LUID *luid, UINT32 *nod 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 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 ); extern NTSTATUS d3dkmt_destroy_resource( D3DKMT_HANDLE local ); diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index f393d6bd8b8..2568214bff0 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 38 +#define WINE_OPENGL_DRIVER_VERSION 39
struct opengl_drawable; struct wgl_context; @@ -120,6 +120,7 @@ struct opengl_funcs BOOL (*p_wglSetPixelFormatWINE)( HDC hdc, int format ); 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 ); #define USE_GL_FUNC(x) PFN_##x p_##x; ALL_EGL_FUNCS ALL_EGL_EXT_FUNCS