Module: wine
Branch: master
Commit: d8782a9b8ec2d5c41280a249570b5df88e51d3a2
URL: https://gitlab.winehq.org/wine/wine/-/commit/d8782a9b8ec2d5c41280a249570b5d…
Author: Zebediah Figura <zfigura(a)codeweavers.com>
Date: Fri Nov 24 22:52:41 2023 -0600
wined3d: Release the view's resource after destroying the view.
Allow us to avoid grabbing a temporary reference. This becomes a problem with
the next patch, where we would otherwise grab a reference while a texture is
being destroyed, and hence destroy it twice.
---
dlls/wined3d/adapter_gl.c | 20 --------------------
dlls/wined3d/adapter_vk.c | 20 --------------------
dlls/wined3d/view.c | 33 +++++++++++++++++++++------------
3 files changed, 21 insertions(+), 52 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index a103fbe1107..4bc7312ea8f 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4920,12 +4920,8 @@ static void adapter_gl_destroy_rendertarget_view(struct wined3d_rendertarget_vie
TRACE("view_gl %p.\n", view_gl);
- /* Take a reference to the resource, in case releasing the resource
- * would cause the device to be destroyed. */
- wined3d_resource_incref(resource);
wined3d_rendertarget_view_cleanup(&view_gl->v);
wined3d_view_gl_destroy(resource->device, &view_gl->gl_view, NULL, NULL, view_gl);
- wined3d_resource_decref(resource);
}
static HRESULT adapter_gl_create_shader_resource_view(const struct wined3d_view_desc *desc,
@@ -4961,16 +4957,8 @@ static void adapter_gl_destroy_shader_resource_view(struct wined3d_shader_resour
TRACE("view_gl %p.\n", view_gl);
- /* Take a reference to the resource. There are two reasons for this:
- * - Releasing the resource could in turn cause the device to be
- * destroyed, but we still need the device for
- * wined3d_view_vk_destroy().
- * - We shouldn't free buffer resources until after we've removed the
- * view from its bo_user list. */
- wined3d_resource_incref(resource);
wined3d_shader_resource_view_cleanup(&view_gl->v);
wined3d_view_gl_destroy(resource->device, &view_gl->gl_view, &view_gl->bo_user, NULL, view_gl);
- wined3d_resource_decref(resource);
}
static HRESULT adapter_gl_create_unordered_access_view(const struct wined3d_view_desc *desc,
@@ -5006,16 +4994,8 @@ static void adapter_gl_destroy_unordered_access_view(struct wined3d_unordered_ac
TRACE("view_gl %p.\n", view_gl);
- /* Take a reference to the resource. There are two reasons for this:
- * - Releasing the resource could in turn cause the device to be
- * destroyed, but we still need the device for
- * wined3d_view_vk_destroy().
- * - We shouldn't free buffer resources until after we've removed the
- * view from its bo_user list. */
- wined3d_resource_incref(resource);
wined3d_unordered_access_view_cleanup(&view_gl->v);
wined3d_view_gl_destroy(resource->device, &view_gl->gl_view, &view_gl->bo_user, &view_gl->counter_bo, view_gl);
- wined3d_resource_decref(resource);
}
static HRESULT adapter_gl_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 96eeeb3472a..d6f4449ce06 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1522,13 +1522,9 @@ static void adapter_vk_destroy_rendertarget_view(struct wined3d_rendertarget_vie
TRACE("view_vk %p.\n", view_vk);
- /* Take a reference to the resource, in case releasing the resource
- * would cause the device to be destroyed. */
- wined3d_resource_incref(resource);
wined3d_rendertarget_view_cleanup(&view_vk->v);
wined3d_view_vk_destroy(resource->device, NULL, &view_vk->vk_image_view,
NULL, NULL, NULL, &view_vk->command_buffer_id, view_vk);
- wined3d_resource_decref(resource);
}
static HRESULT adapter_vk_create_shader_resource_view(const struct wined3d_view_desc *desc,
@@ -1567,13 +1563,6 @@ static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resour
TRACE("srv_vk %p.\n", srv_vk);
- /* Take a reference to the resource. There are two reasons for this:
- * - Releasing the resource could in turn cause the device to be
- * destroyed, but we still need the device for
- * wined3d_view_vk_destroy().
- * - We shouldn't free buffer resources until after we've removed the
- * view from its bo_user list. */
- wined3d_resource_incref(resource);
if (resource->type == WINED3D_RTYPE_BUFFER)
vk_buffer_view = &view_vk->u.vk_buffer_view;
else
@@ -1581,7 +1570,6 @@ static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resour
wined3d_shader_resource_view_cleanup(&srv_vk->v);
wined3d_view_vk_destroy(resource->device, vk_buffer_view, vk_image_view,
&view_vk->bo_user, NULL, NULL, &view_vk->command_buffer_id, srv_vk);
- wined3d_resource_decref(resource);
}
static HRESULT adapter_vk_create_unordered_access_view(const struct wined3d_view_desc *desc,
@@ -1620,13 +1608,6 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
TRACE("uav_vk %p.\n", uav_vk);
- /* Take a reference to the resource. There are two reasons for this:
- * - Releasing the resource could in turn cause the device to be
- * destroyed, but we still need the device for
- * wined3d_view_vk_destroy().
- * - We shouldn't free buffer resources until after we've removed the
- * view from its bo_user list. */
- wined3d_resource_incref(resource);
if (resource->type == WINED3D_RTYPE_BUFFER)
vk_buffer_view = &view_vk->u.vk_buffer_view;
else
@@ -1634,7 +1615,6 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
wined3d_unordered_access_view_cleanup(&uav_vk->v);
wined3d_view_vk_destroy(resource->device, vk_buffer_view, vk_image_view, &view_vk->bo_user,
&uav_vk->counter_bo, &uav_vk->vk_counter_view, &view_vk->command_buffer_id, uav_vk);
- wined3d_resource_decref(resource);
}
static HRESULT adapter_vk_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 4b0ccea7bb2..76b6e66b82e 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -373,10 +373,7 @@ ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *v
void wined3d_rendertarget_view_cleanup(struct wined3d_rendertarget_view *view)
{
- /* Call wined3d_object_destroyed() before releasing the resource,
- * since releasing the resource may end up destroying the parent. */
view->parent_ops->wined3d_object_destroyed(view->parent);
- wined3d_resource_decref(view->resource);
}
ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *view)
@@ -387,9 +384,14 @@ ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *v
if (!refcount)
{
+ struct wined3d_resource *resource = view->resource;
+
+ /* Release the resource after destroying the view.
+ * See wined3d_shader_resource_view_decref(). */
wined3d_mutex_lock();
- view->resource->device->adapter->adapter_ops->adapter_destroy_rendertarget_view(view);
+ resource->device->adapter->adapter_ops->adapter_destroy_rendertarget_view(view);
wined3d_mutex_unlock();
+ wined3d_resource_decref(resource);
}
return refcount;
@@ -966,10 +968,7 @@ ULONG CDECL wined3d_shader_resource_view_incref(struct wined3d_shader_resource_v
void wined3d_shader_resource_view_cleanup(struct wined3d_shader_resource_view *view)
{
- /* Call wined3d_object_destroyed() before releasing the resource,
- * since releasing the resource may end up destroying the parent. */
view->parent_ops->wined3d_object_destroyed(view->parent);
- wined3d_resource_decref(view->resource);
}
ULONG CDECL wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view *view)
@@ -980,9 +979,17 @@ ULONG CDECL wined3d_shader_resource_view_decref(struct wined3d_shader_resource_v
if (!refcount)
{
+ struct wined3d_resource *resource = view->resource;
+
+ /* Release the resource after destroying the view:
+ * - adapter_destroy_shader_resource_view() needs a reference to the
+ * device, which the resource implicitly provides.
+ * - We shouldn't free buffer resources until after we've removed the
+ * view from its bo_user list. */
wined3d_mutex_lock();
- view->resource->device->adapter->adapter_ops->adapter_destroy_shader_resource_view(view);
+ resource->device->adapter->adapter_ops->adapter_destroy_shader_resource_view(view);
wined3d_mutex_unlock();
+ wined3d_resource_decref(resource);
}
return refcount;
@@ -1511,10 +1518,7 @@ ULONG CDECL wined3d_unordered_access_view_incref(struct wined3d_unordered_access
void wined3d_unordered_access_view_cleanup(struct wined3d_unordered_access_view *view)
{
- /* Call wined3d_object_destroyed() before releasing the resource,
- * since releasing the resource may end up destroying the parent. */
view->parent_ops->wined3d_object_destroyed(view->parent);
- wined3d_resource_decref(view->resource);
}
ULONG CDECL wined3d_unordered_access_view_decref(struct wined3d_unordered_access_view *view)
@@ -1525,9 +1529,14 @@ ULONG CDECL wined3d_unordered_access_view_decref(struct wined3d_unordered_access
if (!refcount)
{
+ struct wined3d_resource *resource = view->resource;
+
+ /* Release the resource after destroying the view.
+ * See wined3d_shader_resource_view_decref(). */
wined3d_mutex_lock();
- view->resource->device->adapter->adapter_ops->adapter_destroy_unordered_access_view(view);
+ resource->device->adapter->adapter_ops->adapter_destroy_unordered_access_view(view);
wined3d_mutex_unlock();
+ wined3d_resource_decref(resource);
}
return refcount;