static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, UINT buffer_idx, REFIID riid, void **surface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); struct wined3d_surface *backbuffer; IUnknown *parent; HRESULT hr; TRACE("iface %p, buffer_idx %u, riid %s, surface %p\n", iface, buffer_idx, debugstr_guid(riid), surface); EnterCriticalSection(&dxgi_cs); hr = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, buffer_idx, WINED3D_BACKBUFFER_TYPE_MONO, &backbuffer); if (FAILED(hr)) { LeaveCriticalSection(&dxgi_cs); return hr; } parent = wined3d_surface_get_parent(backbuffer); hr = IUnknown_QueryInterface(parent, riid, surface); wined3d_surface_decref(backbuffer); LeaveCriticalSection(&dxgi_cs); return hr; }
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDesc(IDXGISwapChain *iface, DXGI_SWAP_CHAIN_DESC *desc) { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface); struct wined3d_swapchain_desc wined3d_desc; FIXME("iface %p, desc %p partial stub!\n", iface, desc); if (desc == NULL) return E_INVALIDARG; wined3d_mutex_lock(); wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); wined3d_mutex_unlock(); FIXME("Ignoring ScanlineOrdering, Scaling, SwapEffect and Flags\n"); desc->BufferDesc.Width = wined3d_desc.backbuffer_width; desc->BufferDesc.Height = wined3d_desc.backbuffer_height; desc->BufferDesc.RefreshRate.Numerator = wined3d_desc.refresh_rate; desc->BufferDesc.RefreshRate.Denominator = 1; desc->BufferDesc.Format = dxgi_format_from_wined3dformat(wined3d_desc.backbuffer_format); desc->BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; desc->BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; dxgi_sample_desc_from_wined3d(&desc->SampleDesc, wined3d_desc.multisample_type, wined3d_desc.multisample_quality); desc->BufferCount = wined3d_desc.backbuffer_count; desc->OutputWindow = wined3d_desc.device_window; desc->Windowed = wined3d_desc.windowed; desc->SwapEffect = DXGI_SWAP_EFFECT_DISCARD; desc->Flags = 0; return S_OK; }
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetBuffer(IDXGISwapChain *iface, UINT buffer_idx, REFIID riid, void **surface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); struct wined3d_texture *texture; IUnknown *parent; HRESULT hr; TRACE("iface %p, buffer_idx %u, riid %s, surface %p\n", iface, buffer_idx, debugstr_guid(riid), surface); wined3d_mutex_lock(); if (!(texture = wined3d_swapchain_get_back_buffer(This->wined3d_swapchain, buffer_idx))) { wined3d_mutex_unlock(); return DXGI_ERROR_INVALID_CALL; } parent = wined3d_texture_get_parent(texture); hr = IUnknown_QueryInterface(parent, riid, surface); wined3d_mutex_unlock(); return hr; }
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_SetPrivateDataInterface(IDXGISwapChain *iface, REFGUID guid, const IUnknown *object) { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface); TRACE("iface %p, guid %s, object %p.\n", iface, debugstr_guid(guid), object); return dxgi_set_private_data_interface(&swapchain->private_store, guid, object); }
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_SetPrivateData(IDXGISwapChain *iface, REFGUID guid, UINT data_size, const void *data) { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); return dxgi_set_private_data(&swapchain->private_store, guid, data_size, data); }
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_Present(IDXGISwapChain *iface, UINT sync_interval, UINT flags) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); TRACE("iface %p, sync_interval %u, flags %#x\n", iface, sync_interval, flags); if (sync_interval) FIXME("Unimplemented sync interval %u\n", sync_interval); if (flags) FIXME("Unimplemented flags %#x\n", flags); return wined3d_swapchain_present(This->wined3d_swapchain, NULL, NULL, NULL, NULL, 0); }
static ULONG STDMETHODCALLTYPE dxgi_swapchain_AddRef(IDXGISwapChain *iface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); if (refcount == 1) wined3d_swapchain_incref(This->wined3d_swapchain); return refcount; }
static ULONG STDMETHODCALLTYPE dxgi_swapchain_Release(IDXGISwapChain *iface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) { wined3d_mutex_lock(); wined3d_swapchain_decref(This->wined3d_swapchain); wined3d_mutex_unlock(); } return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_ResizeBuffers(IDXGISwapChain *iface, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags) { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain(iface); struct wined3d_swapchain_desc wined3d_desc; struct wined3d_surface *surface; IUnknown *parent; unsigned int i; HRESULT hr; TRACE("iface %p, buffer_count %u, width %u, height %u, format %s, flags %#x.\n", iface, buffer_count, width, height, debug_dxgi_format(format), flags); if (flags) FIXME("Ignoring flags %#x.\n", flags); EnterCriticalSection(&dxgi_cs); wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); for (i = 0; i < wined3d_desc.backbuffer_count; ++i) { surface = wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, i, WINED3D_BACKBUFFER_TYPE_MONO); parent = wined3d_surface_get_parent(surface); IUnknown_AddRef(parent); if (IUnknown_Release(parent)) { LeaveCriticalSection(&dxgi_cs); return DXGI_ERROR_INVALID_CALL; } } if (format != DXGI_FORMAT_UNKNOWN) wined3d_desc.backbuffer_format = wined3dformat_from_dxgi_format(format); hr = wined3d_swapchain_resize_buffers(swapchain->wined3d_swapchain, buffer_count, width, height, wined3d_desc.backbuffer_format, wined3d_desc.multisample_type, wined3d_desc.multisample_quality); LeaveCriticalSection(&dxgi_cs); return hr; }
static ULONG STDMETHODCALLTYPE dxgi_swapchain_Release(IDXGISwapChain *iface) { struct dxgi_swapchain *This = impl_from_IDXGISwapChain(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) { struct wined3d_device *wined3d_device; HRESULT hr; FIXME("Only a single swapchain is supported\n"); wined3d_device = wined3d_swapchain_get_device(This->wined3d_swapchain); hr = wined3d_device_uninit_3d(wined3d_device); if (FAILED(hr)) { ERR("Uninit3D failed, hr %#x\n", hr); } } return refcount; }