/* Internal function called back during the CreateVolumeTexture */ HRESULT WINAPI D3D9CB_CreateVolume(IUnknown *pDevice, IUnknown *pSuperior, UINT Width, UINT Height, UINT Depth, WINED3DFORMAT Format, WINED3DPOOL Pool, DWORD Usage, IWineD3DVolume **ppVolume, HANDLE * pSharedHandle) { IDirect3DVolume9Impl *object; IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)pDevice; HRESULT hrc = D3D_OK; /* Allocate the storage for the device */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolume9Impl)); if (NULL == object) { FIXME("Allocation of memory failed\n"); *ppVolume = NULL; return D3DERR_OUTOFVIDEOMEMORY; } object->lpVtbl = &Direct3DVolume9_Vtbl; object->ref = 1; hrc = IWineD3DDevice_CreateVolume(This->WineD3DDevice, Width, Height, Depth, Usage & WINED3DUSAGE_MASK, Format, Pool, &object->wineD3DVolume, pSharedHandle, (IUnknown *)object); if (hrc != D3D_OK) { /* free up object */ FIXME("(%p) call to IWineD3DDevice_CreateVolume failed\n", This); HeapFree(GetProcessHeap(), 0, object); *ppVolume = NULL; } else { *ppVolume = object->wineD3DVolume; object->container = pSuperior; object->forwardReference = pSuperior; } TRACE("(%p) Created volume %p\n", This, *ppVolume); return hrc; }
HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height, UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) { HRESULT hr; volume->IDirect3DVolume8_iface.lpVtbl = &Direct3DVolume8_Vtbl; volume->ref = 1; hr = IWineD3DDevice_CreateVolume(device->WineD3DDevice, width, height, depth, usage, format, pool, volume, &d3d8_volume_wined3d_parent_ops, &volume->wineD3DVolume); if (FAILED(hr)) { WARN("Failed to create wined3d volume, hr %#x.\n", hr); return hr; } return D3D_OK; }