diff --git a/vrclient_x64/gen_wrapper.py b/vrclient_x64/gen_wrapper.py index 93605814..bc37342a 100755 --- a/vrclient_x64/gen_wrapper.py +++ b/vrclient_x64/gen_wrapper.py @@ -180,8 +180,8 @@ method_overrides = [ ] method_overrides_data = [ - ("IVRClientCore", "struct client_core_data"), - ("IVRCompositor", "struct compositor_data"), + ("IVRClientCore", "struct client_core_data", None), + ("IVRCompositor", "struct compositor_data", "destroy_compositor_data"), ] def display_sdkver(s): @@ -359,7 +359,7 @@ def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, e cfile.write(")") if is_method_overridden: cfile.write(", %s" % iface_version[iface_version.find("_") + 1:].lstrip("0")) - for classname_pattern, user_data_type in method_overrides_data: + for classname_pattern, user_data_type, _ in method_overrides_data: if classname_pattern in classname: cfile.write(", &_this->user_data") break @@ -448,7 +448,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(vrclient); cfile.write("typedef struct __%s {\n" % winclassname) cfile.write(" vtable_ptr *vtable;\n") cfile.write(" void *linux_side;\n") - for classname_pattern, user_data_type in method_overrides_data: + for classname_pattern, user_data_type, _ in method_overrides_data: if classname_pattern in classnode.spelling: cfile.write(" %s user_data;\n" % user_data_type) break @@ -477,6 +477,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(vrclient); cfile.write(" return r;\n}\n\n") cfile.write("void destroy_%s(void *object)\n{\n" % winclassname) cfile.write(" TRACE(\"%p\\n\", object);\n") + for classname_pattern, user_data_type, user_data_destructor in method_overrides_data: + if user_data_destructor and classname_pattern in classnode.spelling: + cfile.write(" struct __%s *win_object = object;\n" % winclassname) + cfile.write(" %s(&win_object->user_data);\n" % user_data_destructor) + break cfile.write(" HeapFree(GetProcessHeap(), 0, object);\n}\n\n") cpp.write("#ifdef __cplusplus\n}\n#endif\n") diff --git a/vrclient_x64/vrclient_main.c b/vrclient_x64/vrclient_main.c index 87e49250..10dc04a2 100644 --- a/vrclient_x64/vrclient_main.c +++ b/vrclient_x64/vrclient_main.c @@ -664,3 +664,17 @@ uint32_t ivrcompositor_get_vulkan_device_extensions_required( return cpp_func(linux_side, phys_dev, value, bufsize); } + +void destroy_compositor_data(struct compositor_data *data) +{ + IWineD3D11Device *wined3d_device; + + TRACE("%p\n", data); + + if ((wined3d_device = data->wined3d_device)) + { + TRACE("Waiting for device %p\n", wined3d_device); + + wined3d_device->lpVtbl->wait_idle(wined3d_device); + } +} diff --git a/vrclient_x64/vrclient_private.h b/vrclient_x64/vrclient_private.h index 6d68f3ce..922738a4 100644 --- a/vrclient_x64/vrclient_private.h +++ b/vrclient_x64/vrclient_private.h @@ -58,6 +58,8 @@ struct compositor_data IWineD3D11Device *wined3d_device; }; +void destroy_compositor_data(struct compositor_data *data); + EVRInitError ivrclientcore_002_init(EVRInitError (*cpp_func)(void *, EVRApplicationType), void *linux_side, EVRApplicationType application_type, unsigned int version, struct client_core_data *user_data); diff --git a/vrclient_x64/winIVRCompositor.c b/vrclient_x64/winIVRCompositor.c index 3cb1b454..64b8ed44 100644 --- a/vrclient_x64/winIVRCompositor.c +++ b/vrclient_x64/winIVRCompositor.c @@ -392,6 +392,8 @@ winIVRCompositor_IVRCompositor_022 *create_winIVRCompositor_IVRCompositor_022(vo void destroy_winIVRCompositor_IVRCompositor_022(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_022 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -771,6 +773,8 @@ winIVRCompositor_IVRCompositor_021 *create_winIVRCompositor_IVRCompositor_021(vo void destroy_winIVRCompositor_IVRCompositor_021(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_021 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -1134,6 +1138,8 @@ winIVRCompositor_IVRCompositor_020 *create_winIVRCompositor_IVRCompositor_020(vo void destroy_winIVRCompositor_IVRCompositor_020(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_020 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -1489,6 +1495,8 @@ winIVRCompositor_IVRCompositor_019 *create_winIVRCompositor_IVRCompositor_019(vo void destroy_winIVRCompositor_IVRCompositor_019(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_019 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -1828,6 +1836,8 @@ winIVRCompositor_IVRCompositor_018 *create_winIVRCompositor_IVRCompositor_018(vo void destroy_winIVRCompositor_IVRCompositor_018(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_018 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -2142,6 +2152,8 @@ winIVRCompositor_IVRCompositor_016 *create_winIVRCompositor_IVRCompositor_016(vo void destroy_winIVRCompositor_IVRCompositor_016(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_016 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -2472,6 +2484,8 @@ winIVRCompositor_IVRCompositor_015 *create_winIVRCompositor_IVRCompositor_015(vo void destroy_winIVRCompositor_IVRCompositor_015(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_015 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -2738,6 +2752,8 @@ winIVRCompositor_IVRCompositor_014 *create_winIVRCompositor_IVRCompositor_014(vo void destroy_winIVRCompositor_IVRCompositor_014(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_014 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -2988,6 +3004,8 @@ winIVRCompositor_IVRCompositor_013 *create_winIVRCompositor_IVRCompositor_013(vo void destroy_winIVRCompositor_IVRCompositor_013(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_013 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -3230,6 +3248,8 @@ winIVRCompositor_IVRCompositor_012 *create_winIVRCompositor_IVRCompositor_012(vo void destroy_winIVRCompositor_IVRCompositor_012(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_012 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -3456,6 +3476,8 @@ winIVRCompositor_IVRCompositor_011 *create_winIVRCompositor_IVRCompositor_011(vo void destroy_winIVRCompositor_IVRCompositor_011(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_011 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -3682,6 +3704,8 @@ winIVRCompositor_IVRCompositor_010 *create_winIVRCompositor_IVRCompositor_010(vo void destroy_winIVRCompositor_IVRCompositor_010(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_010 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -3908,6 +3932,8 @@ winIVRCompositor_IVRCompositor_009 *create_winIVRCompositor_IVRCompositor_009(vo void destroy_winIVRCompositor_IVRCompositor_009(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_009 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -4150,6 +4176,8 @@ winIVRCompositor_IVRCompositor_008 *create_winIVRCompositor_IVRCompositor_008(vo void destroy_winIVRCompositor_IVRCompositor_008(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_008 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -4336,6 +4364,8 @@ winIVRCompositor_IVRCompositor_007 *create_winIVRCompositor_IVRCompositor_007(vo void destroy_winIVRCompositor_IVRCompositor_007(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_007 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -4530,6 +4560,8 @@ winIVRCompositor_IVRCompositor_006 *create_winIVRCompositor_IVRCompositor_006(vo void destroy_winIVRCompositor_IVRCompositor_006(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_006 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } @@ -4756,6 +4788,8 @@ winIVRCompositor_IVRCompositor_005 *create_winIVRCompositor_IVRCompositor_005(vo void destroy_winIVRCompositor_IVRCompositor_005(void *object) { TRACE("%p\n", object); + struct __winIVRCompositor_IVRCompositor_005 *win_object = object; + destroy_compositor_data(&win_object->user_data); HeapFree(GetProcessHeap(), 0, object); } diff --git a/wine b/wine index 1b8c5cf0..eb514943 160000 --- a/wine +++ b/wine @@ -1 +1 @@ -Subproject commit 1b8c5cf02b12c586f7a3a98530f25300113a8a5d +Subproject commit eb514943de9f0cb91dcde6c8d543c4fb2bdf7c3e