static ULONG WINAPI d3d9_volume_AddRef(IDirect3DVolume9 *iface)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface);
- ULONG refcount;
TRACE("iface %p.\n", iface);
+ TRACE("Forwarding to %p.\n", volume->texture);
- if (volume->forwardReference)
- {
- TRACE("Forwarding to %p.\n", volume->forwardReference);
- return IUnknown_AddRef(volume->forwardReference);
- }
-
- refcount = InterlockedIncrement(&volume->refcount);
- TRACE("%p increasing refcount to %u.\n", iface, refcount);
-
- if (refcount == 1)
- {
- wined3d_mutex_lock();
- wined3d_volume_incref(volume->wined3d_volume);
- wined3d_mutex_unlock();
- }
-
- return refcount;
+ return IDirect3DBaseTexture9_AddRef(&volume->texture->IDirect3DBaseTexture9_iface);
}
static ULONG WINAPI d3d9_volume_Release(IDirect3DVolume9 *iface)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface);
- ULONG refcount;
TRACE("iface %p.\n", iface);
+ TRACE("Forwarding to %p.\n", volume->texture);
- if (volume->forwardReference)
- {
- TRACE("Forwarding to %p.\n", volume->forwardReference);
- return IUnknown_Release(volume->forwardReference);
- }
-
- refcount = InterlockedDecrement(&volume->refcount);
- TRACE("%p decreasing refcount to %u.\n", iface, refcount);
-
- if (!refcount)
- {
- wined3d_mutex_lock();
- wined3d_volume_decref(volume->wined3d_volume);
- wined3d_mutex_unlock();
- }
-
- return refcount;
+ return IDirect3DBaseTexture9_Release(&volume->texture->IDirect3DBaseTexture9_iface);
}
static HRESULT WINAPI d3d9_volume_GetDevice(IDirect3DVolume9 *iface, IDirect3DDevice9 **device)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface);
- IDirect3DResource9 *resource;
- HRESULT hr;
TRACE("iface %p, device %p.\n", iface, device);
- hr = IUnknown_QueryInterface(volume->forwardReference, &IID_IDirect3DResource9, (void **)&resource);
- if (SUCCEEDED(hr))
- {
- hr = IDirect3DResource9_GetDevice(resource, device);
- IDirect3DResource9_Release(resource);
-
- TRACE("Returning device %p.\n", *device);
- }
-
- return hr;
+ return IDirect3DBaseTexture9_GetDevice(&volume->texture->IDirect3DBaseTexture9_iface, device);
}
static HRESULT WINAPI d3d9_volume_SetPrivateData(IDirect3DVolume9 *iface, REFGUID guid,
const void *data, DWORD data_size, DWORD flags)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(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_volume_get_resource(volume->wined3d_volume);
- hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
- wined3d_mutex_unlock();
-
- return hr;
+ return d3d9_resource_set_private_data(&volume->resource, guid, data, data_size, flags);
}
static HRESULT WINAPI d3d9_volume_GetPrivateData(IDirect3DVolume9 *iface, REFGUID guid,
void *data, DWORD *data_size)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(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_volume_get_resource(volume->wined3d_volume);
- hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
- wined3d_mutex_unlock();
-
- return hr;
+ return d3d9_resource_get_private_data(&volume->resource, guid, data, data_size);
}
static HRESULT WINAPI d3d9_volume_FreePrivateData(IDirect3DVolume9 *iface, REFGUID guid)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface);
- struct wined3d_resource *resource;
- HRESULT hr;
-
TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
- wined3d_mutex_lock();
- resource = wined3d_volume_get_resource(volume->wined3d_volume);
- hr = wined3d_resource_free_private_data(resource, guid);
- wined3d_mutex_unlock();
-
- return hr;
+ return d3d9_resource_free_private_data(&volume->resource, guid);
}
static HRESULT WINAPI d3d9_volume_GetContainer(IDirect3DVolume9 *iface, REFIID riid, void **container)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface);
- HRESULT hr;
TRACE("iface %p, riid %s, container %p.\n", iface, debugstr_guid(riid), container);
- if (!volume->container)
- return E_NOINTERFACE;
-
- hr = IUnknown_QueryInterface(volume->container, riid, container);
-
- TRACE("Returning %p,\n", *container);
-
- return hr;
+ return IDirect3DBaseTexture9_QueryInterface(&volume->texture->IDirect3DBaseTexture9_iface, riid, container);
}
static HRESULT WINAPI d3d9_volume_GetDesc(IDirect3DVolume9 *iface, D3DVOLUME_DESC *desc)
{
struct d3d9_volume *volume = impl_from_IDirect3DVolume9(iface);
- struct wined3d_resource_desc wined3d_desc;
- struct wined3d_resource *wined3d_resource;
+ struct wined3d_sub_resource_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc);
wined3d_mutex_lock();
- wined3d_resource = wined3d_volume_get_resource(volume->wined3d_volume);
- wined3d_resource_get_desc(wined3d_resource, &wined3d_desc);
+ wined3d_texture_get_sub_resource_desc(volume->wined3d_texture, volume->sub_resource_idx, &wined3d_desc);
wined3d_mutex_unlock();
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
- desc->Type = wined3d_desc.resource_type;
+ desc->Type = D3DRTYPE_VOLUME;
desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
desc->Pool = wined3d_desc.pool;
desc->Width = wined3d_desc.width;
iface, locked_box, box, flags);
wined3d_mutex_lock();
- hr = wined3d_volume_map(volume->wined3d_volume, &map_desc, (const struct wined3d_box *)box, flags);
+ if (FAILED(hr = wined3d_resource_map(wined3d_texture_get_resource(volume->wined3d_texture),
+ volume->sub_resource_idx, &map_desc, (const struct wined3d_box *)box, flags)))
+ map_desc.data = NULL;
wined3d_mutex_unlock();
locked_box->RowPitch = map_desc.row_pitch;
TRACE("iface %p.\n", iface);
wined3d_mutex_lock();
- hr = wined3d_volume_unmap(volume->wined3d_volume);
+ hr = wined3d_resource_unmap(wined3d_texture_get_resource(volume->wined3d_texture), volume->sub_resource_idx);
wined3d_mutex_unlock();
+ if (hr == WINEDDERR_NOTLOCKED)
+ return D3DERR_INVALIDCALL;
return hr;
}
static void STDMETHODCALLTYPE volume_wined3d_object_destroyed(void *parent)
{
- HeapFree(GetProcessHeap(), 0, parent);
+ struct d3d9_volume *volume = parent;
+ d3d9_resource_cleanup(&volume->resource);
+ HeapFree(GetProcessHeap(), 0, volume);
}
static const struct wined3d_parent_ops d3d9_volume_wined3d_parent_ops =
volume_wined3d_object_destroyed,
};
-void volume_init(struct d3d9_volume *volume, struct wined3d_volume *wined3d_volume,
- const struct wined3d_parent_ops **parent_ops)
+void volume_init(struct d3d9_volume *volume, struct wined3d_texture *wined3d_texture,
+ unsigned int sub_resource_idx, const struct wined3d_parent_ops **parent_ops)
{
volume->IDirect3DVolume9_iface.lpVtbl = &d3d9_volume_vtbl;
- volume->refcount = 1;
- wined3d_volume_incref(wined3d_volume);
- volume->wined3d_volume = wined3d_volume;
+ d3d9_resource_init(&volume->resource);
+ volume->resource.refcount = 0;
+ volume->texture = wined3d_texture_get_parent(wined3d_texture);
+ volume->wined3d_texture = wined3d_texture;
+ volume->sub_resource_idx = sub_resource_idx;
*parent_ops = &d3d9_volume_wined3d_parent_ops;
}