From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 6 ++ dlls/opengl32/unix_thunks.c | 130 +++--------------------- dlls/opengl32/unix_wgl.c | 194 +++++++++++++++++++++++++++++++++++- 3 files changed, 211 insertions(+), 119 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 6748350529c..6c1ab65fb7b 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -169,7 +169,13 @@ my %manual_win_thunks = ); my %manual_wow64_thunks = ( + "glClientWaitSync" => 1, + "glDeleteSync" => 1, + "glFenceSync" => 1, + "glGetSynciv" => 1, + "glIsSync" => 1, "glPathGlyphIndexRangeNV" => 1, + "glWaitSync" => 1, "wglCreateContext" => 1, "wglCreateContextAttribsARB" => 1, "wglCreatePbufferARB" => 1, diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index f00ae443216..c5e4aedbc6a 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -4146,7 +4146,7 @@ static NTSTATUS ext_glClientWaitSemaphoreui64NVX( void *args ) return STATUS_SUCCESS; }
-static NTSTATUS ext_glClientWaitSync( void *args ) +NTSTATUS ext_glClientWaitSync( void *args ) { struct glClientWaitSync_params *params = args; const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; @@ -5746,7 +5746,7 @@ static NTSTATUS ext_glDeleteStatesNV( void *args ) return STATUS_SUCCESS; }
-static NTSTATUS ext_glDeleteSync( void *args ) +NTSTATUS ext_glDeleteSync( void *args ) { struct glDeleteSync_params *params = args; const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; @@ -6656,7 +6656,7 @@ static NTSTATUS ext_glFeedbackBufferxOES( void *args ) return STATUS_SUCCESS; }
-static NTSTATUS ext_glFenceSync( void *args ) +NTSTATUS ext_glFenceSync( void *args ) { struct glFenceSync_params *params = args; const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; @@ -9803,7 +9803,7 @@ static NTSTATUS ext_glGetSubroutineUniformLocation( void *args ) return STATUS_SUCCESS; }
-static NTSTATUS ext_glGetSynciv( void *args ) +NTSTATUS ext_glGetSynciv( void *args ) { struct glGetSynciv_params *params = args; const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; @@ -11555,7 +11555,7 @@ static NTSTATUS ext_glIsStateNV( void *args ) return STATUS_SUCCESS; }
-static NTSTATUS ext_glIsSync( void *args ) +NTSTATUS ext_glIsSync( void *args ) { struct glIsSync_params *params = args; const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; @@ -23465,7 +23465,7 @@ static NTSTATUS ext_glWaitSemaphoreui64NVX( void *args ) return STATUS_SUCCESS; }
-static NTSTATUS ext_glWaitSync( void *args ) +NTSTATUS ext_glWaitSync( void *args ) { struct glWaitSync_params *params = args; const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; @@ -31187,27 +31187,6 @@ static NTSTATUS wow64_ext_glClientWaitSemaphoreui64NVX( void *args ) return status; }
-static NTSTATUS wow64_ext_glClientWaitSync( void *args ) -{ - struct - { - PTR32 sync; - GLbitfield flags; - GLuint64 timeout; - GLenum ret; - } *params32 = args; - struct glClientWaitSync_params params = - { - .sync = ULongToPtr(params32->sync), - .flags = params32->flags, - .timeout = params32->timeout, - }; - NTSTATUS status; - status = ext_glClientWaitSync( ¶ms ); - params32->ret = params.ret; - return status; -} - static NTSTATUS wow64_ext_glClipPlanefOES( void *args ) { struct @@ -33887,21 +33866,6 @@ static NTSTATUS wow64_ext_glDeleteStatesNV( void *args ) return status; }
-static NTSTATUS wow64_ext_glDeleteSync( void *args ) -{ - struct - { - PTR32 sync; - } *params32 = args; - struct glDeleteSync_params params = - { - .sync = ULongToPtr(params32->sync), - }; - NTSTATUS status; - status = ext_glDeleteSync( ¶ms ); - return status; -} - static NTSTATUS wow64_ext_glDeleteTexturesEXT( void *args ) { struct @@ -34677,23 +34641,6 @@ static NTSTATUS wow64_ext_glFeedbackBufferxOES( void *args ) return status; }
-static NTSTATUS wow64_ext_glFenceSync( void *args ) -{ - struct - { - GLenum condition; - GLbitfield flags; - PTR32 ret; - } *params32 = args; - struct glFenceSync_params params = - { - .condition = params32->condition, - .flags = params32->flags, - }; - FIXME( "params32 %p, params %p stub!\n", params32, ¶ms ); - return STATUS_NOT_IMPLEMENTED; -} - static NTSTATUS wow64_ext_glFinishAsyncSGIX( void *args ) { struct @@ -41149,29 +41096,6 @@ static NTSTATUS wow64_ext_glGetSubroutineUniformLocation( void *args ) return status; }
-static NTSTATUS wow64_ext_glGetSynciv( void *args ) -{ - struct - { - PTR32 sync; - GLenum pname; - GLsizei count; - PTR32 length; - PTR32 values; - } *params32 = args; - struct glGetSynciv_params params = - { - .sync = ULongToPtr(params32->sync), - .pname = params32->pname, - .count = params32->count, - .length = ULongToPtr(params32->length), - .values = ULongToPtr(params32->values), - }; - NTSTATUS status; - status = ext_glGetSynciv( ¶ms ); - return status; -} - static NTSTATUS wow64_ext_glGetTexBumpParameterfvATI( void *args ) { struct @@ -44317,23 +44241,6 @@ static NTSTATUS wow64_ext_glIsNamedStringARB( void *args ) return status; }
-static NTSTATUS wow64_ext_glIsSync( void *args ) -{ - struct - { - PTR32 sync; - GLboolean ret; - } *params32 = args; - struct glIsSync_params params = - { - .sync = ULongToPtr(params32->sync), - }; - NTSTATUS status; - status = ext_glIsSync( ¶ms ); - params32->ret = params.ret; - return status; -} - static NTSTATUS wow64_ext_glLGPUNamedBufferSubDataNVX( void *args ) { struct @@ -59995,25 +59902,6 @@ static NTSTATUS wow64_ext_glWaitSemaphoreui64NVX( void *args ) return status; }
-static NTSTATUS wow64_ext_glWaitSync( void *args ) -{ - struct - { - PTR32 sync; - GLbitfield flags; - GLuint64 timeout; - } *params32 = args; - struct glWaitSync_params params = - { - .sync = ULongToPtr(params32->sync), - .flags = params32->flags, - .timeout = params32->timeout, - }; - NTSTATUS status; - status = ext_glWaitSync( ¶ms ); - return status; -} - static NTSTATUS wow64_ext_glWeightPathsNV( void *args ) { struct @@ -61002,7 +60890,13 @@ extern NTSTATUS wow64_wgl_wglCreateContext( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_wgl_wglDeleteContext( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_wgl_wglGetProcAddress( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_wgl_wglMakeCurrent( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_ext_glClientWaitSync( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_ext_glDeleteSync( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_ext_glFenceSync( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_ext_glGetSynciv( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_ext_glIsSync( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_ext_glPathGlyphIndexRangeNV( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS wow64_ext_glWaitSync( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_ext_wglCreateContextAttribsARB( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_ext_wglCreatePbufferARB( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS wow64_ext_wglGetPbufferDCARB( void *args ) DECLSPEC_HIDDEN; diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 8bf15b47bfe..b53c754be50 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -52,7 +52,8 @@ enum wgl_handle_type HANDLE_PBUFFER = 0 << 12, HANDLE_CONTEXT = 1 << 12, HANDLE_CONTEXT_V3 = 3 << 12, - HANDLE_TYPE_MASK = 15 << 12 + HANDLE_GLSYNC = 4 << 12, + HANDLE_TYPE_MASK = 15 << 12, };
struct opengl_context @@ -1058,7 +1059,13 @@ NTSTATUS WINAPI thread_attach( void *args )
typedef ULONG PTR32;
+extern NTSTATUS ext_glClientWaitSync( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS ext_glDeleteSync( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS ext_glFenceSync( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS ext_glGetSynciv( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS ext_glIsSync( void *args ) DECLSPEC_HIDDEN; extern NTSTATUS ext_glPathGlyphIndexRangeNV( void *args ) DECLSPEC_HIDDEN; +extern NTSTATUS ext_glWaitSync( void *args ) DECLSPEC_HIDDEN;
static inline void update_teb32_context(void) { @@ -1254,4 +1261,189 @@ NTSTATUS wow64_ext_glPathGlyphIndexRangeNV( void *args ) return status; }
+NTSTATUS wow64_ext_glClientWaitSync( void *args ) +{ + struct wgl_handle *handle; + struct + { + PTR32 sync; + GLbitfield flags; + GLuint64 timeout; + GLenum ret; + } *params32 = args; + NTSTATUS status; + + pthread_mutex_lock( &wgl_lock ); + + if (!(handle = get_handle_ptr( ULongToPtr(params32->sync), HANDLE_GLSYNC ))) + status = STATUS_INVALID_HANDLE; + else + { + struct glClientWaitSync_params params = + { + .sync = (GLsync)handle->u.context, + .flags = params32->flags, + .timeout = params32->timeout, + }; + status = ext_glClientWaitSync( ¶ms ); + params32->ret = params.ret; + } + + pthread_mutex_unlock( &wgl_lock ); + return status; +} + +NTSTATUS wow64_ext_glDeleteSync( void *args ) +{ + struct wgl_handle *handle; + struct + { + PTR32 sync; + } *params32 = args; + NTSTATUS status; + + pthread_mutex_lock( &wgl_lock ); + + if (!(handle = get_handle_ptr( ULongToPtr(params32->sync), HANDLE_GLSYNC ))) + status = STATUS_INVALID_HANDLE; + else + { + struct glDeleteSync_params params = + { + .sync = (GLsync)handle->u.context, + }; + status = ext_glDeleteSync( ¶ms ); + free_handle_ptr( handle ); + } + + pthread_mutex_unlock( &wgl_lock ); + return status; +} + +NTSTATUS wow64_ext_glFenceSync( void *args ) +{ + struct + { + GLenum condition; + GLbitfield flags; + PTR32 ret; + } *params32 = args; + struct glFenceSync_params params = + { + .condition = params32->condition, + .flags = params32->flags, + }; + NTSTATUS status; + + if ((status = ext_glFenceSync( ¶ms ))) return status; + + pthread_mutex_lock( &wgl_lock ); + + if (!(params32->ret = (UINT_PTR)alloc_handle( HANDLE_GLSYNC, NULL, params.ret ))) + { + struct glDeleteSync_params delete_params = + { + .sync = params.ret, + }; + + ext_glDeleteSync( &delete_params ); + status = STATUS_NO_MEMORY; + } + + pthread_mutex_unlock( &wgl_lock ); + return status; +} + +NTSTATUS wow64_ext_glGetSynciv( void *args ) +{ + struct wgl_handle *handle; + struct + { + PTR32 sync; + GLenum pname; + GLsizei count; + PTR32 length; + PTR32 values; + } *params32 = args; + NTSTATUS status; + + pthread_mutex_lock( &wgl_lock ); + + if (!(handle = get_handle_ptr( ULongToPtr(params32->sync), HANDLE_GLSYNC ))) + status = STATUS_INVALID_HANDLE; + else + { + struct glGetSynciv_params params = + { + .sync = (GLsync)handle->u.context, + .pname = params32->pname, + .count = params32->count, + .length = ULongToPtr(params32->length), + .values = ULongToPtr(params32->values), + }; + status = ext_glGetSynciv( ¶ms ); + } + + pthread_mutex_unlock( &wgl_lock ); + return status; +} + +NTSTATUS wow64_ext_glIsSync( void *args ) +{ + struct wgl_handle *handle; + struct + { + PTR32 sync; + GLboolean ret; + } *params32 = args; + NTSTATUS status; + + pthread_mutex_lock( &wgl_lock ); + + if (!(handle = get_handle_ptr( ULongToPtr(params32->sync), HANDLE_GLSYNC ))) + status = STATUS_INVALID_HANDLE; + else + { + struct glIsSync_params params = + { + .sync = (GLsync)handle->u.context, + }; + status = ext_glIsSync( ¶ms ); + params32->ret = params.ret; + } + + pthread_mutex_unlock( &wgl_lock ); + return status; +} + +NTSTATUS wow64_ext_glWaitSync( void *args ) +{ + struct wgl_handle *handle; + struct + { + PTR32 sync; + GLbitfield flags; + GLuint64 timeout; + } *params32 = args; + NTSTATUS status; + + pthread_mutex_lock( &wgl_lock ); + + if (!(handle = get_handle_ptr( ULongToPtr(params32->sync), HANDLE_GLSYNC ))) + status = STATUS_INVALID_HANDLE; + else + { + struct glWaitSync_params params = + { + .sync = (GLsync)handle->u.context, + .flags = params32->flags, + .timeout = params32->timeout, + }; + status = ext_glWaitSync( ¶ms ); + } + + pthread_mutex_unlock( &wgl_lock ); + return status; +} + #endif