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:
parent
ef2908462d
commit
d8782a9b8e
3 changed files with 21 additions and 52 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue