d3d9: Hold a reference to the wined3d swapchain from d3d9 swapchain surfaces.

This commit is contained in:
Zebediah Figura 2023-04-07 17:44:50 -05:00 committed by Alexandre Julliard
parent eae8705184
commit f97163f4ea
2 changed files with 8 additions and 0 deletions

View file

@ -176,6 +176,7 @@ struct d3d9_surface
IDirect3DDevice9Ex *parent_device;
IUnknown *container;
struct d3d9_texture *texture;
struct wined3d_swapchain *swapchain;
};
struct wined3d_rendertarget_view *d3d9_surface_acquire_rendertarget_view(struct d3d9_surface *surface) DECLSPEC_HIDDEN;

View file

@ -70,6 +70,8 @@ static ULONG WINAPI d3d9_surface_AddRef(IDirect3DSurface9 *iface)
if (surface->wined3d_rtv)
wined3d_rendertarget_view_incref(surface->wined3d_rtv);
wined3d_texture_incref(surface->wined3d_texture);
if (surface->swapchain)
wined3d_swapchain_incref(surface->swapchain);
}
return refcount;
@ -103,6 +105,10 @@ static ULONG WINAPI d3d9_surface_Release(IDirect3DSurface9 *iface)
if (surface->wined3d_rtv)
wined3d_rendertarget_view_decref(surface->wined3d_rtv);
if (surface->swapchain)
wined3d_swapchain_decref(surface->swapchain);
/* Releasing the texture may free the d3d9 object, so do not access it
* after releasing the texture. */
wined3d_texture_decref(surface->wined3d_texture);
/* Release the device last, as it may cause the device to be destroyed. */
@ -363,6 +369,7 @@ struct d3d9_surface *d3d9_surface_create(struct wined3d_texture *wined3d_texture
surface->container = container;
surface->wined3d_texture = wined3d_texture;
surface->sub_resource_idx = sub_resource_idx;
surface->swapchain = wined3d_texture_get_swapchain(wined3d_texture);
if (surface->container && SUCCEEDED(IUnknown_QueryInterface(surface->container,
&IID_IDirect3DBaseTexture9, (void **)&texture)))