From: Riccardo Bortolato Subject: [v9 05/11] ddraw: Do refcounting only through wined3d_texture_{inc, dec}ref(). Message-Id: <1447961687-4042-5-git-send-email-rikyz619@gmail.com> Date: Thu, 19 Nov 2015 20:34:41 +0100 In-Reply-To: <1447961687-4042-1-git-send-email-rikyz619@gmail.com> References: <1447961687-4042-1-git-send-email-rikyz619@gmail.com> Store in every ddraw_surface a wined3d_texture and the corresponding sub_resource_index. Signed-off-by: Riccardo Bortolato --- dlls/ddraw/ddraw.c | 2 +- dlls/ddraw/ddraw_private.h | 4 +++- dlls/ddraw/surface.c | 25 ++++++++++++++----------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 41048fa..7a257ca 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -4736,7 +4736,7 @@ static HRESULT CDECL device_parent_surface_created(struct wined3d_device_parent return DDERR_OUTOFVIDEOMEMORY; } - ddraw_surface_init(ddraw_surface, ddraw, wined3d_texture_get_parent(wined3d_texture), surface, parent_ops); + ddraw_surface_init(ddraw_surface, ddraw, wined3d_texture, sub_resource_idx, surface, parent_ops); *parent = ddraw_surface; list_add_head(&ddraw->surface_list, &ddraw_surface->surface_list_entry); diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 7c50031..38699b4 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -161,6 +161,7 @@ struct ddraw_surface struct ddraw *ddraw; struct wined3d_surface *wined3d_surface; struct wined3d_texture *wined3d_texture; + unsigned int sub_resource_idx; struct wined3d_rendertarget_view *wined3d_rtv; struct wined3d_private_store private_store; struct d3d_device *device1; @@ -206,7 +207,8 @@ struct ddraw_texture HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_desc, struct ddraw_surface **surface, IUnknown *outer_unknown, unsigned int version) DECLSPEC_HIDDEN; struct wined3d_rendertarget_view *ddraw_surface_get_rendertarget_view(struct ddraw_surface *surface) DECLSPEC_HIDDEN; -void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, struct ddraw_texture *texture, +void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, + struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, struct wined3d_surface *wined3d_surface, const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; ULONG ddraw_surface_release_iface(struct ddraw_surface *This) DECLSPEC_HIDDEN; HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface, diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index cad415c..eeedbaf 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -326,10 +326,7 @@ static void ddraw_surface_add_iface(struct ddraw_surface *surface) wined3d_mutex_lock(); if (surface->wined3d_rtv) wined3d_rendertarget_view_incref(surface->wined3d_rtv); - if (surface->wined3d_surface) - wined3d_surface_incref(surface->wined3d_surface); - if (surface->wined3d_texture) - wined3d_texture_incref(surface->wined3d_texture); + wined3d_texture_incref(surface->wined3d_texture); wined3d_mutex_unlock(); } } @@ -532,10 +529,9 @@ static void ddraw_surface_cleanup(struct ddraw_surface *surface) if (surface->wined3d_rtv) wined3d_rendertarget_view_decref(surface->wined3d_rtv); - if (surface->wined3d_texture) + wined3d_texture_decref(surface->wined3d_texture); + if (surface->sub_resource_idx == 0) wined3d_texture_decref(surface->wined3d_texture); - if (surface->wined3d_surface) - wined3d_surface_decref(surface->wined3d_surface); } ULONG ddraw_surface_release_iface(struct ddraw_surface *This) @@ -1227,6 +1223,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 struct wined3d_texture *texture; IDirectDrawSurface7 *current; struct wined3d_surface *tmp; + unsigned int tmp_idx; HRESULT hr; TRACE("iface %p, src %p, flags %#x.\n", iface, src, flags); @@ -1242,6 +1239,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 tmp_rtv = ddraw_surface_get_rendertarget_view(dst_impl); tmp = dst_impl->wined3d_surface; texture = dst_impl->wined3d_texture; + tmp_idx = dst_impl->sub_resource_idx; rtv = wined3d_device_get_rendertarget_view(dst_impl->ddraw->wined3d_device, 0); ddraw_texture = wined3d_texture_get_parent(dst_impl->wined3d_texture); @@ -1274,6 +1272,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 prev_ddraw_texture = wined3d_texture_get_parent(src_impl->wined3d_texture); wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture), ddraw_texture); dst_impl->wined3d_texture = src_impl->wined3d_texture; + dst_impl->sub_resource_idx = src_impl->sub_resource_idx; ddraw_texture = prev_ddraw_texture; } else @@ -1305,6 +1304,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture), ddraw_texture); ddraw_texture = prev_ddraw_texture; dst_impl->wined3d_texture = src_impl->wined3d_texture; + dst_impl->sub_resource_idx = src_impl->sub_resource_idx; dst_impl = src_impl; } } @@ -1319,6 +1319,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 src_impl->wined3d_surface = tmp; wined3d_resource_set_parent(wined3d_texture_get_resource(texture), ddraw_texture); src_impl->wined3d_texture = texture; + src_impl->sub_resource_idx = tmp_idx; if (flags) { @@ -6080,7 +6081,6 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_ resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); root = wined3d_resource_get_parent(resource); - root->wined3d_texture = wined3d_texture; root->is_complex_root = TRUE; texture->root = root; @@ -6192,7 +6192,6 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_ resource = wined3d_texture_get_sub_resource(wined3d_texture, 0); last = wined3d_resource_get_parent(resource); - last->wined3d_texture = wined3d_texture; texture->root = last; if (desc->dwFlags & DDSD_CKDESTOVERLAY) @@ -6231,9 +6230,11 @@ fail: return hr; } -void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, struct ddraw_texture *texture, +void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, + struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, struct wined3d_surface *wined3d_surface, const struct wined3d_parent_ops **parent_ops) { + struct ddraw_texture *texture = wined3d_texture_get_parent(wined3d_texture); DDSURFACEDESC2 *desc = &surface->surface_desc; struct wined3d_resource_desc wined3d_desc; unsigned int version = texture->version; @@ -6290,8 +6291,10 @@ void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, stru } desc->lpSurface = NULL; - wined3d_surface_incref(wined3d_surface); + wined3d_texture_incref(wined3d_texture); surface->wined3d_surface = wined3d_surface; + surface->wined3d_texture = wined3d_texture; + surface->sub_resource_idx = sub_resource_idx; *parent_ops = &ddraw_surface_wined3d_parent_ops; wined3d_private_store_init(&surface->private_store); -- 1.9.1