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; } }
static ULONG WINAPI IDirect3DSurface9Impl_Release(IDirect3DSurface9 *iface) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); TRACE("iface %p.\n", iface); if (This->forwardReference) { /* Forward to the containerParent */ TRACE("(%p) : Forwarding to %p\n", This, This->forwardReference); return IUnknown_Release(This->forwardReference); } else { /* No container, handle our own refcounting */ ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p decreasing refcount to %u.\n", iface, ref); if (ref == 0) { IDirect3DDevice9Ex *parentDevice = This->parentDevice; wined3d_mutex_lock(); wined3d_surface_decref(This->wined3d_surface); wined3d_mutex_unlock(); /* Release the device last, as it may cause the device to be destroyed. */ if (parentDevice) IDirect3DDevice9Ex_Release(parentDevice); } return ref; } }
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 HRESULT WINAPI d3d9_surface_LockRect(IDirect3DSurface9 *iface, D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); struct wined3d_box box; struct wined3d_map_desc map_desc; HRESULT hr; TRACE("iface %p, locked_rect %p, rect %s, flags %#x.\n", iface, locked_rect, wine_dbgstr_rect(rect), flags); if (rect) { box.left = rect->left; box.top = rect->top; box.right = rect->right; box.bottom = rect->bottom; box.front = 0; box.back = 1; } wined3d_mutex_lock(); hr = wined3d_resource_sub_resource_map(wined3d_texture_get_resource(surface->wined3d_texture), surface->sub_resource_idx, &map_desc, rect ? &box : NULL, flags); wined3d_mutex_unlock(); if (SUCCEEDED(hr)) { locked_rect->Pitch = map_desc.row_pitch; locked_rect->pBits = map_desc.data; } return hr; }
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; }
/* IDirect3DSurface9 IDirect3DResource9 Interface follow: */ static HRESULT WINAPI IDirect3DSurface9Impl_GetDevice(IDirect3DSurface9 *iface, IDirect3DDevice9 **device) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); TRACE("iface %p, device %p.\n", iface, device); if (This->forwardReference) { IDirect3DResource9 *resource; HRESULT hr; hr = IUnknown_QueryInterface(This->forwardReference, &IID_IDirect3DResource9, (void **)&resource); if (SUCCEEDED(hr)) { hr = IDirect3DResource9_GetDevice(resource, device); IDirect3DResource9_Release(resource); TRACE("Returning device %p.\n", *device); } return hr; } *device = (IDirect3DDevice9 *)This->parentDevice; IDirect3DDevice9_AddRef(*device); TRACE("Returning device %p.\n", *device); return D3D_OK; }
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->forwardReference) { TRACE("Forwarding to %p.\n", surface->forwardReference); return IUnknown_Release(surface->forwardReference); } refcount = InterlockedDecrement(&surface->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { IDirect3DDevice9Ex *parent_device = surface->parent_device; wined3d_mutex_lock(); 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; }
static HRESULT WINAPI d3d9_surface_FreePrivateData(IDirect3DSurface9 *iface, REFGUID guid) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); return d3d9_resource_free_private_data(&surface->resource, guid); }
IDirect3DSurface9Impl *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) { if (!iface) return NULL; assert(iface->lpVtbl == &Direct3DSurface9_Vtbl); return impl_from_IDirect3DSurface9(iface); }
struct d3d9_surface *unsafe_impl_from_IDirect3DSurface9(IDirect3DSurface9 *iface) { if (!iface) return NULL; assert(iface->lpVtbl == &d3d9_surface_vtbl); return impl_from_IDirect3DSurface9(iface); }
VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSurf9GetHostId(IDirect3DSurface9 *iface, uint32_t *pu32Id) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); HRESULT hr; wined3d_mutex_lock(); hr = wined3d_surface_get_host_id(surface->wined3d_surface, pu32Id); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI d3d9_surface_GetPrivateData(IDirect3DSurface9 *iface, REFGUID guid, void *data, DWORD *data_size) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); TRACE("iface %p, guid %s, data %p, data_size %p.\n", iface, debugstr_guid(guid), data, data_size); return d3d9_resource_get_private_data(&surface->resource, guid, data, data_size); }
VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSurf9SyncToHost(IDirect3DSurface9 *iface) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); HRESULT hr; wined3d_mutex_lock(); hr = wined3d_surface_sync_to_host(surface->wined3d_surface); wined3d_mutex_unlock(); return hr; }
static void WINAPI IDirect3DSurface9Impl_PreLoad(IDirect3DSurface9 *iface) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); TRACE("iface %p.\n", iface); wined3d_mutex_lock(); wined3d_surface_preload(This->wined3d_surface); wined3d_mutex_unlock(); }
static void WINAPI d3d9_surface_PreLoad(IDirect3DSurface9 *iface) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); TRACE("iface %p.\n", iface); wined3d_mutex_lock(); wined3d_surface_preload(surface->wined3d_surface); wined3d_mutex_unlock(); }
static DWORD WINAPI IDirect3DSurface9Impl_GetPriority(IDirect3DSurface9 *iface) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); hr = wined3d_surface_get_priority(This->wined3d_surface); wined3d_mutex_unlock(); return hr; }
static DWORD WINAPI d3d9_surface_GetPriority(IDirect3DSurface9 *iface) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); DWORD ret; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); ret = wined3d_surface_get_priority(surface->wined3d_surface); wined3d_mutex_unlock(); return ret; }
static HRESULT WINAPI IDirect3DSurface9Impl_LockRect(IDirect3DSurface9 *iface, D3DLOCKED_RECT *pLockedRect, const RECT *pRect, DWORD Flags) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p, locked_rect %p, rect %p, flags %#x.\n", iface, pLockedRect, pRect, Flags); wined3d_mutex_lock(); hr = wined3d_surface_map(This->wined3d_surface, (WINED3DLOCKED_RECT *)pLockedRect, pRect, Flags); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI IDirect3DSurface9Impl_FreePrivateData(IDirect3DSurface9 *iface, REFGUID guid) { IDirect3DSurface9Impl *surface = impl_from_IDirect3DSurface9(iface); struct wined3d_resource *resource; HRESULT hr; TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); wined3d_mutex_lock(); resource = wined3d_surface_get_resource(surface->wined3d_surface); hr = wined3d_resource_free_private_data(resource, guid); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI d3d9_surface_GetDevice(IDirect3DSurface9 *iface, IDirect3DDevice9 **device) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); TRACE("iface %p, device %p.\n", iface, device); if (surface->texture) return IDirect3DBaseTexture9_GetDevice(&surface->texture->IDirect3DBaseTexture9_iface, device); *device = (IDirect3DDevice9 *)surface->parent_device; IDirect3DDevice9_AddRef(*device); TRACE("Returning device %p.\n", *device); return D3D_OK; }
/* IDirect3DSurface9 Interface follow: */ static HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(IDirect3DSurface9 *iface, REFIID riid, void **ppContainer) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); HRESULT res; TRACE("iface %p, riid %s, container %p.\n", iface, debugstr_guid(riid), ppContainer); if (!This->container) return E_NOINTERFACE; res = IUnknown_QueryInterface(This->container, riid, ppContainer); TRACE("Returning ppContainer %p, *ppContainer %p\n", ppContainer, *ppContainer); return res; }
static HRESULT WINAPI d3d9_surface_GetContainer(IDirect3DSurface9 *iface, REFIID riid, void **container) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p, riid %s, container %p.\n", iface, debugstr_guid(riid), container); if (!surface->container) return E_NOINTERFACE; hr = IUnknown_QueryInterface(surface->container, riid, container); TRACE("Returning %p.\n", *container); return hr; }
static HRESULT WINAPI d3d9_surface_SetPrivateData(IDirect3DSurface9 *iface, REFGUID guid, const void *data, DWORD data_size, DWORD flags) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); struct wined3d_resource *resource; HRESULT hr; TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", iface, debugstr_guid(guid), data, data_size, flags); wined3d_mutex_lock(); resource = wined3d_surface_get_resource(surface->wined3d_surface); hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI IDirect3DSurface9Impl_GetPrivateData(IDirect3DSurface9 *iface, REFGUID guid, void *data, DWORD *data_size) { IDirect3DSurface9Impl *surface = impl_from_IDirect3DSurface9(iface); struct wined3d_resource *resource; HRESULT hr; TRACE("iface %p, guid %s, data %p, data_size %p.\n", iface, debugstr_guid(guid), data, data_size); wined3d_mutex_lock(); resource = wined3d_surface_get_resource(surface->wined3d_surface); hr = wined3d_resource_get_private_data(resource, guid, data, data_size); wined3d_mutex_unlock(); return hr; }
static HRESULT WINAPI d3d9_surface_UnlockRect(IDirect3DSurface9 *iface) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); hr = wined3d_surface_unmap(surface->wined3d_surface); wined3d_mutex_unlock(); switch(hr) { case WINEDDERR_NOTLOCKED: return D3DERR_INVALIDCALL; default: return hr; } }
static HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(IDirect3DSurface9 *iface, HDC hdc) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p, hdc %p.\n", iface, hdc); wined3d_mutex_lock(); hr = wined3d_surface_releasedc(This->wined3d_surface, hdc); wined3d_mutex_unlock(); switch (hr) { case WINEDDERR_NODC: return D3DERR_INVALIDCALL; default: return hr; } }
static HRESULT WINAPI d3d9_surface_ReleaseDC(IDirect3DSurface9 *iface, HDC dc) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p, dc %p.\n", iface, dc); wined3d_mutex_lock(); hr = wined3d_surface_releasedc(surface->wined3d_surface, dc); wined3d_mutex_unlock(); switch (hr) { case WINEDDERR_NODC: return D3DERR_INVALIDCALL; default: return hr; } }
static HRESULT WINAPI d3d9_surface_LockRect(IDirect3DSurface9 *iface, D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags) { struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface); struct wined3d_map_desc map_desc; HRESULT hr; TRACE("iface %p, locked_rect %p, rect %s, flags %#x.\n", iface, locked_rect, wine_dbgstr_rect(rect), flags); wined3d_mutex_lock(); hr = wined3d_surface_map(surface->wined3d_surface, &map_desc, rect, flags); wined3d_mutex_unlock(); locked_rect->Pitch = map_desc.row_pitch; locked_rect->pBits = map_desc.data; return hr; }
/* IDirect3DSurface9 IUnknown parts follow: */ static HRESULT WINAPI IDirect3DSurface9Impl_QueryInterface(IDirect3DSurface9 *iface, REFIID riid, void **ppobj) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DResource9) || IsEqualGUID(riid, &IID_IDirect3DSurface9)) { IDirect3DSurface9_AddRef(iface); *ppobj = This; return S_OK; } WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); *ppobj = NULL; return E_NOINTERFACE; }
static HRESULT WINAPI IDirect3DSurface9Impl_GetDC(IDirect3DSurface9 *iface, HDC* phdc) { IDirect3DSurface9Impl *This = impl_from_IDirect3DSurface9(iface); HRESULT hr; TRACE("iface %p, hdc %p.\n", iface, phdc); if(!This->getdc_supported) { WARN("Surface does not support GetDC, returning D3DERR_INVALIDCALL\n"); /* Don't touch the DC */ return D3DERR_INVALIDCALL; } wined3d_mutex_lock(); hr = wined3d_surface_getdc(This->wined3d_surface, phdc); wined3d_mutex_unlock(); return hr; }