static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *iface, const DXGI_SURFACE_DESC *desc, UINT surface_count, DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IDXGISurface **surface) { struct wined3d_device_parent *device_parent; struct wined3d_resource_desc surface_desc; IWineDXGIDeviceParent *dxgi_device_parent; HRESULT hr; UINT i; UINT j; TRACE("iface %p, desc %p, surface_count %u, usage %#x, shared_resource %p, surface %p\n", iface, desc, surface_count, usage, shared_resource, surface); hr = IWineDXGIDevice_QueryInterface(iface, &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent); if (FAILED(hr)) { ERR("Device should implement IWineD3DDeviceParent\n"); return E_FAIL; } device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent); FIXME("Implement DXGI<->wined3d usage conversion\n"); surface_desc.resource_type = WINED3D_RTYPE_SURFACE; surface_desc.format = wined3dformat_from_dxgi_format(desc->Format); wined3d_sample_desc_from_dxgi(&surface_desc.multisample_type, &surface_desc.multisample_quality, &desc->SampleDesc); surface_desc.usage = usage; surface_desc.pool = WINED3D_POOL_DEFAULT; surface_desc.width = desc->Width; surface_desc.height = desc->Height; surface_desc.depth = 1; surface_desc.size = 0; wined3d_mutex_lock(); memset(surface, 0, surface_count * sizeof(*surface)); for (i = 0; i < surface_count; ++i) { struct wined3d_texture *wined3d_texture; IUnknown *parent; if (FAILED(hr = device_parent->ops->create_swapchain_texture(device_parent, NULL, &surface_desc, &wined3d_texture))) { ERR("Failed to create surface, hr %#x.\n", hr); goto fail; } parent = wined3d_texture_get_parent(wined3d_texture); hr = IUnknown_QueryInterface(parent, &IID_IDXGISurface, (void **)&surface[i]); wined3d_texture_decref(wined3d_texture); if (FAILED(hr)) { ERR("Surface should implement IDXGISurface\n"); goto fail; } TRACE("Created IDXGISurface %p (%u/%u)\n", surface[i], i + 1, surface_count); } wined3d_mutex_unlock(); IWineDXGIDeviceParent_Release(dxgi_device_parent); return S_OK; fail: wined3d_mutex_unlock(); for (j = 0; j < i; ++j) { IDXGISurface_Release(surface[i]); } IWineDXGIDeviceParent_Release(dxgi_device_parent); return hr; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IDXGIFactory1 *iface, IUnknown *device, DXGI_SWAP_CHAIN_DESC *desc, IDXGISwapChain **swapchain) { struct wined3d_swapchain *wined3d_swapchain; struct wined3d_swapchain_desc wined3d_desc; IWineDXGIDevice *dxgi_device; HRESULT hr; UINT min_buffer_count; FIXME("iface %p, device %p, desc %p, swapchain %p partial stub!\n", iface, device, desc, swapchain); switch (desc->SwapEffect) { case DXGI_SWAP_EFFECT_DISCARD: case DXGI_SWAP_EFFECT_SEQUENTIAL: min_buffer_count = 1; break; case DXGI_SWAP_EFFECT_FLIP_DISCARD: case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL: min_buffer_count = 2; break; default: WARN("Invalid swap effect %u used, returning DXGI_ERROR_INVALID_CALL.\n", desc->SwapEffect); return DXGI_ERROR_INVALID_CALL; } if (desc->BufferCount < min_buffer_count || desc->BufferCount > 16) { WARN("BufferCount is %u, returning DXGI_ERROR_INVALID_CALL.\n", desc->BufferCount); return DXGI_ERROR_INVALID_CALL; } if (!desc->OutputWindow) { FIXME("No output window, should use factory output window\n"); } hr = IUnknown_QueryInterface(device, &IID_IWineDXGIDevice, (void **)&dxgi_device); if (FAILED(hr)) { ERR("This is not the device we're looking for\n"); return hr; } FIXME("Ignoring SwapEffect and Flags\n"); wined3d_desc.backbuffer_width = desc->BufferDesc.Width; wined3d_desc.backbuffer_height = desc->BufferDesc.Height; wined3d_desc.backbuffer_format = wined3dformat_from_dxgi_format(desc->BufferDesc.Format); wined3d_desc.backbuffer_count = desc->BufferCount; wined3d_sample_desc_from_dxgi(&wined3d_desc.multisample_type, &wined3d_desc.multisample_quality, &desc->SampleDesc); wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD; wined3d_desc.device_window = desc->OutputWindow; wined3d_desc.windowed = desc->Windowed; wined3d_desc.enable_auto_depth_stencil = FALSE; wined3d_desc.auto_depth_stencil_format = 0; wined3d_desc.flags = 0; /* WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL? */ wined3d_desc.refresh_rate = dxgi_rational_to_uint(&desc->BufferDesc.RefreshRate); wined3d_desc.swap_interval = WINED3DPRESENT_INTERVAL_DEFAULT; wined3d_desc.auto_restore_display_mode = TRUE; hr = IWineDXGIDevice_create_swapchain(dxgi_device, &wined3d_desc, FALSE, &wined3d_swapchain); IWineDXGIDevice_Release(dxgi_device); if (FAILED(hr)) { WARN("Failed to create swapchain, hr %#x.\n", hr); return hr; } wined3d_mutex_lock(); *swapchain = wined3d_swapchain_get_parent(wined3d_swapchain); wined3d_mutex_unlock(); return S_OK; }