static ULONG WINAPI d3d9_volume_Release(IDirect3DVolume9 *iface) { struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface); TRACE("iface %p.\n", iface); TRACE("Forwarding to %p.\n", volume->texture); return IDirect3DBaseTexture9_Release(&volume->texture->IDirect3DBaseTexture9_iface); }
void surface_init(struct d3d9_surface *surface, struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, struct wined3d_surface *wined3d_surface, const struct wined3d_parent_ops **parent_ops) { struct wined3d_resource_desc desc; IDirect3DBaseTexture9 *texture; surface->IDirect3DSurface9_iface.lpVtbl = &d3d9_surface_vtbl; d3d9_resource_init(&surface->resource); surface->resource.refcount = 0; surface->wined3d_surface = wined3d_surface; list_init(&surface->rtv_entry); surface->container = wined3d_texture_get_parent(wined3d_texture); surface->wined3d_texture = wined3d_texture; surface->sub_resource_idx = sub_resource_idx; if (surface->container && SUCCEEDED(IUnknown_QueryInterface(surface->container, &IID_IDirect3DBaseTexture9, (void **)&texture))) { surface->texture = unsafe_impl_from_IDirect3DBaseTexture9(texture); IDirect3DBaseTexture9_Release(texture); } wined3d_resource_get_desc(wined3d_texture_get_resource(wined3d_texture), &desc); switch (d3dformat_from_wined3dformat(desc.format)) { case D3DFMT_A8R8G8B8: case D3DFMT_X8R8G8B8: case D3DFMT_R5G6B5: case D3DFMT_X1R5G5B5: case D3DFMT_A1R5G5B5: case D3DFMT_R8G8B8: surface->getdc_supported = TRUE; break; default: surface->getdc_supported = FALSE; break; } *parent_ops = &d3d9_surface_wined3d_parent_ops; }
static ULONG WINAPI d3d9_surface_Release(IDirect3DSurface9 *iface) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); ULONG refcount; TRACE("iface %p.\n", iface); if (surface->texture) { TRACE("Forwarding to %p.\n", surface->texture); return IDirect3DBaseTexture9_Release(&surface->texture->IDirect3DBaseTexture9_iface); } if (!surface->resource.refcount) { ERR("Surface doesn't have any references.\n"); return 0; } refcount = InterlockedDecrement(&surface->resource.refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { IDirect3DDevice9Ex *parent_device = surface->parent_device; wined3d_mutex_lock(); if (surface->wined3d_rtv) wined3d_rendertarget_view_decref(surface->wined3d_rtv); wined3d_surface_decref(surface->wined3d_surface); wined3d_mutex_unlock(); /* Release the device last, as it may cause the device to be destroyed. */ if (parent_device) IDirect3DDevice9Ex_Release(parent_device); } return refcount; }