mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-02-04 01:30:36 +03:00
vrclient: Wait for pending command stream operations before IVRClientCore::Cleanup()
Command stream callbacks may try to access VR client objects.
This commit is contained in:
parent
a1031dbce4
commit
bd96c106ce
@ -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")
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
2
wine
2
wine
@ -1 +1 @@
|
||||
Subproject commit 1b8c5cf02b12c586f7a3a98530f25300113a8a5d
|
||||
Subproject commit eb514943de9f0cb91dcde6c8d543c4fb2bdf7c3e
|
Loading…
x
Reference in New Issue
Block a user