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.
This commit is contained in:
Zebediah Figura 2023-11-24 22:52:41 -06:00 committed by Alexandre Julliard
parent ef2908462d
commit d8782a9b8e
3 changed files with 21 additions and 52 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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;