Module: wine Branch: master Commit: d8782a9b8ec2d5c41280a249570b5df88e51d3a2 URL: https://gitlab.winehq.org/wine/wine/-/commit/d8782a9b8ec2d5c41280a249570b5df...
Author: Zebediah Figura zfigura@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;