HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *device, UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) { HRESULT hr; surface->lpVtbl = &Direct3DSurface8_Vtbl; surface->ref = 1; /* FIXME: Check MAX bounds of MultisampleQuality. */ if (multisample_quality > 0) { FIXME("Multisample quality set to %u, substituting 0.\n", multisample_quality); multisample_quality = 0; } wined3d_mutex_lock(); hr = IWineD3DDevice_CreateSurface(device->WineD3DDevice, width, height, wined3dformat_from_d3dformat(format), lockable, discard, level, &surface->wineD3DSurface, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type, multisample_quality, SURFACE_OPENGL, (IUnknown *)surface, &d3d8_surface_wined3d_parent_ops); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d surface, hr %#x.\n", hr); return hr; } surface->parentDevice = (IDirect3DDevice8 *)device; IUnknown_AddRef(surface->parentDevice); return D3D_OK; }
HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *device, UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) { HRESULT hr; surface->lpVtbl = &Direct3DSurface9_Vtbl; surface->ref = 1; switch (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; } /* FIXME: Check MAX bounds of MultisampleQuality. */ if (multisample_quality > 0) { FIXME("Multisample quality set to %u, substituting 0.\n", multisample_quality); multisample_quality = 0; } wined3d_mutex_lock(); hr = IWineD3DDevice_CreateSurface(device->WineD3DDevice, width, height, wined3dformat_from_d3dformat(format), lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type, multisample_quality, SURFACE_OPENGL, surface, &d3d9_surface_wined3d_parent_ops, &surface->wineD3DSurface); wined3d_mutex_unlock(); if (FAILED(hr)) { WARN("Failed to create wined3d surface, hr %#x.\n", hr); return hr; } surface->parentDevice = (IDirect3DDevice9Ex *)device; IDirect3DDevice9Ex_AddRef(surface->parentDevice); return D3D_OK; }
HRESULT d3d10_texture2d_init(struct d3d10_texture2d *texture, struct d3d10_device *device, const D3D10_TEXTURE2D_DESC *desc) { HRESULT hr; texture->vtbl = &d3d10_texture2d_vtbl; texture->refcount = 1; texture->desc = *desc; if (desc->MipLevels == 1 && desc->ArraySize == 1) { IWineDXGIDevice *wine_device; hr = ID3D10Device_QueryInterface((ID3D10Device *)device, &IID_IWineDXGIDevice, (void **)&wine_device); if (FAILED(hr)) { ERR("Device should implement IWineDXGIDevice\n"); return E_FAIL; } hr = IWineDXGIDevice_create_surface(wine_device, NULL, 0, NULL, (IUnknown *)texture, (void **)&texture->dxgi_surface); IWineDXGIDevice_Release(wine_device); if (FAILED(hr)) { ERR("Failed to create DXGI surface, returning %#x\n", hr); return hr; } FIXME("Implement DXGI<->wined3d usage conversion\n"); hr = IWineD3DDevice_CreateSurface(device->wined3d_device, desc->Width, desc->Height, wined3dformat_from_dxgi_format(desc->Format), FALSE, FALSE, 0, desc->Usage, WINED3DPOOL_DEFAULT, desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3DMULTISAMPLE_NONE, desc->SampleDesc.Quality, SURFACE_OPENGL, texture, &d3d10_texture2d_wined3d_parent_ops, &texture->wined3d_surface); if (FAILED(hr)) { ERR("CreateSurface failed, returning %#x\n", hr); IDXGISurface_Release(texture->dxgi_surface); return hr; } } return S_OK; }