Microsoft Flight Simulator (2020) requires IDXGISwapChain4.
From: Brendan Shanks bshanks@codeweavers.com
--- dlls/dxgi/device.c | 2 +- dlls/dxgi/dxgi_private.h | 2 +- dlls/dxgi/swapchain.c | 178 ++++++++++++++++++++++++++------------- 3 files changed, 122 insertions(+), 60 deletions(-)
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index 2b8bb7f305f..f4acbdc0ff0 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -470,7 +470,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain(IWineDX
TRACE("Created swapchain %p.\n", object);
- *swapchain = &object->IDXGISwapChain1_iface; + *swapchain = (IDXGISwapChain1 *)&object->IDXGISwapChain2_iface;
return S_OK; } diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h index 6d09453df8d..21275d35ec9 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -172,7 +172,7 @@ struct dxgi_adapter *unsafe_impl_from_IDXGIAdapter(IDXGIAdapter *iface); /* IDXGISwapChain */ struct d3d11_swapchain { - IDXGISwapChain1 IDXGISwapChain1_iface; + IDXGISwapChain2 IDXGISwapChain2_iface; LONG refcount; struct wined3d_private_store private_store; struct wined3d_swapchain *wined3d_swapchain; diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index fe9df45cb71..026fa7fd611 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -180,14 +180,14 @@ static HWND d3d11_swapchain_get_hwnd(struct d3d11_swapchain *swapchain) return wined3d_desc.device_window; }
-static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain1(IDXGISwapChain1 *iface) +static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain2(IDXGISwapChain2 *iface) { - return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain1_iface); + return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain2_iface); }
/* IUnknown methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain1 *iface, REFIID riid, void **object) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain2 *iface, REFIID riid, void **object) { TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
@@ -195,7 +195,8 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain1 || IsEqualGUID(riid, &IID_IDXGIObject) || IsEqualGUID(riid, &IID_IDXGIDeviceSubObject) || IsEqualGUID(riid, &IID_IDXGISwapChain) - || IsEqualGUID(riid, &IID_IDXGISwapChain1)) + || IsEqualGUID(riid, &IID_IDXGISwapChain1) + || IsEqualGUID(riid, &IID_IDXGISwapChain2)) { IUnknown_AddRef(iface); *object = iface; @@ -208,9 +209,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain1 return E_NOINTERFACE; }
-static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain1 *iface) +static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain2 *iface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); ULONG refcount = InterlockedIncrement(&swapchain->refcount);
TRACE("%p increasing refcount to %lu.\n", swapchain, refcount); @@ -221,9 +222,9 @@ static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain1 *iface) return refcount; }
-static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain1 *iface) +static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain2 *iface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); ULONG refcount = InterlockedDecrement(&swapchain->refcount);
TRACE("%p decreasing refcount to %lu.\n", swapchain, refcount); @@ -246,39 +247,39 @@ static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain1 *iface)
/* IDXGIObject methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateData(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateData(IDXGISwapChain2 *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(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 d3d11_swapchain_SetPrivateDataInterface(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateDataInterface(IDXGISwapChain2 *iface, REFGUID guid, const IUnknown *object) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(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 d3d11_swapchain_GetPrivateData(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetPrivateData(IDXGISwapChain2 *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
return dxgi_get_private_data(&swapchain->private_store, guid, data_size, data); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain1 *iface, REFIID riid, void **parent) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain2 *iface, REFIID riid, void **parent) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent);
@@ -287,9 +288,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain1 *ifac
/* IDXGIDeviceSubObject methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDevice(IDXGISwapChain1 *iface, REFIID riid, void **device) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDevice(IDXGISwapChain2 *iface, REFIID riid, void **device) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, riid %s, device %p.\n", iface, debugstr_guid(riid), device);
@@ -325,19 +326,19 @@ static HRESULT d3d11_swapchain_present(struct d3d11_swapchain *swapchain, return hr; }
-static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_Present(IDXGISwapChain1 *iface, UINT sync_interval, UINT flags) +static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_Present(IDXGISwapChain2 *iface, UINT sync_interval, UINT flags) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, sync_interval %u, flags %#x.\n", iface, sync_interval, flags);
return d3d11_swapchain_present(swapchain, sync_interval, flags); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain2 *iface, UINT buffer_idx, REFIID riid, void **surface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_texture *texture; IUnknown *parent; HRESULT hr; @@ -360,10 +361,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain1 *ifac return hr; }
-static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreenState(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreenState(IDXGISwapChain2 *iface, BOOL fullscreen, IDXGIOutput *target) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_desc swapchain_desc; struct wined3d_swapchain_state *state; struct dxgi_output *dxgi_output; @@ -383,7 +384,7 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen { IDXGIOutput_AddRef(target); } - else if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &target))) + else if (FAILED(hr = IDXGISwapChain2_GetContainingOutput(iface, &target))) { WARN("Failed to get target output for swapchain, hr %#lx.\n", hr); return hr; @@ -398,7 +399,7 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen { WARN("Nested invocation of SetFullscreenState.\n"); IDXGIOutput_Release(target); - IDXGISwapChain1_GetFullscreenState(iface, &old_fs, NULL); + IDXGISwapChain2_GetFullscreenState(iface, &old_fs, NULL); return old_fs == fullscreen ? S_OK : DXGI_STATUS_MODE_CHANGE_IN_PROGRESS; }
@@ -431,10 +432,10 @@ done: return hr; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapChain2 *iface, BOOL *fullscreen, IDXGIOutput **target) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_desc swapchain_desc; HRESULT hr;
@@ -454,7 +455,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha { if (!swapchain_desc.windowed) { - if (!swapchain->target && FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &swapchain->target))) + if (!swapchain->target && FAILED(hr = IDXGISwapChain2_GetContainingOutput(iface, &swapchain->target))) return hr;
*target = swapchain->target; @@ -469,9 +470,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain1 *iface, DXGI_SWAP_CHAIN_DESC *desc) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain2 *iface, DXGI_SWAP_CHAIN_DESC *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -510,10 +511,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain1 *iface, static HRESULT d3d11_swapchain_create_d3d11_textures(struct d3d11_swapchain *swapchain, IWineDXGIDevice *device, struct wined3d_swapchain_desc *desc);
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain2 *iface, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_desc wined3d_desc; struct wined3d_texture *texture; IUnknown *parent; @@ -554,10 +555,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain1 * return hr; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain2 *iface, const DXGI_MODE_DESC *target_mode_desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_state *state;
TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc); @@ -567,9 +568,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *i return dxgi_swapchain_resize_target(state, target_mode_desc); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain1 *iface, IDXGIOutput **output) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain2 *iface, IDXGIOutput **output) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); HWND window;
TRACE("iface %p, output %p.\n", iface, output); @@ -584,7 +585,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapCh return dxgi_get_output_from_window(swapchain->factory, window, output); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapChain2 *iface, DXGI_FRAME_STATISTICS *stats) { FIXME("iface %p, stats %p stub!\n", iface, stats); @@ -592,10 +593,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapCha return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapChain2 *iface, UINT *last_present_count) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, last_present_count %p.\n", iface, last_present_count);
@@ -606,9 +607,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapCh
/* IDXGISwapChain1 methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain1 *iface, DXGI_SWAP_CHAIN_DESC1 *desc) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain2 *iface, DXGI_SWAP_CHAIN_DESC1 *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -641,10 +642,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain1 *iface return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChain2 *iface, DXGI_SWAP_CHAIN_FULLSCREEN_DESC *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -670,9 +671,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChai return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain1 *iface, HWND *hwnd) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain2 *iface, HWND *hwnd) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, hwnd %p.\n", iface, hwnd);
@@ -686,7 +687,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain1 *iface, return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain2 *iface, REFIID iid, void **core_window) { FIXME("iface %p, iid %s, core_window %p stub!\n", iface, debugstr_guid(iid), core_window); @@ -697,10 +698,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain1 * return DXGI_ERROR_INVALID_CALL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain1 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain2 *iface, UINT sync_interval, UINT flags, const DXGI_PRESENT_PARAMETERS *present_parameters) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface);
TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n", iface, sync_interval, flags, present_parameters); @@ -711,14 +712,14 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain1 *iface return d3d11_swapchain_present(swapchain, sync_interval, flags); }
-static BOOL STDMETHODCALLTYPE d3d11_swapchain_IsTemporaryMonoSupported(IDXGISwapChain1 *iface) +static BOOL STDMETHODCALLTYPE d3d11_swapchain_IsTemporaryMonoSupported(IDXGISwapChain2 *iface) { FIXME("iface %p stub!\n", iface);
return FALSE; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapChain1 *iface, IDXGIOutput **output) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapChain2 *iface, IDXGIOutput **output) { FIXME("iface %p, output %p stub!\n", iface, output);
@@ -732,35 +733,88 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapCh return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetBackgroundColor(IDXGISwapChain1 *iface, const DXGI_RGBA *color) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetBackgroundColor(IDXGISwapChain2 *iface, const DXGI_RGBA *color) { FIXME("iface %p, color %p stub!\n", iface, color);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBackgroundColor(IDXGISwapChain1 *iface, DXGI_RGBA *color) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBackgroundColor(IDXGISwapChain2 *iface, DXGI_RGBA *color) { FIXME("iface %p, color %p stub!\n", iface, color);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetRotation(IDXGISwapChain1 *iface, DXGI_MODE_ROTATION rotation) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetRotation(IDXGISwapChain2 *iface, DXGI_MODE_ROTATION rotation) { FIXME("iface %p, rotation %#x stub!\n", iface, rotation);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain1 *iface, DXGI_MODE_ROTATION *rotation) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain2 *iface, DXGI_MODE_ROTATION *rotation) { FIXME("iface %p, rotation %p stub!\n", iface, rotation);
return E_NOTIMPL; }
-static const struct IDXGISwapChain1Vtbl d3d11_swapchain_vtbl = +/* IDXGISwapChain2 methods */ + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetSourceSize(IDXGISwapChain2 *iface, UINT width, UINT height) +{ + FIXME("iface %p, width %u, height %u stub!\n", iface, width, height); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetSourceSize(IDXGISwapChain2 *iface, UINT *width, UINT *height) +{ + FIXME("iface %p, width %p, height %p stub!\n", iface, width, height); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMaximumFrameLatency(IDXGISwapChain2 *iface, UINT max_latency) +{ + FIXME("iface %p, max_latency %u stub!\n", iface, max_latency); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMaximumFrameLatency(IDXGISwapChain2 *iface, UINT *max_latency) +{ + FIXME("iface %p, max_latency %p stub!\n", iface, max_latency); + + return E_NOTIMPL; +} + +static HANDLE STDMETHODCALLTYPE d3d11_swapchain_GetFrameLatencyWaitableObject(IDXGISwapChain2 *iface) +{ + FIXME("iface %p stub!\n", iface); + + return NULL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapChain2 *iface, + const DXGI_MATRIX_3X2_F *matrix) +{ + FIXME("iface %p, matrix %p stub!\n", iface, matrix); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapChain2 *iface, + DXGI_MATRIX_3X2_F *matrix) +{ + FIXME("iface %p, matrix %p stub!\n", iface, matrix); + + return E_NOTIMPL; +} + +static const struct IDXGISwapChain2Vtbl d3d11_swapchain_vtbl = { /* IUnknown methods */ d3d11_swapchain_QueryInterface, @@ -796,6 +850,14 @@ static const struct IDXGISwapChain1Vtbl d3d11_swapchain_vtbl = d3d11_swapchain_GetBackgroundColor, d3d11_swapchain_SetRotation, d3d11_swapchain_GetRotation, + /* IDXGISwapChain2 methods */ + d3d11_swapchain_SetSourceSize, + d3d11_swapchain_GetSourceSize, + d3d11_swapchain_SetMaximumFrameLatency, + d3d11_swapchain_GetMaximumFrameLatency, + d3d11_swapchain_GetFrameLatencyWaitableObject, + d3d11_swapchain_SetMatrixTransform, + d3d11_swapchain_GetMatrixTransform, };
static void STDMETHODCALLTYPE d3d11_swapchain_wined3d_object_released(void *parent) @@ -888,7 +950,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi } IWineDXGIDevice_AddRef(swapchain->device = &device->IWineDXGIDevice_iface);
- swapchain->IDXGISwapChain1_iface.lpVtbl = &d3d11_swapchain_vtbl; + swapchain->IDXGISwapChain2_iface.lpVtbl = &d3d11_swapchain_vtbl; swapchain->state_parent.ops = &d3d11_swapchain_state_parent_ops; swapchain->refcount = 1; wined3d_mutex_lock(); @@ -922,7 +984,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi { desc->windowed = FALSE;
- if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(&swapchain->IDXGISwapChain1_iface, + if (FAILED(hr = IDXGISwapChain2_GetContainingOutput(&swapchain->IDXGISwapChain2_iface, &swapchain->target))) { WARN("Failed to get target output for fullscreen swapchain, hr %#lx.\n", hr);
From: Brendan Shanks bshanks@codeweavers.com
--- dlls/dxgi/device.c | 2 +- dlls/dxgi/dxgi_private.h | 2 +- dlls/dxgi/swapchain.c | 173 ++++++++++++++++++++++++--------------- 3 files changed, 110 insertions(+), 67 deletions(-)
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index f4acbdc0ff0..b0f1db40d8f 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -470,7 +470,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain(IWineDX
TRACE("Created swapchain %p.\n", object);
- *swapchain = (IDXGISwapChain1 *)&object->IDXGISwapChain2_iface; + *swapchain = (IDXGISwapChain1 *)&object->IDXGISwapChain3_iface;
return S_OK; } diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h index 21275d35ec9..a8929448bdb 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -172,7 +172,7 @@ struct dxgi_adapter *unsafe_impl_from_IDXGIAdapter(IDXGIAdapter *iface); /* IDXGISwapChain */ struct d3d11_swapchain { - IDXGISwapChain2 IDXGISwapChain2_iface; + IDXGISwapChain3 IDXGISwapChain3_iface; LONG refcount; struct wined3d_private_store private_store; struct wined3d_swapchain *wined3d_swapchain; diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 026fa7fd611..2c1cdc51dd8 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -180,14 +180,14 @@ static HWND d3d11_swapchain_get_hwnd(struct d3d11_swapchain *swapchain) return wined3d_desc.device_window; }
-static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain2(IDXGISwapChain2 *iface) +static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface) { - return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain2_iface); + return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain3_iface); }
/* IUnknown methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain2 *iface, REFIID riid, void **object) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain3 *iface, REFIID riid, void **object) { TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
@@ -196,7 +196,8 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain2 || IsEqualGUID(riid, &IID_IDXGIDeviceSubObject) || IsEqualGUID(riid, &IID_IDXGISwapChain) || IsEqualGUID(riid, &IID_IDXGISwapChain1) - || IsEqualGUID(riid, &IID_IDXGISwapChain2)) + || IsEqualGUID(riid, &IID_IDXGISwapChain2) + || IsEqualGUID(riid, &IID_IDXGISwapChain3)) { IUnknown_AddRef(iface); *object = iface; @@ -209,9 +210,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain2 return E_NOINTERFACE; }
-static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain2 *iface) +static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain3 *iface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); ULONG refcount = InterlockedIncrement(&swapchain->refcount);
TRACE("%p increasing refcount to %lu.\n", swapchain, refcount); @@ -222,9 +223,9 @@ static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain2 *iface) return refcount; }
-static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain2 *iface) +static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain3 *iface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); ULONG refcount = InterlockedDecrement(&swapchain->refcount);
TRACE("%p decreasing refcount to %lu.\n", swapchain, refcount); @@ -247,39 +248,39 @@ static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain2 *iface)
/* IDXGIObject methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateData(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateData(IDXGISwapChain3 *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(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 d3d11_swapchain_SetPrivateDataInterface(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateDataInterface(IDXGISwapChain3 *iface, REFGUID guid, const IUnknown *object) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(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 d3d11_swapchain_GetPrivateData(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetPrivateData(IDXGISwapChain3 *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
return dxgi_get_private_data(&swapchain->private_store, guid, data_size, data); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain2 *iface, REFIID riid, void **parent) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain3 *iface, REFIID riid, void **parent) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent);
@@ -288,9 +289,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain2 *ifac
/* IDXGIDeviceSubObject methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDevice(IDXGISwapChain2 *iface, REFIID riid, void **device) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDevice(IDXGISwapChain3 *iface, REFIID riid, void **device) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, riid %s, device %p.\n", iface, debugstr_guid(riid), device);
@@ -326,19 +327,19 @@ static HRESULT d3d11_swapchain_present(struct d3d11_swapchain *swapchain, return hr; }
-static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_Present(IDXGISwapChain2 *iface, UINT sync_interval, UINT flags) +static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_Present(IDXGISwapChain3 *iface, UINT sync_interval, UINT flags) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, sync_interval %u, flags %#x.\n", iface, sync_interval, flags);
return d3d11_swapchain_present(swapchain, sync_interval, flags); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain3 *iface, UINT buffer_idx, REFIID riid, void **surface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_texture *texture; IUnknown *parent; HRESULT hr; @@ -361,10 +362,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain2 *ifac return hr; }
-static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreenState(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreenState(IDXGISwapChain3 *iface, BOOL fullscreen, IDXGIOutput *target) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_desc swapchain_desc; struct wined3d_swapchain_state *state; struct dxgi_output *dxgi_output; @@ -384,7 +385,7 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen { IDXGIOutput_AddRef(target); } - else if (FAILED(hr = IDXGISwapChain2_GetContainingOutput(iface, &target))) + else if (FAILED(hr = IDXGISwapChain3_GetContainingOutput(iface, &target))) { WARN("Failed to get target output for swapchain, hr %#lx.\n", hr); return hr; @@ -399,7 +400,7 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen { WARN("Nested invocation of SetFullscreenState.\n"); IDXGIOutput_Release(target); - IDXGISwapChain2_GetFullscreenState(iface, &old_fs, NULL); + IDXGISwapChain3_GetFullscreenState(iface, &old_fs, NULL); return old_fs == fullscreen ? S_OK : DXGI_STATUS_MODE_CHANGE_IN_PROGRESS; }
@@ -432,10 +433,10 @@ done: return hr; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapChain3 *iface, BOOL *fullscreen, IDXGIOutput **target) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_desc swapchain_desc; HRESULT hr;
@@ -455,7 +456,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha { if (!swapchain_desc.windowed) { - if (!swapchain->target && FAILED(hr = IDXGISwapChain2_GetContainingOutput(iface, &swapchain->target))) + if (!swapchain->target && FAILED(hr = IDXGISwapChain3_GetContainingOutput(iface, &swapchain->target))) return hr;
*target = swapchain->target; @@ -470,9 +471,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain2 *iface, DXGI_SWAP_CHAIN_DESC *desc) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain3 *iface, DXGI_SWAP_CHAIN_DESC *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -511,10 +512,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain2 *iface, static HRESULT d3d11_swapchain_create_d3d11_textures(struct d3d11_swapchain *swapchain, IWineDXGIDevice *device, struct wined3d_swapchain_desc *desc);
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain3 *iface, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_desc wined3d_desc; struct wined3d_texture *texture; IUnknown *parent; @@ -555,10 +556,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain2 * return hr; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain3 *iface, const DXGI_MODE_DESC *target_mode_desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_state *state;
TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc); @@ -568,9 +569,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain2 *i return dxgi_swapchain_resize_target(state, target_mode_desc); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain2 *iface, IDXGIOutput **output) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain3 *iface, IDXGIOutput **output) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); HWND window;
TRACE("iface %p, output %p.\n", iface, output); @@ -585,7 +586,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapCh return dxgi_get_output_from_window(swapchain->factory, window, output); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapChain3 *iface, DXGI_FRAME_STATISTICS *stats) { FIXME("iface %p, stats %p stub!\n", iface, stats); @@ -593,10 +594,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapCha return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapChain3 *iface, UINT *last_present_count) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, last_present_count %p.\n", iface, last_present_count);
@@ -607,9 +608,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapCh
/* IDXGISwapChain1 methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain2 *iface, DXGI_SWAP_CHAIN_DESC1 *desc) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain3 *iface, DXGI_SWAP_CHAIN_DESC1 *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -642,10 +643,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain2 *iface return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChain3 *iface, DXGI_SWAP_CHAIN_FULLSCREEN_DESC *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -671,9 +672,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChai return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain2 *iface, HWND *hwnd) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain3 *iface, HWND *hwnd) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, hwnd %p.\n", iface, hwnd);
@@ -687,7 +688,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain2 *iface, return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain3 *iface, REFIID iid, void **core_window) { FIXME("iface %p, iid %s, core_window %p stub!\n", iface, debugstr_guid(iid), core_window); @@ -698,10 +699,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain2 * return DXGI_ERROR_INVALID_CALL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain3 *iface, UINT sync_interval, UINT flags, const DXGI_PRESENT_PARAMETERS *present_parameters) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain2(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface);
TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n", iface, sync_interval, flags, present_parameters); @@ -712,14 +713,14 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain2 *iface return d3d11_swapchain_present(swapchain, sync_interval, flags); }
-static BOOL STDMETHODCALLTYPE d3d11_swapchain_IsTemporaryMonoSupported(IDXGISwapChain2 *iface) +static BOOL STDMETHODCALLTYPE d3d11_swapchain_IsTemporaryMonoSupported(IDXGISwapChain3 *iface) { FIXME("iface %p stub!\n", iface);
return FALSE; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapChain2 *iface, IDXGIOutput **output) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapChain3 *iface, IDXGIOutput **output) { FIXME("iface %p, output %p stub!\n", iface, output);
@@ -733,28 +734,28 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapCh return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetBackgroundColor(IDXGISwapChain2 *iface, const DXGI_RGBA *color) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetBackgroundColor(IDXGISwapChain3 *iface, const DXGI_RGBA *color) { FIXME("iface %p, color %p stub!\n", iface, color);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBackgroundColor(IDXGISwapChain2 *iface, DXGI_RGBA *color) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBackgroundColor(IDXGISwapChain3 *iface, DXGI_RGBA *color) { FIXME("iface %p, color %p stub!\n", iface, color);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetRotation(IDXGISwapChain2 *iface, DXGI_MODE_ROTATION rotation) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetRotation(IDXGISwapChain3 *iface, DXGI_MODE_ROTATION rotation) { FIXME("iface %p, rotation %#x stub!\n", iface, rotation);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain2 *iface, DXGI_MODE_ROTATION *rotation) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain3 *iface, DXGI_MODE_ROTATION *rotation) { FIXME("iface %p, rotation %p stub!\n", iface, rotation);
@@ -763,42 +764,42 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain2 *if
/* IDXGISwapChain2 methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetSourceSize(IDXGISwapChain2 *iface, UINT width, UINT height) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetSourceSize(IDXGISwapChain3 *iface, UINT width, UINT height) { FIXME("iface %p, width %u, height %u stub!\n", iface, width, height);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetSourceSize(IDXGISwapChain2 *iface, UINT *width, UINT *height) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetSourceSize(IDXGISwapChain3 *iface, UINT *width, UINT *height) { FIXME("iface %p, width %p, height %p stub!\n", iface, width, height);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMaximumFrameLatency(IDXGISwapChain2 *iface, UINT max_latency) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMaximumFrameLatency(IDXGISwapChain3 *iface, UINT max_latency) { FIXME("iface %p, max_latency %u stub!\n", iface, max_latency);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMaximumFrameLatency(IDXGISwapChain2 *iface, UINT *max_latency) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMaximumFrameLatency(IDXGISwapChain3 *iface, UINT *max_latency) { FIXME("iface %p, max_latency %p stub!\n", iface, max_latency);
return E_NOTIMPL; }
-static HANDLE STDMETHODCALLTYPE d3d11_swapchain_GetFrameLatencyWaitableObject(IDXGISwapChain2 *iface) +static HANDLE STDMETHODCALLTYPE d3d11_swapchain_GetFrameLatencyWaitableObject(IDXGISwapChain3 *iface) { FIXME("iface %p stub!\n", iface);
return NULL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapChain3 *iface, const DXGI_MATRIX_3X2_F *matrix) { FIXME("iface %p, matrix %p stub!\n", iface, matrix); @@ -806,7 +807,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapCha return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapChain2 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapChain3 *iface, DXGI_MATRIX_3X2_F *matrix) { FIXME("iface %p, matrix %p stub!\n", iface, matrix); @@ -814,7 +815,44 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapCha return E_NOTIMPL; }
-static const struct IDXGISwapChain2Vtbl d3d11_swapchain_vtbl = +/* IDXGISwapChain3 methods */ + +static UINT STDMETHODCALLTYPE d3d11_swapchain_GetCurrentBackBufferIndex(IDXGISwapChain3 *iface) +{ + FIXME("iface %p stub!\n", iface); + + return 0; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_CheckColorSpaceSupport(IDXGISwapChain3 *iface, + DXGI_COLOR_SPACE_TYPE colour_space, UINT *colour_space_support) +{ + FIXME("iface %p, colour_space %#x, colour_space_support %p stub!\n", + iface, colour_space, colour_space_support); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetColorSpace1(IDXGISwapChain3 *iface, + DXGI_COLOR_SPACE_TYPE colour_space) +{ + FIXME("iface %p, colour_space %#x stub!\n", iface, colour_space); + + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers1(IDXGISwapChain3 *iface, + UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags, + const UINT *node_mask, IUnknown * const *present_queue) +{ + FIXME("iface %p, buffer_count %u, width %u, height %u, format %s, flags %#x, " + "node_mask %p, present_queue %p stub!\n", + iface, buffer_count, width, height, debug_dxgi_format(format), flags, node_mask, present_queue); + + return E_NOTIMPL; +} + +static const struct IDXGISwapChain3Vtbl d3d11_swapchain_vtbl = { /* IUnknown methods */ d3d11_swapchain_QueryInterface, @@ -858,6 +896,11 @@ static const struct IDXGISwapChain2Vtbl d3d11_swapchain_vtbl = d3d11_swapchain_GetFrameLatencyWaitableObject, d3d11_swapchain_SetMatrixTransform, d3d11_swapchain_GetMatrixTransform, + /* IDXGISwapChain3 methods */ + d3d11_swapchain_GetCurrentBackBufferIndex, + d3d11_swapchain_CheckColorSpaceSupport, + d3d11_swapchain_SetColorSpace1, + d3d11_swapchain_ResizeBuffers1, };
static void STDMETHODCALLTYPE d3d11_swapchain_wined3d_object_released(void *parent) @@ -950,7 +993,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi } IWineDXGIDevice_AddRef(swapchain->device = &device->IWineDXGIDevice_iface);
- swapchain->IDXGISwapChain2_iface.lpVtbl = &d3d11_swapchain_vtbl; + swapchain->IDXGISwapChain3_iface.lpVtbl = &d3d11_swapchain_vtbl; swapchain->state_parent.ops = &d3d11_swapchain_state_parent_ops; swapchain->refcount = 1; wined3d_mutex_lock(); @@ -984,7 +1027,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi { desc->windowed = FALSE;
- if (FAILED(hr = IDXGISwapChain2_GetContainingOutput(&swapchain->IDXGISwapChain2_iface, + if (FAILED(hr = IDXGISwapChain3_GetContainingOutput(&swapchain->IDXGISwapChain3_iface, &swapchain->target))) { WARN("Failed to get target output for fullscreen swapchain, hr %#lx.\n", hr);
From: Brendan Shanks bshanks@codeweavers.com
Microsoft Flight Simulator (2020) requires IDXGISwapChain4. --- dlls/dxgi/device.c | 2 +- dlls/dxgi/dxgi_private.h | 2 +- dlls/dxgi/swapchain.c | 151 +++++++++++++++++++++------------------ 3 files changed, 84 insertions(+), 71 deletions(-)
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index b0f1db40d8f..dec9425073c 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -470,7 +470,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain(IWineDX
TRACE("Created swapchain %p.\n", object);
- *swapchain = (IDXGISwapChain1 *)&object->IDXGISwapChain3_iface; + *swapchain = (IDXGISwapChain1 *)&object->IDXGISwapChain4_iface;
return S_OK; } diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h index a8929448bdb..164bc107c6e 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -172,7 +172,7 @@ struct dxgi_adapter *unsafe_impl_from_IDXGIAdapter(IDXGIAdapter *iface); /* IDXGISwapChain */ struct d3d11_swapchain { - IDXGISwapChain3 IDXGISwapChain3_iface; + IDXGISwapChain4 IDXGISwapChain4_iface; LONG refcount; struct wined3d_private_store private_store; struct wined3d_swapchain *wined3d_swapchain; diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 2c1cdc51dd8..4797fcecd8d 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -180,14 +180,14 @@ static HWND d3d11_swapchain_get_hwnd(struct d3d11_swapchain *swapchain) return wined3d_desc.device_window; }
-static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface) +static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain4(IDXGISwapChain4 *iface) { - return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain3_iface); + return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain4_iface); }
/* IUnknown methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain3 *iface, REFIID riid, void **object) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain4 *iface, REFIID riid, void **object) { TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
@@ -197,7 +197,8 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain3 || IsEqualGUID(riid, &IID_IDXGISwapChain) || IsEqualGUID(riid, &IID_IDXGISwapChain1) || IsEqualGUID(riid, &IID_IDXGISwapChain2) - || IsEqualGUID(riid, &IID_IDXGISwapChain3)) + || IsEqualGUID(riid, &IID_IDXGISwapChain3) + || IsEqualGUID(riid, &IID_IDXGISwapChain4)) { IUnknown_AddRef(iface); *object = iface; @@ -210,9 +211,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_QueryInterface(IDXGISwapChain3 return E_NOINTERFACE; }
-static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain3 *iface) +static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain4 *iface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); ULONG refcount = InterlockedIncrement(&swapchain->refcount);
TRACE("%p increasing refcount to %lu.\n", swapchain, refcount); @@ -223,9 +224,9 @@ static ULONG STDMETHODCALLTYPE d3d11_swapchain_AddRef(IDXGISwapChain3 *iface) return refcount; }
-static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain3 *iface) +static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain4 *iface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); ULONG refcount = InterlockedDecrement(&swapchain->refcount);
TRACE("%p decreasing refcount to %lu.\n", swapchain, refcount); @@ -248,39 +249,39 @@ static ULONG STDMETHODCALLTYPE d3d11_swapchain_Release(IDXGISwapChain3 *iface)
/* IDXGIObject methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateData(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateData(IDXGISwapChain4 *iface, REFGUID guid, UINT data_size, const void *data) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(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 d3d11_swapchain_SetPrivateDataInterface(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetPrivateDataInterface(IDXGISwapChain4 *iface, REFGUID guid, const IUnknown *object) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(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 d3d11_swapchain_GetPrivateData(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetPrivateData(IDXGISwapChain4 *iface, REFGUID guid, UINT *data_size, void *data) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
return dxgi_get_private_data(&swapchain->private_store, guid, data_size, data); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain3 *iface, REFIID riid, void **parent) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain4 *iface, REFIID riid, void **parent) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent);
@@ -289,9 +290,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetParent(IDXGISwapChain3 *ifac
/* IDXGIDeviceSubObject methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDevice(IDXGISwapChain3 *iface, REFIID riid, void **device) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDevice(IDXGISwapChain4 *iface, REFIID riid, void **device) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, riid %s, device %p.\n", iface, debugstr_guid(riid), device);
@@ -327,19 +328,19 @@ static HRESULT d3d11_swapchain_present(struct d3d11_swapchain *swapchain, return hr; }
-static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_Present(IDXGISwapChain3 *iface, UINT sync_interval, UINT flags) +static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_Present(IDXGISwapChain4 *iface, UINT sync_interval, UINT flags) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, sync_interval %u, flags %#x.\n", iface, sync_interval, flags);
return d3d11_swapchain_present(swapchain, sync_interval, flags); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain4 *iface, UINT buffer_idx, REFIID riid, void **surface) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_texture *texture; IUnknown *parent; HRESULT hr; @@ -362,10 +363,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBuffer(IDXGISwapChain3 *ifac return hr; }
-static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreenState(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreenState(IDXGISwapChain4 *iface, BOOL fullscreen, IDXGIOutput *target) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_desc swapchain_desc; struct wined3d_swapchain_state *state; struct dxgi_output *dxgi_output; @@ -385,7 +386,7 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen { IDXGIOutput_AddRef(target); } - else if (FAILED(hr = IDXGISwapChain3_GetContainingOutput(iface, &target))) + else if (FAILED(hr = IDXGISwapChain4_GetContainingOutput(iface, &target))) { WARN("Failed to get target output for swapchain, hr %#lx.\n", hr); return hr; @@ -400,7 +401,7 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen { WARN("Nested invocation of SetFullscreenState.\n"); IDXGIOutput_Release(target); - IDXGISwapChain3_GetFullscreenState(iface, &old_fs, NULL); + IDXGISwapChain4_GetFullscreenState(iface, &old_fs, NULL); return old_fs == fullscreen ? S_OK : DXGI_STATUS_MODE_CHANGE_IN_PROGRESS; }
@@ -433,10 +434,10 @@ done: return hr; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapChain4 *iface, BOOL *fullscreen, IDXGIOutput **target) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_desc swapchain_desc; HRESULT hr;
@@ -456,7 +457,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha { if (!swapchain_desc.windowed) { - if (!swapchain->target && FAILED(hr = IDXGISwapChain3_GetContainingOutput(iface, &swapchain->target))) + if (!swapchain->target && FAILED(hr = IDXGISwapChain4_GetContainingOutput(iface, &swapchain->target))) return hr;
*target = swapchain->target; @@ -471,9 +472,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain3 *iface, DXGI_SWAP_CHAIN_DESC *desc) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain4 *iface, DXGI_SWAP_CHAIN_DESC *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -512,10 +513,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain3 *iface, static HRESULT d3d11_swapchain_create_d3d11_textures(struct d3d11_swapchain *swapchain, IWineDXGIDevice *device, struct wined3d_swapchain_desc *desc);
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain4 *iface, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_desc wined3d_desc; struct wined3d_texture *texture; IUnknown *parent; @@ -556,10 +557,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain3 * return hr; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain4 *iface, const DXGI_MODE_DESC *target_mode_desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_state *state;
TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc); @@ -569,9 +570,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain3 *i return dxgi_swapchain_resize_target(state, target_mode_desc); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain3 *iface, IDXGIOutput **output) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain4 *iface, IDXGIOutput **output) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); HWND window;
TRACE("iface %p, output %p.\n", iface, output); @@ -586,7 +587,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapCh return dxgi_get_output_from_window(swapchain->factory, window, output); }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapChain4 *iface, DXGI_FRAME_STATISTICS *stats) { FIXME("iface %p, stats %p stub!\n", iface, stats); @@ -594,10 +595,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFrameStatistics(IDXGISwapCha return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapChain4 *iface, UINT *last_present_count) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, last_present_count %p.\n", iface, last_present_count);
@@ -608,9 +609,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetLastPresentCount(IDXGISwapCh
/* IDXGISwapChain1 methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain3 *iface, DXGI_SWAP_CHAIN_DESC1 *desc) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain4 *iface, DXGI_SWAP_CHAIN_DESC1 *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -643,10 +644,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain3 *iface return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChain4 *iface, DXGI_SWAP_CHAIN_FULLSCREEN_DESC *desc) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); struct wined3d_swapchain_desc wined3d_desc;
TRACE("iface %p, desc %p.\n", iface, desc); @@ -672,9 +673,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenDesc(IDXGISwapChai return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain3 *iface, HWND *hwnd) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain4 *iface, HWND *hwnd) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, hwnd %p.\n", iface, hwnd);
@@ -688,7 +689,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetHwnd(IDXGISwapChain3 *iface, return S_OK; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain4 *iface, REFIID iid, void **core_window) { FIXME("iface %p, iid %s, core_window %p stub!\n", iface, debugstr_guid(iid), core_window); @@ -699,10 +700,10 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetCoreWindow(IDXGISwapChain3 * return DXGI_ERROR_INVALID_CALL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain4 *iface, UINT sync_interval, UINT flags, const DXGI_PRESENT_PARAMETERS *present_parameters) { - struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain3(iface); + struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface);
TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n", iface, sync_interval, flags, present_parameters); @@ -713,14 +714,14 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain3 *iface return d3d11_swapchain_present(swapchain, sync_interval, flags); }
-static BOOL STDMETHODCALLTYPE d3d11_swapchain_IsTemporaryMonoSupported(IDXGISwapChain3 *iface) +static BOOL STDMETHODCALLTYPE d3d11_swapchain_IsTemporaryMonoSupported(IDXGISwapChain4 *iface) { FIXME("iface %p stub!\n", iface);
return FALSE; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapChain3 *iface, IDXGIOutput **output) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapChain4 *iface, IDXGIOutput **output) { FIXME("iface %p, output %p stub!\n", iface, output);
@@ -734,28 +735,28 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRestrictToOutput(IDXGISwapCh return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetBackgroundColor(IDXGISwapChain3 *iface, const DXGI_RGBA *color) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetBackgroundColor(IDXGISwapChain4 *iface, const DXGI_RGBA *color) { FIXME("iface %p, color %p stub!\n", iface, color);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBackgroundColor(IDXGISwapChain3 *iface, DXGI_RGBA *color) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetBackgroundColor(IDXGISwapChain4 *iface, DXGI_RGBA *color) { FIXME("iface %p, color %p stub!\n", iface, color);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetRotation(IDXGISwapChain3 *iface, DXGI_MODE_ROTATION rotation) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetRotation(IDXGISwapChain4 *iface, DXGI_MODE_ROTATION rotation) { FIXME("iface %p, rotation %#x stub!\n", iface, rotation);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain3 *iface, DXGI_MODE_ROTATION *rotation) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain4 *iface, DXGI_MODE_ROTATION *rotation) { FIXME("iface %p, rotation %p stub!\n", iface, rotation);
@@ -764,42 +765,42 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetRotation(IDXGISwapChain3 *if
/* IDXGISwapChain2 methods */
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetSourceSize(IDXGISwapChain3 *iface, UINT width, UINT height) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetSourceSize(IDXGISwapChain4 *iface, UINT width, UINT height) { FIXME("iface %p, width %u, height %u stub!\n", iface, width, height);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetSourceSize(IDXGISwapChain3 *iface, UINT *width, UINT *height) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetSourceSize(IDXGISwapChain4 *iface, UINT *width, UINT *height) { FIXME("iface %p, width %p, height %p stub!\n", iface, width, height);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMaximumFrameLatency(IDXGISwapChain3 *iface, UINT max_latency) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMaximumFrameLatency(IDXGISwapChain4 *iface, UINT max_latency) { FIXME("iface %p, max_latency %u stub!\n", iface, max_latency);
return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMaximumFrameLatency(IDXGISwapChain3 *iface, UINT *max_latency) +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMaximumFrameLatency(IDXGISwapChain4 *iface, UINT *max_latency) { FIXME("iface %p, max_latency %p stub!\n", iface, max_latency);
return E_NOTIMPL; }
-static HANDLE STDMETHODCALLTYPE d3d11_swapchain_GetFrameLatencyWaitableObject(IDXGISwapChain3 *iface) +static HANDLE STDMETHODCALLTYPE d3d11_swapchain_GetFrameLatencyWaitableObject(IDXGISwapChain4 *iface) { FIXME("iface %p stub!\n", iface);
return NULL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapChain4 *iface, const DXGI_MATRIX_3X2_F *matrix) { FIXME("iface %p, matrix %p stub!\n", iface, matrix); @@ -807,7 +808,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetMatrixTransform(IDXGISwapCha return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapChain4 *iface, DXGI_MATRIX_3X2_F *matrix) { FIXME("iface %p, matrix %p stub!\n", iface, matrix); @@ -817,14 +818,14 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetMatrixTransform(IDXGISwapCha
/* IDXGISwapChain3 methods */
-static UINT STDMETHODCALLTYPE d3d11_swapchain_GetCurrentBackBufferIndex(IDXGISwapChain3 *iface) +static UINT STDMETHODCALLTYPE d3d11_swapchain_GetCurrentBackBufferIndex(IDXGISwapChain4 *iface) { FIXME("iface %p stub!\n", iface);
return 0; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_CheckColorSpaceSupport(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_CheckColorSpaceSupport(IDXGISwapChain4 *iface, DXGI_COLOR_SPACE_TYPE colour_space, UINT *colour_space_support) { FIXME("iface %p, colour_space %#x, colour_space_support %p stub!\n", @@ -833,7 +834,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_CheckColorSpaceSupport(IDXGISwa return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetColorSpace1(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetColorSpace1(IDXGISwapChain4 *iface, DXGI_COLOR_SPACE_TYPE colour_space) { FIXME("iface %p, colour_space %#x stub!\n", iface, colour_space); @@ -841,7 +842,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetColorSpace1(IDXGISwapChain3 return E_NOTIMPL; }
-static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers1(IDXGISwapChain3 *iface, +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers1(IDXGISwapChain4 *iface, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags, const UINT *node_mask, IUnknown * const *present_queue) { @@ -852,7 +853,17 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers1(IDXGISwapChain3 return E_NOTIMPL; }
-static const struct IDXGISwapChain3Vtbl d3d11_swapchain_vtbl = +/* IDXGISwapChain4 methods */ + +static HRESULT STDMETHODCALLTYPE d3d11_swapchain_SetHDRMetaData(IDXGISwapChain4 *iface, + DXGI_HDR_METADATA_TYPE type, UINT size, void *metadata) +{ + FIXME("iface %p, type %#x, size %#x, metadata %p stub!\n", iface, type, size, metadata); + + return E_NOTIMPL; +} + +static const struct IDXGISwapChain4Vtbl d3d11_swapchain_vtbl = { /* IUnknown methods */ d3d11_swapchain_QueryInterface, @@ -901,6 +912,8 @@ static const struct IDXGISwapChain3Vtbl d3d11_swapchain_vtbl = d3d11_swapchain_CheckColorSpaceSupport, d3d11_swapchain_SetColorSpace1, d3d11_swapchain_ResizeBuffers1, + /* IDXGISwapChain4 methods */ + d3d11_swapchain_SetHDRMetaData, };
static void STDMETHODCALLTYPE d3d11_swapchain_wined3d_object_released(void *parent) @@ -993,7 +1006,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi } IWineDXGIDevice_AddRef(swapchain->device = &device->IWineDXGIDevice_iface);
- swapchain->IDXGISwapChain3_iface.lpVtbl = &d3d11_swapchain_vtbl; + swapchain->IDXGISwapChain4_iface.lpVtbl = &d3d11_swapchain_vtbl; swapchain->state_parent.ops = &d3d11_swapchain_state_parent_ops; swapchain->refcount = 1; wined3d_mutex_lock(); @@ -1027,7 +1040,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi { desc->windowed = FALSE;
- if (FAILED(hr = IDXGISwapChain3_GetContainingOutput(&swapchain->IDXGISwapChain3_iface, + if (FAILED(hr = IDXGISwapChain4_GetContainingOutput(&swapchain->IDXGISwapChain4_iface, &swapchain->target))) { WARN("Failed to get target output for fullscreen swapchain, hr %#lx.\n", hr);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=144911
Your paranoid android.
=== debian11 (32 bit report) ===
dxgi: dxgi.c:4338: Test failed: Got unexpected hr 0x80004001.
=== debian11b (64 bit WoW report) ===
dxgi: dxgi.c:4338: Test failed: Got unexpected hr 0x80004001.
This is now causing a test failure in test_swapchain_resize() due to a no longer skipped test; I imagine we want to add a todo_wine there (and possibly change the skip to a win_skip).