Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2019
- 65 participants
- 633 messages
[PATCH 3/7] dxgi: Implement d3d12_swapchain_ResizeTarget().
by Henri Verbeet
From: Conor McCarthy <cmccarthy(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 167238.
dlls/dxgi/device.c | 44 ++-------------------------
dlls/dxgi/dxgi_private.h | 5 ++--
dlls/dxgi/swapchain.c | 75 +++++++++++++++++++++++++++++++----------------
dlls/dxgi/utils.c | 53 +++++++++++++++++++++++++++++++--
dlls/wined3d/swapchain.c | 23 +++++++++++++++
dlls/wined3d/wined3d.spec | 2 ++
include/wine/wined3d.h | 3 ++
7 files changed, 133 insertions(+), 72 deletions(-)
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index e3dc52b8ed6..5500452653e 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -425,48 +425,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain(IWineDX
TRACE("iface %p, factory %p, window %p, desc %p, fullscreen_desc %p, output %p, swapchain %p.\n",
iface, factory, window, desc, fullscreen_desc, output, swapchain);
- if (desc->Scaling != DXGI_SCALING_STRETCH)
- FIXME("Ignoring scaling %#x.\n", desc->Scaling);
- if (desc->AlphaMode != DXGI_ALPHA_MODE_IGNORE)
- FIXME("Ignoring alpha mode %#x.\n", desc->AlphaMode);
- if (fullscreen_desc && fullscreen_desc->ScanlineOrdering)
- FIXME("Unhandled scanline ordering %#x.\n", fullscreen_desc->ScanlineOrdering);
- if (fullscreen_desc && fullscreen_desc->Scaling)
- FIXME("Unhandled mode scaling %#x.\n", fullscreen_desc->Scaling);
-
- switch (desc->SwapEffect)
- {
- case DXGI_SWAP_EFFECT_DISCARD:
- wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
- break;
- case DXGI_SWAP_EFFECT_SEQUENTIAL:
- wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_SEQUENTIAL;
- break;
- case DXGI_SWAP_EFFECT_FLIP_DISCARD:
- wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_FLIP_DISCARD;
- break;
- case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL:
- wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_FLIP_SEQUENTIAL;
- break;
- default:
- WARN("Invalid swap effect %#x.\n", desc->SwapEffect);
- return DXGI_ERROR_INVALID_CALL;
- }
-
- wined3d_desc.backbuffer_width = desc->Width;
- wined3d_desc.backbuffer_height = desc->Height;
- wined3d_desc.backbuffer_format = wined3dformat_from_dxgi_format(desc->Format);
- wined3d_desc.backbuffer_count = desc->BufferCount;
- wined3d_desc.backbuffer_bind_flags = wined3d_bind_flags_from_dxgi_usage(desc->BufferUsage);
- wined3d_sample_desc_from_dxgi(&wined3d_desc.multisample_type,
- &wined3d_desc.multisample_quality, &desc->SampleDesc);
- wined3d_desc.device_window = window;
- wined3d_desc.windowed = fullscreen_desc ? fullscreen_desc->Windowed : TRUE;
- wined3d_desc.enable_auto_depth_stencil = FALSE;
- wined3d_desc.auto_depth_stencil_format = 0;
- wined3d_desc.flags = wined3d_swapchain_flags_from_dxgi(desc->Flags);
- wined3d_desc.refresh_rate = fullscreen_desc ? dxgi_rational_to_uint(&fullscreen_desc->RefreshRate) : 0;
- wined3d_desc.auto_restore_display_mode = TRUE;
+ if (FAILED(hr = wined3d_swapchain_desc_from_dxgi(&wined3d_desc, window, desc, fullscreen_desc)))
+ return hr;
if (!(object = heap_alloc_zero(sizeof(*object))))
{
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index a17c4da83c1..5b934498349 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -85,7 +85,6 @@ void dump_feature_levels(const D3D_FEATURE_LEVEL *feature_levels, unsigned int l
DXGI_FORMAT dxgi_format_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN;
enum wined3d_format_id wined3dformat_from_dxgi_format(DXGI_FORMAT format) DECLSPEC_HIDDEN;
-UINT dxgi_rational_to_uint(const DXGI_RATIONAL *rational) DECLSPEC_HIDDEN;
void dxgi_sample_desc_from_wined3d(DXGI_SAMPLE_DESC *desc,
enum wined3d_multisample_type wined3d_type, unsigned int wined3d_quality) DECLSPEC_HIDDEN;
void wined3d_sample_desc_from_dxgi(enum wined3d_multisample_type *wined3d_type,
@@ -97,7 +96,9 @@ void wined3d_display_mode_from_dxgi1(struct wined3d_display_mode *wined3d_mode,
DXGI_USAGE dxgi_usage_from_wined3d_bind_flags(unsigned int wined3d_bind_flags) DECLSPEC_HIDDEN;
unsigned int wined3d_bind_flags_from_dxgi_usage(DXGI_USAGE usage) DECLSPEC_HIDDEN;
unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags) DECLSPEC_HIDDEN;
-unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags) DECLSPEC_HIDDEN;
+HRESULT wined3d_swapchain_desc_from_dxgi(struct wined3d_swapchain_desc *wined3d_desc,
+ HWND window, const DXGI_SWAP_CHAIN_DESC1 *dxgi_desc,
+ const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *dxgi_fullscreen_desc) DECLSPEC_HIDDEN;
HRESULT dxgi_get_private_data(struct wined3d_private_store *store,
REFGUID guid, UINT *data_size, void *data) DECLSPEC_HIDDEN;
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 6741b3d489c..728fcacccf6 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -152,6 +152,37 @@ static HRESULT dxgi_get_output_from_window(IDXGIAdapter *adapter, HWND window, I
return DXGI_ERROR_NOT_FOUND;
}
+static HRESULT dxgi_swapchain_resize_target(IDXGISwapChain1 *swapchain,
+ struct wined3d_swapchain_state *state, const DXGI_MODE_DESC *target_mode_desc)
+{
+ struct wined3d_display_mode mode;
+ struct dxgi_output *dxgi_output;
+ struct dxgi_adapter *adapter;
+ IDXGIOutput *output;
+ HRESULT hr;
+
+ if (!target_mode_desc)
+ {
+ WARN("Invalid pointer.\n");
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
+ if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(swapchain, &output)))
+ return hr;
+ dxgi_output = unsafe_impl_from_IDXGIOutput(output);
+ adapter = dxgi_output->adapter;
+ IDXGIOutput_Release(output);
+
+ TRACE("Mode: %s.\n", debug_dxgi_mode(target_mode_desc));
+
+ if (target_mode_desc->Scaling)
+ FIXME("Ignoring scaling %#x.\n", target_mode_desc->Scaling);
+
+ wined3d_display_mode_from_dxgi(&mode, target_mode_desc);
+
+ return wined3d_swapchain_state_resize_target(state, adapter->factory->wined3d, adapter->ordinal, &mode);
+}
+
static HWND d3d11_swapchain_get_hwnd(struct d3d11_swapchain *swapchain)
{
struct wined3d_swapchain_desc wined3d_desc;
@@ -521,35 +552,12 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *i
{
struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface);
struct wined3d_swapchain_state *state;
- struct wined3d_display_mode mode;
- struct dxgi_output *dxgi_output;
- struct dxgi_adapter *adapter;
- IDXGIOutput *output;
- HRESULT hr;
TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc);
- if (!target_mode_desc)
- {
- WARN("Invalid pointer.\n");
- return DXGI_ERROR_INVALID_CALL;
- }
-
- if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &output)))
- return hr;
- dxgi_output = unsafe_impl_from_IDXGIOutput(output);
- adapter = dxgi_output->adapter;
- IDXGIOutput_Release(output);
-
- TRACE("Mode: %s.\n", debug_dxgi_mode(target_mode_desc));
-
- if (target_mode_desc->Scaling)
- FIXME("Ignoring scaling %#x.\n", target_mode_desc->Scaling);
-
state = wined3d_swapchain_get_state(swapchain->wined3d_swapchain);
- wined3d_display_mode_from_dxgi(&mode, target_mode_desc);
- return wined3d_swapchain_state_resize_target(state, adapter->factory->wined3d, adapter->ordinal, &mode);
+ return dxgi_swapchain_resize_target(iface, state, target_mode_desc);
}
static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain1 *iface, IDXGIOutput **output)
@@ -1030,6 +1038,8 @@ struct d3d12_swapchain
LONG refcount;
struct wined3d_private_store private_store;
+ struct wined3d_swapchain_state *state;
+
VkSwapchainKHR vk_swapchain;
VkSurfaceKHR vk_surface;
VkFence vk_fence;
@@ -1862,6 +1872,8 @@ static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain)
IWineDXGIFactory_Release(swapchain->factory);
close_library(vulkan_module);
+
+ wined3d_swapchain_state_destroy(swapchain->state);
}
static ULONG STDMETHODCALLTYPE d3d12_swapchain_Release(IDXGISwapChain3 *iface)
@@ -2262,9 +2274,11 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeTarget(IDXGISwapChain3 *iface,
const DXGI_MODE_DESC *target_mode_desc)
{
- FIXME("iface %p, target_mode_desc %p stub!\n", iface, target_mode_desc);
+ struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain3(iface);
- return E_NOTIMPL;
+ TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc);
+
+ return dxgi_swapchain_resize_target((IDXGISwapChain1 *)iface, swapchain->state, target_mode_desc);
}
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetContainingOutput(IDXGISwapChain3 *iface,
@@ -2701,6 +2715,7 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
+ struct wined3d_swapchain_desc wined3d_desc;
VkWin32SurfaceCreateInfoKHR surface_desc;
VkPhysicalDevice vk_physical_device;
VkFenceCreateInfo fence_desc;
@@ -2745,6 +2760,11 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
return DXGI_ERROR_UNSUPPORTED;
}
+ if (FAILED(hr = wined3d_swapchain_desc_from_dxgi(&wined3d_desc, window, swapchain_desc, fullscreen_desc)))
+ return hr;
+ if (FAILED(hr = wined3d_swapchain_state_create(&wined3d_desc, window, &swapchain->state)))
+ return hr;
+
if (swapchain_desc->BufferUsage && swapchain_desc->BufferUsage != DXGI_USAGE_RENDER_TARGET_OUTPUT)
FIXME("Ignoring buffer usage %#x.\n", swapchain_desc->BufferUsage);
if (swapchain_desc->Scaling != DXGI_SCALING_STRETCH)
@@ -2771,7 +2791,10 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
swapchain->vk_physical_device = vk_physical_device;
if (!init_vk_funcs(&swapchain->vk_funcs, vk_instance, vk_device))
+ {
+ wined3d_swapchain_state_destroy(swapchain->state);
return E_FAIL;
+ }
wined3d_private_store_init(&swapchain->private_store);
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index be94bde8478..aece3a6af1c 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -415,7 +415,7 @@ void dump_feature_levels(const D3D_FEATURE_LEVEL *feature_levels, unsigned int l
TRACE(" [%u] = %s.\n", i, debug_feature_level(feature_levels[i]));
}
-UINT dxgi_rational_to_uint(const DXGI_RATIONAL *rational)
+static unsigned int dxgi_rational_to_uint(const DXGI_RATIONAL *rational)
{
if (rational->Denominator)
return rational->Numerator / rational->Denominator;
@@ -537,7 +537,7 @@ unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags)
return flags;
}
-unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags)
+static unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags)
{
unsigned int wined3d_flags = DXGI_WINED3D_SWAPCHAIN_FLAGS; /* WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL? */
@@ -559,6 +559,55 @@ unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags)
return wined3d_flags;
}
+HRESULT wined3d_swapchain_desc_from_dxgi(struct wined3d_swapchain_desc *wined3d_desc, HWND window,
+ const DXGI_SWAP_CHAIN_DESC1 *dxgi_desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *dxgi_fullscreen_desc)
+{
+ if (dxgi_desc->Scaling != DXGI_SCALING_STRETCH)
+ FIXME("Ignoring scaling %#x.\n", dxgi_desc->Scaling);
+ if (dxgi_desc->AlphaMode != DXGI_ALPHA_MODE_IGNORE)
+ FIXME("Ignoring alpha mode %#x.\n", dxgi_desc->AlphaMode);
+ if (dxgi_fullscreen_desc && dxgi_fullscreen_desc->ScanlineOrdering)
+ FIXME("Unhandled scanline ordering %#x.\n", dxgi_fullscreen_desc->ScanlineOrdering);
+ if (dxgi_fullscreen_desc && dxgi_fullscreen_desc->Scaling)
+ FIXME("Unhandled mode scaling %#x.\n", dxgi_fullscreen_desc->Scaling);
+
+ switch (dxgi_desc->SwapEffect)
+ {
+ case DXGI_SWAP_EFFECT_DISCARD:
+ wined3d_desc->swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
+ break;
+ case DXGI_SWAP_EFFECT_SEQUENTIAL:
+ wined3d_desc->swap_effect = WINED3D_SWAP_EFFECT_SEQUENTIAL;
+ break;
+ case DXGI_SWAP_EFFECT_FLIP_DISCARD:
+ wined3d_desc->swap_effect = WINED3D_SWAP_EFFECT_FLIP_DISCARD;
+ break;
+ case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL:
+ wined3d_desc->swap_effect = WINED3D_SWAP_EFFECT_FLIP_SEQUENTIAL;
+ break;
+ default:
+ WARN("Invalid swap effect %#x.\n", dxgi_desc->SwapEffect);
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
+ wined3d_desc->backbuffer_width = dxgi_desc->Width;
+ wined3d_desc->backbuffer_height = dxgi_desc->Height;
+ wined3d_desc->backbuffer_format = wined3dformat_from_dxgi_format(dxgi_desc->Format);
+ wined3d_desc->backbuffer_count = dxgi_desc->BufferCount;
+ wined3d_desc->backbuffer_bind_flags = wined3d_bind_flags_from_dxgi_usage(dxgi_desc->BufferUsage);
+ wined3d_sample_desc_from_dxgi(&wined3d_desc->multisample_type,
+ &wined3d_desc->multisample_quality, &dxgi_desc->SampleDesc);
+ wined3d_desc->device_window = window;
+ wined3d_desc->windowed = dxgi_fullscreen_desc ? dxgi_fullscreen_desc->Windowed : TRUE;
+ wined3d_desc->enable_auto_depth_stencil = FALSE;
+ wined3d_desc->auto_depth_stencil_format = 0;
+ wined3d_desc->flags = wined3d_swapchain_flags_from_dxgi(dxgi_desc->Flags);
+ wined3d_desc->refresh_rate = dxgi_fullscreen_desc ? dxgi_rational_to_uint(&dxgi_fullscreen_desc->RefreshRate) : 0;
+ wined3d_desc->auto_restore_display_mode = TRUE;
+
+ return S_OK;
+}
+
HRESULT dxgi_get_private_data(struct wined3d_private_store *store,
REFGUID guid, UINT *data_size, void *data)
{
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 2669207cfa3..333c3153f68 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1588,3 +1588,26 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
return WINED3D_OK;
}
+
+void CDECL wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state)
+{
+ heap_free(state);
+}
+
+HRESULT CDECL wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc,
+ HWND window, struct wined3d_swapchain_state **state)
+{
+ struct wined3d_swapchain_state *s;
+
+ TRACE("desc %p, window %p, state %p.\n", desc, window, state);
+
+ if (!(s = heap_alloc_zero(sizeof(*s))))
+ return E_OUTOFMEMORY;
+
+ s->desc = *desc;
+ s->device_window = window;
+
+ *state = s;
+
+ return WINED3D_OK;
+}
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index bd91e92c683..01e466e0147 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -278,6 +278,8 @@
@ cdecl wined3d_swapchain_set_palette(ptr ptr)
@ cdecl wined3d_swapchain_set_window(ptr ptr)
+@ cdecl wined3d_swapchain_state_create(ptr ptr ptr)
+@ cdecl wined3d_swapchain_state_destroy(ptr)
@ cdecl wined3d_swapchain_state_resize_target(ptr ptr long ptr)
@ cdecl wined3d_texture_add_dirty_region(ptr long ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index bbb58ba8320..bae2cf86184 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2691,6 +2691,9 @@ HRESULT __cdecl wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain
void __cdecl wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain, struct wined3d_palette *palette);
void __cdecl wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window);
+HRESULT __cdecl wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc,
+ HWND window, struct wined3d_swapchain_state **state);
+void __cdecl wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state);
HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state,
struct wined3d *wined3d, unsigned int adapter_idx, const struct wined3d_display_mode *mode);
--
2.11.0
July 31, 2019
[PATCH 2/7] wined3d: Replace wined3d_swapchain_resize_target() with wined3d_swapchain_state_resize_target().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 167237.
dlls/dxgi/dxgi_private.h | 1 +
dlls/dxgi/output.c | 8 ++++++
dlls/dxgi/swapchain.c | 14 +++++++++-
dlls/wined3d/device.c | 6 ++--
dlls/wined3d/swapchain.c | 63 +++++++++++++++++++++---------------------
dlls/wined3d/wined3d.spec | 4 ++-
dlls/wined3d/wined3d_main.c | 4 +--
dlls/wined3d/wined3d_private.h | 2 +-
include/wine/wined3d.h | 7 +++--
9 files changed, 67 insertions(+), 42 deletions(-)
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 553eacee3b8..a17c4da83c1 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -148,6 +148,7 @@ struct dxgi_output
};
HRESULT dxgi_output_create(struct dxgi_adapter *adapter, struct dxgi_output **output) DECLSPEC_HIDDEN;
+struct dxgi_output *unsafe_impl_from_IDXGIOutput(IDXGIOutput *iface) DECLSPEC_HIDDEN;
/* IDXGIAdapter */
struct dxgi_adapter
diff --git a/dlls/dxgi/output.c b/dlls/dxgi/output.c
index 123dee8c99e..abe1aef950c 100644
--- a/dlls/dxgi/output.c
+++ b/dlls/dxgi/output.c
@@ -522,6 +522,14 @@ static const struct IDXGIOutput4Vtbl dxgi_output_vtbl =
dxgi_output_CheckOverlayColorSpaceSupport,
};
+struct dxgi_output *unsafe_impl_from_IDXGIOutput(IDXGIOutput *iface)
+{
+ if (!iface)
+ return NULL;
+ assert(iface->lpVtbl == (IDXGIOutputVtbl *)&dxgi_output_vtbl);
+ return CONTAINING_RECORD(iface, struct dxgi_output, IDXGIOutput4_iface);
+}
+
static void dxgi_output_init(struct dxgi_output *output, struct dxgi_adapter *adapter)
{
output->IDXGIOutput4_iface.lpVtbl = &dxgi_output_vtbl;
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 963ceee077c..6741b3d489c 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -520,7 +520,12 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *i
const DXGI_MODE_DESC *target_mode_desc)
{
struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface);
+ struct wined3d_swapchain_state *state;
struct wined3d_display_mode mode;
+ struct dxgi_output *dxgi_output;
+ struct dxgi_adapter *adapter;
+ IDXGIOutput *output;
+ HRESULT hr;
TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc);
@@ -530,14 +535,21 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *i
return DXGI_ERROR_INVALID_CALL;
}
+ if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &output)))
+ return hr;
+ dxgi_output = unsafe_impl_from_IDXGIOutput(output);
+ adapter = dxgi_output->adapter;
+ IDXGIOutput_Release(output);
+
TRACE("Mode: %s.\n", debug_dxgi_mode(target_mode_desc));
if (target_mode_desc->Scaling)
FIXME("Ignoring scaling %#x.\n", target_mode_desc->Scaling);
+ state = wined3d_swapchain_get_state(swapchain->wined3d_swapchain);
wined3d_display_mode_from_dxgi(&mode, target_mode_desc);
- return wined3d_swapchain_resize_target(swapchain->wined3d_swapchain, &mode);
+ return wined3d_swapchain_state_resize_target(state, adapter->factory->wined3d, adapter->ordinal, &mode);
}
static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain1 *iface, IDXGIOutput **output)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 30307cc90c3..db1b313fcbf 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5404,7 +5404,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
TRACE("Changing the device window from %p to %p.\n",
current_desc->device_window, swapchain_desc->device_window);
current_desc->device_window = swapchain_desc->device_window;
- swapchain->device_window = swapchain_desc->device_window;
+ swapchain_state->device_window = swapchain_desc->device_window;
wined3d_swapchain_set_window(swapchain, NULL);
}
@@ -5421,7 +5421,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
HWND focus_window = device->create_parms.focus_window;
if (!focus_window)
- focus_window = swapchain->device_window;
+ focus_window = swapchain->state.device_window;
if (FAILED(hr = wined3d_device_acquire_focus_window(device, focus_window)))
{
ERR("Failed to acquire focus window, hr %#x.\n", hr);
@@ -5445,7 +5445,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
* up their mess. Guild Wars also loses the device during that. */
swapchain_state->style = 0;
swapchain_state->exstyle = 0;
- wined3d_swapchain_state_setup_fullscreen(swapchain_state, swapchain->device_window,
+ wined3d_swapchain_state_setup_fullscreen(swapchain_state, swapchain_state->device_window,
swapchain_desc->backbuffer_width, swapchain_desc->backbuffer_height);
swapchain_state->style = style;
swapchain_state->exstyle = exstyle;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 5e207be37e5..2669207cfa3 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -86,13 +86,13 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
{
wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state,
- swapchain->device_window, &swapchain->original_window_rect);
+ swapchain->state.device_window, &swapchain->original_window_rect);
wined3d_device_release_focus_window(swapchain->device);
}
}
else
{
- wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, NULL);
+ wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state, swapchain->state.device_window, NULL);
}
}
@@ -152,7 +152,7 @@ void * CDECL wined3d_swapchain_get_parent(const struct wined3d_swapchain *swapch
void CDECL wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window)
{
if (!window)
- window = swapchain->device_window;
+ window = swapchain->state.device_window;
if (window == swapchain->win_handle)
return;
@@ -261,6 +261,11 @@ HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain
swapchain->device->adapter->ordinal, raster_status);
}
+struct wined3d_swapchain_state * CDECL wined3d_swapchain_get_state(struct wined3d_swapchain *swapchain)
+{
+ return &swapchain->state;
+}
+
HRESULT CDECL wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain,
struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation)
{
@@ -302,9 +307,9 @@ HRESULT CDECL wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain *s
if (flags)
FIXME("Ignoring flags %#x.\n", flags);
- dc = GetDCEx(swapchain->device_window, 0, DCX_USESTYLE | DCX_CACHE);
+ dc = GetDCEx(swapchain->state.device_window, 0, DCX_USESTYLE | DCX_CACHE);
SetDeviceGammaRamp(dc, (void *)ramp);
- ReleaseDC(swapchain->device_window, dc);
+ ReleaseDC(swapchain->state.device_window, dc);
return WINED3D_OK;
}
@@ -325,9 +330,9 @@ HRESULT CDECL wined3d_swapchain_get_gamma_ramp(const struct wined3d_swapchain *s
TRACE("swapchain %p, ramp %p.\n", swapchain, ramp);
- dc = GetDCEx(swapchain->device_window, 0, DCX_USESTYLE | DCX_CACHE);
+ dc = GetDCEx(swapchain->state.device_window, 0, DCX_USESTYLE | DCX_CACHE);
GetDeviceGammaRamp(dc, ramp);
- ReleaseDC(swapchain->device_window, dc);
+ ReleaseDC(swapchain->state.device_window, dc);
return WINED3D_OK;
}
@@ -776,7 +781,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
swapchain->parent_ops = parent_ops;
swapchain->ref = 1;
swapchain->win_handle = window;
- swapchain->device_window = window;
+ swapchain->state.device_window = window;
swapchain->swap_interval = WINED3D_SWAP_INTERVAL_DEFAULT;
swapchain_set_max_frame_latency(swapchain, device);
@@ -1150,7 +1155,7 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate)
{
struct wined3d_device *device = swapchain->device;
- HWND window = swapchain->device_window;
+ HWND window = swapchain->state.device_window;
BOOL focus_messages, filter;
/* This code is not protected by the wined3d mutex, so it may run while
@@ -1243,7 +1248,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
if (!desc->windowed)
return WINED3DERR_INVALIDCALL;
- if (!GetClientRect(swapchain->device_window, &client_rect))
+ if (!GetClientRect(swapchain->state.device_window, &client_rect))
{
ERR("Failed to get client rect, last error %#x.\n", GetLastError());
return WINED3DERR_INVALIDCALL;
@@ -1309,23 +1314,20 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
return WINED3D_OK;
}
-static HRESULT wined3d_swapchain_set_display_mode(struct wined3d_swapchain *swapchain,
- struct wined3d_display_mode *mode)
+static HRESULT wined3d_swapchain_state_set_display_mode(struct wined3d_swapchain_state *state,
+ struct wined3d *wined3d, unsigned int adapter_idx, struct wined3d_display_mode *mode)
{
- struct wined3d_device *device = swapchain->device;
HRESULT hr;
- if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
+ if (state->desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
{
- if (FAILED(hr = wined3d_find_closest_matching_adapter_mode(device->wined3d,
- device->adapter->ordinal, mode)))
+ if (FAILED(hr = wined3d_find_closest_matching_adapter_mode(wined3d, adapter_idx, mode)))
{
WARN("Failed to find closest matching mode, hr %#x.\n", hr);
}
}
- if (FAILED(hr = wined3d_set_adapter_display_mode(device->wined3d,
- device->adapter->ordinal, mode)))
+ if (FAILED(hr = wined3d_set_adapter_display_mode(wined3d, adapter_idx, mode)))
{
WARN("Failed to set display mode, hr %#x.\n", hr);
return WINED3DERR_INVALIDCALL;
@@ -1334,22 +1336,19 @@ static HRESULT wined3d_swapchain_set_display_mode(struct wined3d_swapchain *swap
return WINED3D_OK;
}
-HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchain,
- const struct wined3d_display_mode *mode)
+HRESULT CDECL wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state,
+ struct wined3d *wined3d, unsigned int adapter_idx, const struct wined3d_display_mode *mode)
{
- struct wined3d_swapchain_state *state = &swapchain->state;
struct wined3d_display_mode actual_mode;
RECT original_window_rect, window_rect;
- struct wined3d_device *device;
HWND window;
HRESULT hr;
- TRACE("swapchain %p, mode %p.\n", swapchain, mode);
+ TRACE("state %p, wined3d %p, adapter_idx %u, mode %p.\n", state, wined3d, adapter_idx, mode);
wined3d_mutex_lock();
- device = swapchain->device;
- window = swapchain->device_window;
+ window = state->device_window;
if (state->desc.windowed)
{
@@ -1365,7 +1364,7 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
else if (state->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
{
actual_mode = *mode;
- if (FAILED(hr = wined3d_swapchain_set_display_mode(swapchain, &actual_mode)))
+ if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, wined3d, adapter_idx, &actual_mode)))
{
wined3d_mutex_unlock();
return hr;
@@ -1374,8 +1373,7 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
}
else
{
- if (FAILED(hr = wined3d_get_adapter_display_mode(device->wined3d, device->adapter->ordinal,
- &actual_mode, NULL)))
+ if (FAILED(hr = wined3d_get_adapter_display_mode(wined3d, adapter_idx, &actual_mode, NULL)))
{
ERR("Failed to get display mode, hr %#x.\n", hr);
wined3d_mutex_unlock();
@@ -1535,7 +1533,8 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
}
}
- if (FAILED(hr = wined3d_swapchain_set_display_mode(swapchain, &actual_mode)))
+ if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state,
+ device->wined3d, device->adapter->ordinal, &actual_mode)))
return hr;
}
else
@@ -1560,12 +1559,12 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
{
/* Switch from windowed to fullscreen */
if (FAILED(hr = wined3d_swapchain_state_setup_fullscreen(state,
- swapchain->device_window, width, height)))
+ state->device_window, width, height)))
return hr;
}
else
{
- HWND window = swapchain->device_window;
+ HWND window = swapchain->state.device_window;
BOOL filter;
/* Fullscreen -> fullscreen mode change */
@@ -1582,7 +1581,7 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
RECT *window_rect = NULL;
if (state->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
window_rect = &swapchain->original_window_rect;
- wined3d_swapchain_state_restore_from_fullscreen(state, swapchain->device_window, window_rect);
+ wined3d_swapchain_state_restore_from_fullscreen(state, state->device_window, window_rect);
}
state->desc.windowed = swapchain_desc->windowed;
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 8b36753f458..bd91e92c683 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -269,15 +269,17 @@
@ cdecl wined3d_swapchain_get_parent(ptr)
@ cdecl wined3d_swapchain_get_desc(ptr ptr)
@ cdecl wined3d_swapchain_get_raster_status(ptr ptr)
+@ cdecl wined3d_swapchain_get_state(ptr)
@ cdecl wined3d_swapchain_incref(ptr)
@ cdecl wined3d_swapchain_present(ptr ptr ptr ptr long long)
@ cdecl wined3d_swapchain_resize_buffers(ptr long long long long long long)
-@ cdecl wined3d_swapchain_resize_target(ptr ptr)
@ cdecl wined3d_swapchain_set_fullscreen(ptr ptr ptr)
@ cdecl wined3d_swapchain_set_gamma_ramp(ptr long ptr)
@ cdecl wined3d_swapchain_set_palette(ptr ptr)
@ cdecl wined3d_swapchain_set_window(ptr ptr)
+@ cdecl wined3d_swapchain_state_resize_target(ptr ptr long ptr)
+
@ cdecl wined3d_texture_add_dirty_region(ptr long ptr)
@ cdecl wined3d_texture_blt(ptr long ptr ptr long ptr long ptr long)
@ cdecl wined3d_texture_create(ptr ptr long long long ptr ptr ptr ptr)
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 2d74d6f9d94..360d6d51962 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -555,7 +555,7 @@ static LRESULT CALLBACK wined3d_hook_proc(int code, WPARAM wparam, LPARAM lparam
{
swapchain = hook_table.swapchains[i].swapchain;
- if (swapchain->device_window != msg->hwnd)
+ if (swapchain->state.device_window != msg->hwnd)
continue;
if ((entry = wined3d_find_wndproc(msg->hwnd, swapchain->device->wined3d))
@@ -747,7 +747,7 @@ void wined3d_hook_swapchain(struct wined3d_swapchain *swapchain)
swapchain_entry = &hook_table.swapchains[hook_table.swapchain_count++];
swapchain_entry->swapchain = swapchain;
- swapchain_entry->thread_id = GetWindowThreadProcessId(swapchain->device_window, NULL);
+ swapchain_entry->thread_id = GetWindowThreadProcessId(swapchain->state.device_window, NULL);
if ((hook = wined3d_find_hook(swapchain_entry->thread_id)))
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 74f115f4f80..5ddf066878a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4181,6 +4181,7 @@ struct wined3d_swapchain_state
/* Window styles to restore when switching fullscreen mode. */
LONG style;
LONG exstyle;
+ HWND device_window;
};
void wined3d_swapchain_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
@@ -4222,7 +4223,6 @@ struct wined3d_swapchain
struct wined3d_swapchain_state state;
HWND win_handle;
- HWND device_window;
HDC backup_dc;
HWND backup_wnd;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index c71bb9c54c7..bbb58ba8320 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2127,6 +2127,7 @@ struct wined3d_shader;
struct wined3d_shader_resource_view;
struct wined3d_stateblock;
struct wined3d_swapchain;
+struct wined3d_swapchain_state;
struct wined3d_texture;
struct wined3d_unordered_access_view;
struct wined3d_vertex_declaration;
@@ -2676,14 +2677,13 @@ void __cdecl wined3d_swapchain_get_desc(const struct wined3d_swapchain *swapchai
struct wined3d_swapchain_desc *desc);
HRESULT __cdecl wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain,
struct wined3d_raster_status *raster_status);
+struct wined3d_swapchain_state * __cdecl wined3d_swapchain_get_state(struct wined3d_swapchain *swapchain);
ULONG __cdecl wined3d_swapchain_incref(struct wined3d_swapchain *swapchain);
HRESULT __cdecl wined3d_swapchain_present(struct wined3d_swapchain *swapchain, const RECT *src_rect,
const RECT *dst_rect, HWND dst_window_override, unsigned int swap_interval, DWORD flags);
HRESULT __cdecl wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapchain, unsigned int buffer_count,
unsigned int width, unsigned int height, enum wined3d_format_id format_id,
enum wined3d_multisample_type multisample_type, unsigned int multisample_quality);
-HRESULT __cdecl wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchain,
- const struct wined3d_display_mode *mode);
HRESULT __cdecl wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapchain,
const struct wined3d_swapchain_desc *desc, const struct wined3d_display_mode *mode);
HRESULT __cdecl wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain *swapchain,
@@ -2691,6 +2691,9 @@ HRESULT __cdecl wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain
void __cdecl wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain, struct wined3d_palette *palette);
void __cdecl wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window);
+HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state,
+ struct wined3d *wined3d, unsigned int adapter_idx, const struct wined3d_display_mode *mode);
+
HRESULT __cdecl wined3d_texture_add_dirty_region(struct wined3d_texture *texture,
UINT layer, const struct wined3d_box *dirty_region);
HRESULT __cdecl wined3d_texture_blt(struct wined3d_texture *dst_texture, unsigned int dst_idx, const RECT *dst_rect_in,
--
2.11.0
July 31, 2019
[PATCH 1/7] wined3d: Rename wined3d_window_state_restore_from_fullscreen() to wined3d_swapchain_state_restore_from_fullscreen().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/swapchain.c | 8 ++++----
dlls/wined3d/wined3d_private.h | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index eb77e0e4220..5e207be37e5 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -85,14 +85,14 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
{
- wined3d_window_state_restore_from_fullscreen(&swapchain->state,
+ wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state,
swapchain->device_window, &swapchain->original_window_rect);
wined3d_device_release_focus_window(swapchain->device);
}
}
else
{
- wined3d_window_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, NULL);
+ wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, NULL);
}
}
@@ -1450,7 +1450,7 @@ HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state
return WINED3D_OK;
}
-void wined3d_window_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
+void wined3d_swapchain_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
HWND window, const RECT *window_rect)
{
unsigned int window_pos_flags = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE;
@@ -1582,7 +1582,7 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
RECT *window_rect = NULL;
if (state->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
window_rect = &swapchain->original_window_rect;
- wined3d_window_state_restore_from_fullscreen(state, swapchain->device_window, window_rect);
+ wined3d_swapchain_state_restore_from_fullscreen(state, swapchain->device_window, window_rect);
}
state->desc.windowed = swapchain_desc->windowed;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 7ad0c113641..74f115f4f80 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4183,7 +4183,7 @@ struct wined3d_swapchain_state
LONG exstyle;
};
-void wined3d_window_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
+void wined3d_swapchain_state_restore_from_fullscreen(struct wined3d_swapchain_state *state,
HWND window, const RECT *window_rect) DECLSPEC_HIDDEN;
HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state *state,
HWND window, unsigned int w, unsigned int h) DECLSPEC_HIDDEN;
--
2.11.0
July 31, 2019
Re: [PATCH 5/5] wined3d: Pass a wined3d_context structure to fragment_pipeline.enable_extension().
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=54967
Your paranoid android.
=== debian10 (build log) ===
error: patch failed: dlls/wined3d/glsl_shader.c:10554
error: patch failed: dlls/wined3d/shader.c:3185
error: patch failed: dlls/wined3d/state.c:5186
Task: Patch failed to apply
=== debian10 (build log) ===
error: patch failed: dlls/wined3d/glsl_shader.c:10554
error: patch failed: dlls/wined3d/shader.c:3185
error: patch failed: dlls/wined3d/state.c:5186
Task: Patch failed to apply
July 31, 2019
[PATCH 5/5] wined3d: Pass a wined3d_context structure to fragment_pipeline.enable_extension().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/adapter_gl.c | 2 +-
dlls/wined3d/arb_program_shader.c | 17 ++++++++++-------
dlls/wined3d/ati_fragment_shader.c | 7 +++++--
dlls/wined3d/device.c | 2 +-
dlls/wined3d/glsl_shader.c | 12 ++++++------
dlls/wined3d/nvidia_texture_shader.c | 16 +++++++++++-----
dlls/wined3d/shader.c | 10 ++++------
dlls/wined3d/state.c | 13 ++++++-------
dlls/wined3d/wined3d_private.h | 26 +++++++++++++-------------
9 files changed, 57 insertions(+), 48 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index dd357e62510..bf07955f13e 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -2020,7 +2020,7 @@ static const struct wined3d_vertex_pipe_ops *select_vertex_implementation(const
return &ffp_vertex_pipe;
}
-static const struct fragment_pipeline *select_fragment_implementation(const struct wined3d_gl_info *gl_info,
+static const struct wined3d_fragment_pipe_ops *select_fragment_implementation(const struct wined3d_gl_info *gl_info,
const struct wined3d_shader_backend_ops *shader_backend_ops)
{
if (shader_backend_ops == &glsl_shader_backend && gl_info->supported[ARB_FRAGMENT_SHADER])
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index d4de02f333f..958c9f2b362 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -304,7 +304,7 @@ struct shader_arb_priv
const struct wined3d_context *last_context;
const struct wined3d_vertex_pipe_ops *vertex_pipe;
- const struct fragment_pipeline *fragment_pipe;
+ const struct wined3d_fragment_pipe_ops *fragment_pipe;
BOOL ffp_proj_control;
};
@@ -4582,7 +4582,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context
checkGLcall("glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id);");
if (!priv->use_arbfp_fixed_func)
- priv->fragment_pipe->enable_extension(gl_info, FALSE);
+ priv->fragment_pipe->fp_enable(context, FALSE);
/* Enable OpenGL fragment programs. */
gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_PROGRAM_ARB);
@@ -4629,7 +4629,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
priv->current_fprogram_id = 0;
}
- priv->fragment_pipe->enable_extension(gl_info, TRUE);
+ priv->fragment_pipe->fp_enable(context, TRUE);
}
if (use_vs(state))
@@ -4712,7 +4712,7 @@ static void shader_arb_disable(void *shader_priv, struct wined3d_context *contex
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
priv->current_fprogram_id = 0;
}
- priv->fragment_pipe->enable_extension(gl_info, FALSE);
+ priv->fragment_pipe->fp_enable(context, FALSE);
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
@@ -4785,7 +4785,7 @@ static int sig_tree_compare(const void *key, const struct wine_rb_entry *entry)
}
static HRESULT shader_arb_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
- const struct fragment_pipeline *fragment_pipe)
+ const struct wined3d_fragment_pipe_ops *fragment_pipe)
{
const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
struct fragment_caps fragment_caps;
@@ -5685,8 +5685,10 @@ struct arbfp_ffp_desc
};
/* Context activation is done by the caller. */
-static void arbfp_enable(const struct wined3d_gl_info *gl_info, BOOL enable)
+static void arbfp_enable(const struct wined3d_context *context, BOOL enable)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
if (enable)
{
gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_PROGRAM_ARB);
@@ -6855,7 +6857,8 @@ static void arbfp_free_context_data(struct wined3d_context *context)
{
}
-const struct fragment_pipeline arbfp_fragment_pipeline = {
+const struct wined3d_fragment_pipe_ops arbfp_fragment_pipeline =
+{
arbfp_enable,
arbfp_get_caps,
arbfp_get_emul_mask,
diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c
index 1945344688a..9e87af4240b 100644
--- a/dlls/wined3d/ati_fragment_shader.c
+++ b/dlls/wined3d/ati_fragment_shader.c
@@ -1250,8 +1250,10 @@ static const struct wined3d_state_entry_template atifs_fragmentstate_template[]
};
/* Context activation is done by the caller. */
-static void atifs_enable(const struct wined3d_gl_info *gl_info, BOOL enable)
+static void atifs_enable(const struct wined3d_context *context, BOOL enable)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
if (enable)
{
gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_SHADER_ATI);
@@ -1376,7 +1378,8 @@ static void atifs_free_context_data(struct wined3d_context *context)
heap_free(context->fragment_pipe_data);
}
-const struct fragment_pipeline atifs_fragment_pipeline = {
+const struct wined3d_fragment_pipe_ops atifs_fragment_pipeline =
+{
atifs_enable,
atifs_get_caps,
atifs_get_emul_mask,
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 30307cc90c3..8d75175174c 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5784,8 +5784,8 @@ HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined
struct wined3d_device_parent *device_parent)
{
struct wined3d_adapter *adapter = wined3d->adapters[adapter_idx];
+ const struct wined3d_fragment_pipe_ops *fragment_pipeline;
const struct wined3d_vertex_pipe_ops *vertex_pipeline;
- const struct fragment_pipeline *fragment_pipeline;
unsigned int i;
HRESULT hr;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 954a768f026..9b388e66d22 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -139,7 +139,7 @@ struct shader_glsl_priv
UINT next_constant_version;
const struct wined3d_vertex_pipe_ops *vertex_pipe;
- const struct fragment_pipeline *fragment_pipe;
+ const struct wined3d_fragment_pipe_ops *fragment_pipe;
struct wine_rb_tree ffp_vertex_shaders;
struct wine_rb_tree ffp_fragment_shaders;
BOOL ffp_proj_control;
@@ -10554,7 +10554,7 @@ static void shader_glsl_select(void *shader_priv, struct wined3d_context *contex
GLuint program_id, prev_id;
priv->vertex_pipe->vp_enable(context, !use_vs(state));
- priv->fragment_pipe->enable_extension(gl_info, !use_ps(state));
+ priv->fragment_pipe->fp_enable(context, !use_ps(state));
prev_id = ctx_data->glsl_program ? ctx_data->glsl_program->id : 0;
set_glsl_shader_program(context_gl, state, priv, ctx_data);
@@ -10656,7 +10656,7 @@ static void shader_glsl_disable(void *shader_priv, struct wined3d_context *conte
checkGLcall("glUseProgram");
priv->vertex_pipe->vp_enable(context, FALSE);
- priv->fragment_pipe->enable_extension(gl_info, FALSE);
+ priv->fragment_pipe->fp_enable(context, FALSE);
if (needs_legacy_glsl_syntax(gl_info) && gl_info->supported[ARB_COLOR_BUFFER_FLOAT])
{
@@ -10911,7 +10911,7 @@ static void constant_heap_free(struct constant_heap *heap)
}
static HRESULT shader_glsl_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
- const struct fragment_pipeline *fragment_pipe)
+ const struct wined3d_fragment_pipe_ops *fragment_pipe)
{
SIZE_T stack_size = wined3d_log2i(max(WINED3D_MAX_VS_CONSTS_F, WINED3D_MAX_PS_CONSTS_F)) + 1;
struct fragment_caps fragment_caps;
@@ -11892,7 +11892,7 @@ const struct wined3d_vertex_pipe_ops glsl_vertex_pipe =
glsl_vertex_pipe_vp_states,
};
-static void glsl_fragment_pipe_enable(const struct wined3d_gl_info *gl_info, BOOL enable)
+static void glsl_fragment_pipe_enable(const struct wined3d_context *context, BOOL enable)
{
/* Nothing to do. */
}
@@ -12251,7 +12251,7 @@ static void glsl_fragment_pipe_free_context_data(struct wined3d_context *context
{
}
-const struct fragment_pipeline glsl_fragment_pipe =
+const struct wined3d_fragment_pipe_ops glsl_fragment_pipe =
{
glsl_fragment_pipe_enable,
glsl_fragment_pipe_get_caps,
diff --git a/dlls/wined3d/nvidia_texture_shader.c b/dlls/wined3d/nvidia_texture_shader.c
index 1cffbe45798..7ace75841c1 100644
--- a/dlls/wined3d/nvidia_texture_shader.c
+++ b/dlls/wined3d/nvidia_texture_shader.c
@@ -659,8 +659,10 @@ static void nvrc_texfactor(struct wined3d_context *context, const struct wined3d
}
/* Context activation is done by the caller. */
-static void nvrc_enable(const struct wined3d_gl_info *gl_info, BOOL enable)
+static void nvrc_enable(const struct wined3d_context *context, BOOL enable)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
if (enable)
{
gl_info->gl_ops.gl.p_glEnable(GL_REGISTER_COMBINERS_NV);
@@ -674,9 +676,11 @@ static void nvrc_enable(const struct wined3d_gl_info *gl_info, BOOL enable)
}
/* Context activation is done by the caller. */
-static void nvts_enable(const struct wined3d_gl_info *gl_info, BOOL enable)
+static void nvts_enable(const struct wined3d_context *context, BOOL enable)
{
- nvrc_enable(gl_info, enable);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
+ nvrc_enable(context, enable);
if (enable)
{
gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_SHADER_NV);
@@ -923,7 +927,8 @@ static void nvrc_context_free(struct wined3d_context *context)
}
-const struct fragment_pipeline nvts_fragment_pipeline = {
+const struct wined3d_fragment_pipe_ops nvts_fragment_pipeline =
+{
nvts_enable,
nvrc_fragment_get_caps,
nvrc_fragment_get_emul_mask,
@@ -935,7 +940,8 @@ const struct fragment_pipeline nvts_fragment_pipeline = {
nvrc_fragmentstate_template,
};
-const struct fragment_pipeline nvrc_fragment_pipeline = {
+const struct wined3d_fragment_pipe_ops nvrc_fragment_pipeline =
+{
nvrc_enable,
nvrc_fragment_get_caps,
nvrc_fragment_get_emul_mask,
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index e0055f6ff16..973941b8d9e 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3165,7 +3165,7 @@ static void shader_cleanup(struct wined3d_shader *shader)
struct shader_none_priv
{
const struct wined3d_vertex_pipe_ops *vertex_pipe;
- const struct fragment_pipeline *fragment_pipe;
+ const struct wined3d_fragment_pipe_ops *fragment_pipe;
BOOL ffp_proj_control;
};
@@ -3185,21 +3185,19 @@ static void shader_none_init_context_state(struct wined3d_context *context) {}
static void shader_none_select(void *shader_priv, struct wined3d_context *context,
const struct wined3d_state *state)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
struct shader_none_priv *priv = shader_priv;
priv->vertex_pipe->vp_enable(context, !use_vs(state));
- priv->fragment_pipe->enable_extension(gl_info, !use_ps(state));
+ priv->fragment_pipe->fp_enable(context, !use_ps(state));
}
/* Context activation is done by the caller. */
static void shader_none_disable(void *shader_priv, struct wined3d_context *context)
{
struct shader_none_priv *priv = shader_priv;
- const struct wined3d_gl_info *gl_info = context->gl_info;
priv->vertex_pipe->vp_enable(context, FALSE);
- priv->fragment_pipe->enable_extension(gl_info, FALSE);
+ priv->fragment_pipe->fp_enable(context, FALSE);
context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
| (1u << WINED3D_SHADER_TYPE_VERTEX)
@@ -3210,7 +3208,7 @@ static void shader_none_disable(void *shader_priv, struct wined3d_context *conte
}
static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
- const struct fragment_pipeline *fragment_pipe)
+ const struct wined3d_fragment_pipe_ops *fragment_pipe)
{
struct fragment_caps fragment_caps;
void *vertex_priv, *fragment_priv;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 6df20a40d74..bf110bcf990 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -5186,7 +5186,6 @@ static const struct wined3d_state_entry_template ffp_fragmentstate_template[] =
};
/* Context activation is done by the caller. */
-static void ffp_enable(const struct wined3d_gl_info *gl_info, BOOL enable) {}
static void ffp_pipe_enable(const struct wined3d_context *context, BOOL enable) {}
static void *ffp_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
@@ -5297,8 +5296,9 @@ static void ffp_none_context_free(struct wined3d_context *context)
{
}
-const struct fragment_pipeline ffp_fragment_pipeline = {
- ffp_enable,
+const struct wined3d_fragment_pipe_ops ffp_fragment_pipeline =
+{
+ ffp_pipe_enable,
ffp_fragment_get_caps,
ffp_fragment_get_emul_mask,
ffp_alloc,
@@ -5309,7 +5309,6 @@ const struct fragment_pipeline ffp_fragment_pipeline = {
ffp_fragmentstate_template,
};
-static void none_enable(const struct wined3d_gl_info *gl_info, BOOL enable) {}
static void none_pipe_enable(const struct wined3d_context *context, BOOL enable) {}
static void *none_alloc(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv)
@@ -5354,9 +5353,9 @@ static BOOL fp_none_color_fixup_supported(struct color_fixup_desc fixup)
return is_identity_fixup(fixup);
}
-const struct fragment_pipeline none_fragment_pipe =
+const struct wined3d_fragment_pipe_ops none_fragment_pipe =
{
- none_enable,
+ none_pipe_enable,
fp_none_get_caps,
fp_none_get_emul_mask,
none_alloc,
@@ -5522,7 +5521,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table)
HRESULT compile_state_table(struct wined3d_state_entry *state_table, APPLYSTATEFUNC **dev_multistate_funcs,
const struct wined3d_d3d_info *d3d_info, const BOOL *supported_extensions,
- const struct wined3d_vertex_pipe_ops *vertex, const struct fragment_pipeline *fragment,
+ const struct wined3d_vertex_pipe_ops *vertex, const struct wined3d_fragment_pipe_ops *fragment,
const struct wined3d_state_entry_template *misc)
{
APPLYSTATEFUNC multistate_funcs[STATE_HIGHEST + 1][3];
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 7ad0c113641..438e535f8aa 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -74,7 +74,7 @@
#define WINED3D_QUIRK_BROKEN_ARB_FOG 0x00000200
#define WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS 0x00000400
-struct fragment_pipeline;
+struct wined3d_fragment_pipe_ops;
struct wined3d_adapter;
struct wined3d_context;
struct wined3d_state;
@@ -1444,7 +1444,7 @@ struct wined3d_shader_backend_ops
const struct wined3d_state *state);
void (*shader_destroy)(struct wined3d_shader *shader);
HRESULT (*shader_alloc_private)(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
- const struct fragment_pipeline *fragment_pipe);
+ const struct wined3d_fragment_pipe_ops *fragment_pipe);
void (*shader_free_private)(struct wined3d_device *device, struct wined3d_context *context);
BOOL (*shader_allocate_context_data)(struct wined3d_context *context);
void (*shader_free_context_data)(struct wined3d_context *context);
@@ -2159,9 +2159,9 @@ struct fragment_caps
#define GL_EXT_EMUL_ARB_MULTITEXTURE 0x00000001
#define GL_EXT_EMUL_EXT_FOG_COORD 0x00000002
-struct fragment_pipeline
+struct wined3d_fragment_pipe_ops
{
- void (*enable_extension)(const struct wined3d_gl_info *gl_info, BOOL enable);
+ void (*fp_enable)(const struct wined3d_context *context, BOOL enable);
void (*get_caps)(const struct wined3d_adapter *adapter, struct fragment_caps *caps);
DWORD (*get_emul_mask)(const struct wined3d_gl_info *gl_info);
void *(*alloc_private)(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv);
@@ -2197,13 +2197,13 @@ struct wined3d_vertex_pipe_ops
};
extern const struct wined3d_state_entry_template misc_state_template[] DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline none_fragment_pipe DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline ffp_fragment_pipeline DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline atifs_fragment_pipeline DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline arbfp_fragment_pipeline DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline nvts_fragment_pipeline DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline nvrc_fragment_pipeline DECLSPEC_HIDDEN;
-extern const struct fragment_pipeline glsl_fragment_pipe DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops none_fragment_pipe DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops ffp_fragment_pipeline DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops atifs_fragment_pipeline DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops arbfp_fragment_pipeline DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops nvts_fragment_pipeline DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops nvrc_fragment_pipeline DECLSPEC_HIDDEN;
+extern const struct wined3d_fragment_pipe_ops glsl_fragment_pipe DECLSPEC_HIDDEN;
extern const struct wined3d_vertex_pipe_ops none_vertex_pipe DECLSPEC_HIDDEN;
extern const struct wined3d_vertex_pipe_ops ffp_vertex_pipe DECLSPEC_HIDDEN;
@@ -2212,7 +2212,7 @@ extern const struct wined3d_vertex_pipe_ops glsl_vertex_pipe DECLSPEC_HIDDEN;
/* "Base" state table */
HRESULT compile_state_table(struct wined3d_state_entry *state_table, APPLYSTATEFUNC **dev_multistate_funcs,
const struct wined3d_d3d_info *d3d_info, const BOOL *supported_extensions,
- const struct wined3d_vertex_pipe_ops *vertex, const struct fragment_pipeline *fragment,
+ const struct wined3d_vertex_pipe_ops *vertex, const struct wined3d_fragment_pipe_ops *fragment,
const struct wined3d_state_entry_template *misc) DECLSPEC_HIDDEN;
enum wined3d_blit_op
@@ -2794,7 +2794,7 @@ struct wined3d_adapter
size_t format_size;
const struct wined3d_vertex_pipe_ops *vertex_pipe;
- const struct fragment_pipeline *fragment_pipe;
+ const struct wined3d_fragment_pipe_ops *fragment_pipe;
const struct wined3d_shader_backend_ops *shader_backend;
const struct wined3d_adapter_ops *adapter_ops;
};
--
2.11.0
July 31, 2019
[PATCH 4/5] wined3d: Pass a wined3d_context_gl structure to glsl_free_blitter_program().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/glsl_shader.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 828638bfe9b..954a768f026 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -12298,9 +12298,10 @@ static int glsl_blitter_args_compare(const void *key, const struct wine_rb_entry
static void glsl_free_blitter_program(struct wine_rb_entry *entry, void *ctx)
{
struct glsl_blitter_program *program = WINE_RB_ENTRY_VALUE(entry, struct glsl_blitter_program, entry);
- struct wined3d_context *context = ctx;
- const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct wined3d_context_gl *context_gl = ctx;
+ const struct wined3d_gl_info *gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glDeleteProgram(program->id));
checkGLcall("glDeleteProgram()");
heap_free(program);
@@ -12309,6 +12310,7 @@ static void glsl_free_blitter_program(struct wine_rb_entry *entry, void *ctx)
/* Context activation is done by the caller. */
static void glsl_blitter_destroy(struct wined3d_blitter *blitter, struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_glsl_blitter *glsl_blitter;
struct wined3d_blitter *next;
@@ -12321,7 +12323,7 @@ static void glsl_blitter_destroy(struct wined3d_blitter *blitter, struct wined3d
if (glsl_blitter->palette_texture)
gl_info->gl_ops.gl.p_glDeleteTextures(1, &glsl_blitter->palette_texture);
- wine_rb_destroy(&glsl_blitter->programs, glsl_free_blitter_program, context);
+ wine_rb_destroy(&glsl_blitter->programs, glsl_free_blitter_program, context_gl);
string_buffer_list_cleanup(&glsl_blitter->string_buffers);
heap_free(glsl_blitter);
--
2.11.0
July 31, 2019
[PATCH 3/5] wined3d: Store a wined3d_context_gl structure in struct glsl_ffp_destroy_ctx.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/glsl_shader.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index d5003293e6d..828638bfe9b 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -352,7 +352,7 @@ struct glsl_ffp_fragment_shader
struct glsl_ffp_destroy_ctx
{
struct shader_glsl_priv *priv;
- const struct wined3d_context *context;
+ const struct wined3d_context_gl *context_gl;
};
static void shader_glsl_generate_shader_epilogue(const struct wined3d_shader_context *ctx);
@@ -11452,8 +11452,9 @@ static void shader_glsl_free_ffp_vertex_shader(struct wine_rb_entry *entry, void
struct glsl_ffp_vertex_shader, desc.entry);
struct glsl_shader_prog_link *program, *program2;
struct glsl_ffp_destroy_ctx *ctx = param;
- const struct wined3d_gl_info *gl_info = ctx->context->gl_info;
+ const struct wined3d_gl_info *gl_info;
+ gl_info = ctx->context_gl->c.gl_info;
LIST_FOR_EACH_ENTRY_SAFE(program, program2, &shader->linked_programs,
struct glsl_shader_prog_link, vs.shader_entry)
{
@@ -11466,11 +11467,12 @@ static void shader_glsl_free_ffp_vertex_shader(struct wine_rb_entry *entry, void
/* Context activation is done by the caller. */
static void glsl_vertex_pipe_vp_free(struct wined3d_device *device, struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
struct shader_glsl_priv *priv = device->vertex_priv;
struct glsl_ffp_destroy_ctx ctx;
ctx.priv = priv;
- ctx.context = context;
+ ctx.context_gl = context_gl;
wine_rb_destroy(&priv->ffp_vertex_shaders, shader_glsl_free_ffp_vertex_shader, &ctx);
}
@@ -11962,8 +11964,9 @@ static void shader_glsl_free_ffp_fragment_shader(struct wine_rb_entry *entry, vo
struct glsl_ffp_fragment_shader, entry.entry);
struct glsl_shader_prog_link *program, *program2;
struct glsl_ffp_destroy_ctx *ctx = param;
- const struct wined3d_gl_info *gl_info = ctx->context->gl_info;
+ const struct wined3d_gl_info *gl_info;
+ gl_info = ctx->context_gl->c.gl_info;
LIST_FOR_EACH_ENTRY_SAFE(program, program2, &shader->linked_programs,
struct glsl_shader_prog_link, ps.shader_entry)
{
@@ -11976,11 +11979,12 @@ static void shader_glsl_free_ffp_fragment_shader(struct wine_rb_entry *entry, vo
/* Context activation is done by the caller. */
static void glsl_fragment_pipe_free(struct wined3d_device *device, struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
struct shader_glsl_priv *priv = device->fragment_priv;
struct glsl_ffp_destroy_ctx ctx;
ctx.priv = priv;
- ctx.context = context;
+ ctx.context_gl = context_gl;
wine_rb_destroy(&priv->ffp_fragment_shaders, shader_glsl_free_ffp_fragment_shader, &ctx);
}
--
2.11.0
July 31, 2019
[PATCH 2/5] wined3d: Pass a wined3d_context_gl structure to atifs_free_ffpshader().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/ati_fragment_shader.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c
index e166d99bf1f..1945344688a 100644
--- a/dlls/wined3d/ati_fragment_shader.c
+++ b/dlls/wined3d/ati_fragment_shader.c
@@ -1333,10 +1333,10 @@ static void *atifs_alloc(const struct wined3d_shader_backend_ops *shader_backend
static void atifs_free_ffpshader(struct wine_rb_entry *entry, void *param)
{
struct atifs_ffp_desc *entry_ati = WINE_RB_ENTRY_VALUE(entry, struct atifs_ffp_desc, parent.entry);
- struct wined3d_context *context = param;
+ struct wined3d_context_gl *context_gl = param;
const struct wined3d_gl_info *gl_info;
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glDeleteFragmentShaderATI(entry_ati->shader));
checkGLcall("glDeleteFragmentShaderATI(entry->shader)");
heap_free(entry_ati);
@@ -1345,9 +1345,10 @@ static void atifs_free_ffpshader(struct wine_rb_entry *entry, void *param)
/* Context activation is done by the caller. */
static void atifs_free(struct wined3d_device *device, struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
struct atifs_private_data *priv = device->fragment_priv;
- wine_rb_destroy(&priv->fragment_shaders, atifs_free_ffpshader, context);
+ wine_rb_destroy(&priv->fragment_shaders, atifs_free_ffpshader, context_gl);
heap_free(priv);
device->fragment_priv = NULL;
--
2.11.0
July 31, 2019
[PATCH 1/5] wined3d: Pass a wined3d_context_gl structure to arbfp_free_blit_shader().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index f91ff871081..d4de02f333f 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -6906,10 +6906,10 @@ static void arbfp_free_blit_shader(struct wine_rb_entry *entry, void *ctx)
{
struct arbfp_blit_desc *entry_arb = WINE_RB_ENTRY_VALUE(entry, struct arbfp_blit_desc, entry);
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
- context = ctx;
- gl_info = context->gl_info;
+ context_gl = ctx;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glDeleteProgramsARB(1, &entry_arb->shader));
checkGLcall("glDeleteProgramsARB(1, &entry_arb->shader)");
@@ -6919,6 +6919,7 @@ static void arbfp_free_blit_shader(struct wine_rb_entry *entry, void *ctx)
/* Context activation is done by the caller. */
static void arbfp_blitter_destroy(struct wined3d_blitter *blitter, struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_arbfp_blitter *arbfp_blitter;
struct wined3d_blitter *next;
@@ -6928,7 +6929,7 @@ static void arbfp_blitter_destroy(struct wined3d_blitter *blitter, struct wined3
arbfp_blitter = CONTAINING_RECORD(blitter, struct wined3d_arbfp_blitter, blitter);
- wine_rb_destroy(&arbfp_blitter->shaders, arbfp_free_blit_shader, context);
+ wine_rb_destroy(&arbfp_blitter->shaders, arbfp_free_blit_shader, context_gl);
checkGLcall("Delete blit programs");
if (arbfp_blitter->palette_texture)
--
2.11.0
July 31, 2019
[PATCH 2/2] winegcc: Always use -nostartfiles when building DLLs.
by Jacek Caban
So that simplified DllMainCRTStartup version from winecrt0 is used
instead of mingw crt.
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
tools/winegcc/winegcc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
July 31, 2019