static ULONG WINAPI IDirect3DSurface9Impl_AddRef(IDirect3DSurface9 *iface) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); TRACE("iface %p.\n", iface); if (This->forwardReference) { /* Forward refcounting */ TRACE("(%p) : Forwarding to %p\n", This, This->forwardReference); return IUnknown_AddRef(This->forwardReference); } else { /* No container, handle our own refcounting */ ULONG ref = InterlockedIncrement(&This->ref); TRACE("%p increasing refcount to %u.\n", iface, ref); if (ref == 1) { if (This->parentDevice) IDirect3DDevice9Ex_AddRef(This->parentDevice); wined3d_mutex_lock(); wined3d_surface_incref(This->wined3d_surface); wined3d_mutex_unlock(); } return ref; } }
HRESULT CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT back_buffer_idx, enum wined3d_backbuffer_type type, struct wined3d_surface **back_buffer) { TRACE("swapchain %p, back_buffer_idx %u, type %#x, back_buffer %p.\n", swapchain, back_buffer_idx, type, back_buffer); /* Return invalid if there is no backbuffer array, otherwise it will * crash when ddraw is used (there swapchain->back_buffers is always * NULL). We need this because this function is called from * stateblock_init_default_state() to get the default scissorrect * dimensions. */ if (!swapchain->back_buffers || back_buffer_idx >= swapchain->desc.backbuffer_count) { WARN("Invalid back buffer index.\n"); /* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it * here in wined3d to avoid problems in other libs. */ *back_buffer = NULL; return WINED3DERR_INVALIDCALL; } *back_buffer = swapchain->back_buffers[back_buffer_idx]; if (*back_buffer) wined3d_surface_incref(*back_buffer); TRACE("Returning back buffer %p.\n", *back_buffer); return WINED3D_OK; }
static ULONG WINAPI d3d9_surface_AddRef(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_AddRef(&surface->texture->IDirect3DBaseTexture9_iface); } refcount = InterlockedIncrement(&surface->resource.refcount); TRACE("%p increasing refcount to %u.\n", iface, refcount); if (refcount == 1) { if (surface->parent_device) IDirect3DDevice9Ex_AddRef(surface->parent_device); wined3d_mutex_lock(); if (surface->wined3d_rtv) wined3d_rendertarget_view_incref(surface->wined3d_rtv); wined3d_surface_incref(surface->wined3d_surface); wined3d_mutex_unlock(); } return refcount; }
static ULONG WINAPI d3d9_surface_AddRef(IDirect3DSurface9 *iface) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); ULONG refcount; TRACE("iface %p.\n", iface); if (surface->forwardReference) { TRACE("Forwarding to %p.\n", surface->forwardReference); return IUnknown_AddRef(surface->forwardReference); } refcount = InterlockedIncrement(&surface->refcount); TRACE("%p increasing refcount to %u.\n", iface, refcount); if (refcount == 1) { if (surface->parent_device) IDirect3DDevice9Ex_AddRef(surface->parent_device); wined3d_mutex_lock(); wined3d_surface_incref(surface->wined3d_surface); wined3d_mutex_unlock(); } return refcount; }
static ULONG WINAPI d3d8_surface_AddRef(IDirect3DSurface8 *iface) { struct d3d8_surface *surface = impl_from_IDirect3DSurface8(iface); TRACE("iface %p.\n", iface); if (surface->forwardReference) { /* Forward refcounting */ TRACE("Forwarding to %p.\n", surface->forwardReference); return IUnknown_AddRef(surface->forwardReference); } else { /* No container, handle our own refcounting */ ULONG ref = InterlockedIncrement(&surface->resource.refcount); TRACE("%p increasing refcount to %u.\n", iface, ref); if (ref == 1) { if (surface->parent_device) IDirect3DDevice8_AddRef(surface->parent_device); wined3d_mutex_lock(); wined3d_surface_incref(surface->wined3d_surface); wined3d_mutex_unlock(); } return ref; } }
void surface_init(struct d3d8_surface *surface, struct wined3d_surface *wined3d_surface, struct d3d8_device *device, const struct wined3d_parent_ops **parent_ops) { surface->IDirect3DSurface8_iface.lpVtbl = &d3d8_surface_vtbl; d3d8_resource_init(&surface->resource); wined3d_surface_incref(wined3d_surface); surface->wined3d_surface = wined3d_surface; surface->parent_device = &device->IDirect3DDevice8_iface; IDirect3DDevice8_AddRef(surface->parent_device); *parent_ops = &d3d8_surface_wined3d_parent_ops; }
static ULONG STDMETHODCALLTYPE d3d10_texture2d_AddRef(ID3D10Texture2D *iface) { struct d3d10_texture2d *This = impl_from_ID3D10Texture2D(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); if (refcount == 1 && This->wined3d_surface) wined3d_surface_incref(This->wined3d_surface); return refcount; }