Wine-devel
Threads by month
- ----- 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
- 284 discussions
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/d3dcompiler_43/reflection.c | 16 ++++++++++++++++
dlls/d3dcompiler_43/tests/reflection.c | 12 +++++++-----
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c
index e492011c55f..050ddc47829 100644
--- a/dlls/d3dcompiler_43/reflection.c
+++ b/dlls/d3dcompiler_43/reflection.c
@@ -51,6 +51,7 @@ struct d3dcompiler_shader_reflection_type
D3D11_SHADER_TYPE_DESC desc;
struct d3dcompiler_shader_reflection_type_member *members;
+ char *name_string;
};
struct d3dcompiler_shader_reflection_type_member
@@ -222,6 +223,7 @@ static void d3dcompiler_shader_reflection_type_destroy(struct wine_rb_entry *ent
HeapFree(GetProcessHeap(), 0, t->members);
}
+ heap_free(t->name_string);
HeapFree(GetProcessHeap(), 0, t);
}
@@ -1244,6 +1246,20 @@ static HRESULT d3dcompiler_parse_type(struct d3dcompiler_shader_reflection_type
}
}
+ if ((type->reflection->target & D3DCOMPILER_SHADER_TARGET_VERSION_MASK) >= 0x500)
+ {
+ read_dword(&ptr, &offset);
+ if (!(type->name_string = heap_alloc(strlen(data + offset) + 1)))
+ {
+ ERR("Failed to allocate name memory.\n");
+ heap_free(members);
+ return E_OUTOFMEMORY;
+ }
+ strcpy(type->name_string, data + offset);
+ desc->Name = type->name_string;
+ TRACE("Name %s\n", debugstr_a(type->name_string));
+ }
+
type->members = members;
return S_OK;
diff --git a/dlls/d3dcompiler_43/tests/reflection.c b/dlls/d3dcompiler_43/tests/reflection.c
index 2c1c9028bbb..1b9d2d418d9 100644
--- a/dlls/d3dcompiler_43/tests/reflection.c
+++ b/dlls/d3dcompiler_43/tests/reflection.c
@@ -1207,11 +1207,11 @@ static const struct {
static const D3D11_SHADER_TYPE_DESC test_reflection_constant_buffer_type_result[] =
{
- {D3D11_SVC_INTERFACE_POINTER, D3D11_SVT_INTERFACE_POINTER, 1, 4, 0, 1, 0},
- {D3D_SVC_SCALAR, D3D_SVT_FLOAT, 1, 1, 0, 1, 0},
- {D3D_SVC_SCALAR, D3D_SVT_FLOAT, 1, 1, 2, 1, 0},
- {D3D_SVC_SCALAR, D3D_SVT_INT, 1, 1, 0, 1, 0},
- {D3D_SVC_STRUCT, D3D_SVT_VOID, 1, 2, 0, 1, 0},
+ {D3D11_SVC_INTERFACE_POINTER, D3D11_SVT_INTERFACE_POINTER, 1, 4, 0, 1, 0, "iTest"},
+ {D3D_SVC_SCALAR, D3D_SVT_FLOAT, 1, 1, 0, 1, 0, "float"},
+ {D3D_SVC_SCALAR, D3D_SVT_FLOAT, 1, 1, 2, 1, 0, "float"},
+ {D3D_SVC_SCALAR, D3D_SVT_INT, 1, 1, 0, 1, 0, "int"},
+ {D3D_SVC_STRUCT, D3D_SVT_VOID, 1, 2, 0, 1, 0, "s"},
};
static void test_reflection_constant_buffer(void)
@@ -1459,6 +1459,8 @@ static void test_reflection_constant_buffer(void)
i, tdesc.Elements, ptdesc->Elements);
ok(tdesc.Offset == ptdesc->Offset, "GetDesc(%u) Offset failed, got %u, expected %u\n",
i, tdesc.Offset, ptdesc->Offset);
+ ok(!strcmp(tdesc.Name, ptdesc->Name), "GetDesc(%u) Name failed, got %s, expected %s\n",
+ i, tdesc.Name, ptdesc->Name);
}
/* types */
--
2.20.1
2
1
[PATCH 5/5] wined3d: Move the "desc" field from struct wined3d_swapchain to struct wined3d_swapchain_state.
by Henri Verbeet 29 Jul '19
by Henri Verbeet 29 Jul '19
29 Jul '19
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/cs.c | 6 +-
dlls/wined3d/device.c | 67 ++++++++++---------
dlls/wined3d/surface.c | 6 +-
dlls/wined3d/swapchain.c | 147 +++++++++++++++++++++--------------------
dlls/wined3d/view.c | 10 +--
dlls/wined3d/wined3d_private.h | 3 +-
6 files changed, 123 insertions(+), 116 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 8413d0f3c05..3882be91aa9 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -530,7 +530,7 @@ static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data)
swapchain->swapchain_ops->swapchain_present(swapchain, &op->src_rect, &op->dst_rect, op->swap_interval, op->flags);
wined3d_resource_release(&swapchain->front_buffer->resource);
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
{
wined3d_resource_release(&swapchain->back_buffers[i]->resource);
}
@@ -558,7 +558,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw
pending = InterlockedIncrement(&cs->pending_presents);
wined3d_resource_acquire(&swapchain->front_buffer->resource);
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
{
wined3d_resource_acquire(&swapchain->back_buffers[i]->resource);
}
@@ -1137,7 +1137,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const
{
struct wined3d_texture *prev_texture = texture_from_resource(prev->resource);
- if (device->swapchains[0]->desc.flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
+ if (device->swapchains[0]->state.desc.flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
|| prev_texture->flags & WINED3D_TEXTURE_DISCARD)
wined3d_texture_validate_location(prev_texture,
prev->sub_resource_idx, WINED3D_LOCATION_DISCARDED);
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8502b967905..30307cc90c3 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -936,7 +936,7 @@ void CDECL wined3d_device_release_focus_window(struct wined3d_device *device)
static void device_init_swapchain_state(struct wined3d_device *device, struct wined3d_swapchain *swapchain)
{
- BOOL ds_enable = swapchain->desc.enable_auto_depth_stencil;
+ BOOL ds_enable = swapchain->state.desc.enable_auto_depth_stencil;
unsigned int i;
for (i = 0; i < device->adapter->d3d_info.limits.max_rt_count; ++i)
@@ -1044,7 +1044,7 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, str
if (device->d3d_initialized)
return WINED3DERR_INVALIDCALL;
- swapchain_desc = &swapchain->desc;
+ swapchain_desc = &swapchain->state.desc;
if (swapchain_desc->backbuffer_count && swapchain_desc->backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
{
struct wined3d_resource *back_buffer = &swapchain->back_buffers[0]->resource;
@@ -5294,7 +5294,7 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device)
static void update_swapchain_flags(struct wined3d_texture *texture)
{
- unsigned int flags = texture->swapchain->desc.flags;
+ unsigned int flags = texture->swapchain->state.desc.flags;
if (flags & WINED3D_SWAPCHAIN_LOCKABLE_BACKBUFFER)
texture->resource.access |= WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
@@ -5312,6 +5312,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
wined3d_device_reset_cb callback, BOOL reset_state)
{
const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
+ struct wined3d_swapchain_state *swapchain_state;
+ struct wined3d_swapchain_desc *current_desc;
struct wined3d_resource *resource, *cursor;
struct wined3d_rendertarget_view *view;
struct wined3d_swapchain *swapchain;
@@ -5330,6 +5332,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
ERR("Failed to get the first implicit swapchain.\n");
return WINED3DERR_INVALIDCALL;
}
+ swapchain_state = &swapchain->state;
+ current_desc = &swapchain_state->desc;
if (reset_state)
{
@@ -5389,25 +5393,24 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
FIXME("Unimplemented swap effect %#x.\n", swapchain_desc->swap_effect);
/* No special treatment of these parameters. Just store them */
- swapchain->desc.swap_effect = swapchain_desc->swap_effect;
- swapchain->desc.enable_auto_depth_stencil = swapchain_desc->enable_auto_depth_stencil;
- swapchain->desc.auto_depth_stencil_format = swapchain_desc->auto_depth_stencil_format;
- swapchain->desc.refresh_rate = swapchain_desc->refresh_rate;
- swapchain->desc.auto_restore_display_mode = swapchain_desc->auto_restore_display_mode;
+ current_desc->swap_effect = swapchain_desc->swap_effect;
+ current_desc->enable_auto_depth_stencil = swapchain_desc->enable_auto_depth_stencil;
+ current_desc->auto_depth_stencil_format = swapchain_desc->auto_depth_stencil_format;
+ current_desc->refresh_rate = swapchain_desc->refresh_rate;
+ current_desc->auto_restore_display_mode = swapchain_desc->auto_restore_display_mode;
- if (swapchain_desc->device_window
- && swapchain_desc->device_window != swapchain->desc.device_window)
+ if (swapchain_desc->device_window && swapchain_desc->device_window != current_desc->device_window)
{
TRACE("Changing the device window from %p to %p.\n",
- swapchain->desc.device_window, swapchain_desc->device_window);
- swapchain->desc.device_window = swapchain_desc->device_window;
+ current_desc->device_window, swapchain_desc->device_window);
+ current_desc->device_window = swapchain_desc->device_window;
swapchain->device_window = swapchain_desc->device_window;
wined3d_swapchain_set_window(swapchain, NULL);
}
- backbuffer_resized = swapchain_desc->backbuffer_width != swapchain->desc.backbuffer_width
- || swapchain_desc->backbuffer_height != swapchain->desc.backbuffer_height;
- windowed = swapchain->desc.windowed;
+ backbuffer_resized = swapchain_desc->backbuffer_width != current_desc->backbuffer_width
+ || swapchain_desc->backbuffer_height != current_desc->backbuffer_height;
+ windowed = current_desc->windowed;
if (!swapchain_desc->windowed != !windowed || swapchain->reapply_mode
|| mode || (!swapchain_desc->windowed && backbuffer_resized))
@@ -5434,18 +5437,18 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
}
else if (!swapchain_desc->windowed)
{
- DWORD style = swapchain->state.style;
- DWORD exstyle = swapchain->state.exstyle;
+ DWORD style = swapchain_state->style;
+ DWORD exstyle = swapchain_state->exstyle;
/* If we're in fullscreen, and the mode wasn't changed, we have to get
* the window back into the right position. Some applications
* (Battlefield 2, Guild Wars) move it and then call Reset() to clean
* 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,
+ swapchain_state->style = 0;
+ swapchain_state->exstyle = 0;
+ wined3d_swapchain_state_setup_fullscreen(swapchain_state, swapchain->device_window,
swapchain_desc->backbuffer_width, swapchain_desc->backbuffer_height);
- swapchain->state.style = style;
- swapchain->state.exstyle = exstyle;
+ swapchain_state->style = style;
+ swapchain_state->exstyle = exstyle;
}
if (FAILED(hr = wined3d_swapchain_resize_buffers(swapchain, swapchain_desc->backbuffer_count,
@@ -5453,12 +5456,12 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
swapchain_desc->multisample_type, swapchain_desc->multisample_quality)))
return hr;
- if (swapchain_desc->flags != swapchain->desc.flags)
+ if (swapchain_desc->flags != current_desc->flags)
{
- swapchain->desc.flags = swapchain_desc->flags;
+ current_desc->flags = swapchain_desc->flags;
update_swapchain_flags(swapchain->front_buffer);
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < current_desc->backbuffer_count; ++i)
{
update_swapchain_flags(swapchain->back_buffers[i]);
}
@@ -5469,7 +5472,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
device->auto_depth_stencil_view = NULL;
wined3d_rendertarget_view_decref(view);
}
- if (swapchain->desc.enable_auto_depth_stencil)
+ if (current_desc->enable_auto_depth_stencil)
{
struct wined3d_resource_desc texture_desc;
struct wined3d_texture *texture;
@@ -5477,14 +5480,14 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
TRACE("Creating the depth stencil buffer.\n");
texture_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
- texture_desc.format = swapchain->desc.auto_depth_stencil_format;
- texture_desc.multisample_type = swapchain->desc.multisample_type;
- texture_desc.multisample_quality = swapchain->desc.multisample_quality;
+ texture_desc.format = current_desc->auto_depth_stencil_format;
+ texture_desc.multisample_type = current_desc->multisample_type;
+ texture_desc.multisample_quality = current_desc->multisample_quality;
texture_desc.usage = 0;
texture_desc.bind_flags = WINED3D_BIND_DEPTH_STENCIL;
texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
- texture_desc.width = swapchain->desc.backbuffer_width;
- texture_desc.height = swapchain->desc.backbuffer_height;
+ texture_desc.width = current_desc->backbuffer_width;
+ texture_desc.height = current_desc->backbuffer_height;
texture_desc.depth = 1;
texture_desc.size = 0;
@@ -5518,7 +5521,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
device->back_buffer_view = NULL;
wined3d_rendertarget_view_decref(view);
}
- if (swapchain->desc.backbuffer_count && swapchain->desc.backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
+ if (current_desc->backbuffer_count && current_desc->backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
{
struct wined3d_resource *back_buffer = &swapchain->back_buffers[0]->resource;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 3668c61fa33..01a2b892dcc 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3091,16 +3091,16 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_
* Prince of Persia 3D use Blt() from the backbuffer to the
* frontbuffer instead of doing a Flip(). D3d8 and d3d9 applications
* can't blit directly to the frontbuffer. */
- enum wined3d_swap_effect swap_effect = dst_swapchain->desc.swap_effect;
+ enum wined3d_swap_effect swap_effect = dst_swapchain->state.desc.swap_effect;
TRACE("Using present for backbuffer -> frontbuffer blit.\n");
/* Set the swap effect to COPY, we don't want the backbuffer to become
* undefined. */
- dst_swapchain->desc.swap_effect = WINED3D_SWAP_EFFECT_COPY;
+ dst_swapchain->state.desc.swap_effect = WINED3D_SWAP_EFFECT_COPY;
wined3d_swapchain_present(dst_swapchain, NULL, NULL,
dst_swapchain->win_handle, dst_swapchain->swap_interval, 0);
- dst_swapchain->desc.swap_effect = swap_effect;
+ dst_swapchain->state.desc.swap_effect = swap_effect;
return WINED3D_OK;
}
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 10363e007a8..a9de2050db9 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -54,7 +54,7 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
if (swapchain->back_buffers)
{
- i = swapchain->desc.backbuffer_count;
+ i = swapchain->state.desc.backbuffer_count;
while (i--)
{
@@ -75,15 +75,15 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
* desktop resolution. In case of d3d7 this will be a NOP because ddraw
* sets the resolution before starting up Direct3D, thus orig_width and
* orig_height will be equal to the modes in the presentation params. */
- if (!swapchain->desc.windowed)
+ if (!swapchain->state.desc.windowed)
{
- if (swapchain->desc.auto_restore_display_mode)
+ if (swapchain->state.desc.auto_restore_display_mode)
{
if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
swapchain->device->adapter->ordinal, &swapchain->original_mode)))
ERR("Failed to restore display mode, hr %#x.\n", hr);
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
+ if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
{
wined3d_window_state_restore_from_fullscreen(&swapchain->state,
swapchain->device_window, &swapchain->original_window_rect);
@@ -188,8 +188,8 @@ HRESULT CDECL wined3d_swapchain_present(struct wined3d_swapchain *swapchain,
if (!src_rect)
{
- SetRect(&s, 0, 0, swapchain->desc.backbuffer_width,
- swapchain->desc.backbuffer_height);
+ SetRect(&s, 0, 0, swapchain->state.desc.backbuffer_width,
+ swapchain->state.desc.backbuffer_height);
src_rect = &s;
}
@@ -217,7 +217,7 @@ HRESULT CDECL wined3d_swapchain_get_front_buffer_data(const struct wined3d_swapc
SetRect(&src_rect, 0, 0, swapchain->front_buffer->resource.width, swapchain->front_buffer->resource.height);
dst_rect = src_rect;
- if (swapchain->desc.windowed)
+ if (swapchain->state.desc.windowed)
{
MapWindowPoints(swapchain->win_handle, NULL, (POINT *)&dst_rect, 2);
FIXME("Using destination rect %s in windowed mode, this is likely wrong.\n",
@@ -239,7 +239,7 @@ struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wi
* NULL). We need this because this function is called from
* stateblock_init_default_state() to get the default scissorrect
* dimensions. */
- if (!swapchain->back_buffers || back_buffer_idx >= swapchain->desc.backbuffer_count)
+ if (!swapchain->back_buffers || back_buffer_idx >= swapchain->state.desc.backbuffer_count)
{
WARN("Invalid back buffer index.\n");
/* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it
@@ -289,7 +289,7 @@ void CDECL wined3d_swapchain_get_desc(const struct wined3d_swapchain *swapchain,
{
TRACE("swapchain %p, desc %p.\n", swapchain, desc);
- *desc = swapchain->desc;
+ *desc = swapchain->state.desc;
}
HRESULT CDECL wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain *swapchain,
@@ -393,7 +393,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
unsigned int i;
static const DWORD supported_locations = WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_RB_MULTISAMPLE;
- if (swapchain->desc.backbuffer_count < 2 || !swapchain->render_to_fbo)
+ if (swapchain->state.desc.backbuffer_count < 2 || !swapchain->render_to_fbo)
return;
texture_prev = wined3d_texture_gl(swapchain->back_buffers[0]);
@@ -403,7 +403,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
rb0 = texture_prev->rb_multisample;
locations0 = texture_prev->t.sub_resources[0].locations;
- for (i = 1; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 1; i < swapchain->state.desc.backbuffer_count; ++i)
{
texture = wined3d_texture_gl(swapchain->back_buffers[i]);
sub_resource = &texture->t.sub_resources[0];
@@ -432,6 +432,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
const RECT *src_rect, const RECT *dst_rect, unsigned int swap_interval, DWORD flags)
{
+ const struct wined3d_swapchain_desc *desc = &swapchain->state.desc;
struct wined3d_texture *back_buffer = swapchain->back_buffers[0];
const struct wined3d_fb_state *fb = &swapchain->device->cs->fb;
struct wined3d_rendertarget_view *dsv = fb->depth_stencil;
@@ -481,7 +482,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
TRACE("Rendering the software cursor.\n");
- if (swapchain->desc.windowed)
+ if (desc->windowed)
MapWindowPoints(NULL, swapchain->win_handle, (POINT *)&dst_rect, 2);
if (wined3d_clip_blit(&clip_rect, &dst_rect, &src_rect))
wined3d_texture_blt(back_buffer, 0, &dst_rect, cursor_texture, 0,
@@ -492,11 +493,11 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
if (!(render_to_fbo = swapchain->render_to_fbo)
&& (src_rect->left || src_rect->top
- || src_rect->right != swapchain->desc.backbuffer_width
- || src_rect->bottom != swapchain->desc.backbuffer_height
+ || src_rect->right != desc->backbuffer_width
+ || src_rect->bottom != desc->backbuffer_height
|| dst_rect->left || dst_rect->top
- || dst_rect->right != swapchain->desc.backbuffer_width
- || dst_rect->bottom != swapchain->desc.backbuffer_height))
+ || dst_rect->right != desc->backbuffer_width
+ || dst_rect->bottom != desc->backbuffer_height))
render_to_fbo = TRUE;
/* Rendering to a window of different size, presenting partial rectangles,
@@ -555,16 +556,16 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain,
* The FLIP swap effect is not implemented yet. We could mark WINED3D_LOCATION_DRAWABLE
* up to date and hope WGL flipped front and back buffers and read this data into
* the FBO. Don't bother about this for now. */
- if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_DISCARD
- || swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP_DISCARD)
- wined3d_texture_validate_location(swapchain->back_buffers[swapchain->desc.backbuffer_count - 1],
+ if (desc->swap_effect == WINED3D_SWAP_EFFECT_DISCARD
+ || desc->swap_effect == WINED3D_SWAP_EFFECT_FLIP_DISCARD)
+ wined3d_texture_validate_location(swapchain->back_buffers[desc->backbuffer_count - 1],
0, WINED3D_LOCATION_DISCARDED);
if (dsv && dsv->resource->type != WINED3D_RTYPE_BUFFER)
{
struct wined3d_texture *ds = texture_from_resource(dsv->resource);
- if ((swapchain->desc.flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
+ if ((desc->flags & WINED3D_SWAPCHAIN_DISCARD_DEPTHSTENCIL
|| ds->flags & WINED3D_TEXTURE_DISCARD))
wined3d_texture_validate_location(ds, dsv->sub_resource_idx, WINED3D_LOCATION_DISCARDED);
}
@@ -614,7 +615,7 @@ static void swapchain_gdi_frontbuffer_updated(struct wined3d_swapchain *swapchai
/* Front buffer coordinates are screen coordinates. Map them to the
* destination window if not fullscreened. */
- if (swapchain->desc.windowed)
+ if (swapchain->state.desc.windowed)
ClientToScreen(window, &offset);
TRACE("offset %s.\n", wine_dbgstr_point(&offset));
@@ -689,7 +690,7 @@ static void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain)
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
return;
- if (!swapchain->desc.backbuffer_count)
+ if (!swapchain->state.desc.backbuffer_count)
{
TRACE("Single buffered rendering.\n");
swapchain->render_to_fbo = FALSE;
@@ -814,30 +815,30 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
wined3d_swapchain_state_setup_fullscreen(&swapchain->state,
window, desc->backbuffer_width, desc->backbuffer_height);
}
- swapchain->desc = *desc;
- wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->desc.backbuffer_format,
- &swapchain->desc.multisample_type, &swapchain->desc.multisample_quality);
+ swapchain->state.desc = *desc;
+ wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->state.desc.backbuffer_format,
+ &swapchain->state.desc.multisample_type, &swapchain->state.desc.multisample_quality);
swapchain_update_render_to_fbo(swapchain);
TRACE("Creating front buffer.\n");
texture_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
- texture_desc.format = swapchain->desc.backbuffer_format;
- texture_desc.multisample_type = swapchain->desc.multisample_type;
- texture_desc.multisample_quality = swapchain->desc.multisample_quality;
+ texture_desc.format = swapchain->state.desc.backbuffer_format;
+ texture_desc.multisample_type = swapchain->state.desc.multisample_type;
+ texture_desc.multisample_quality = swapchain->state.desc.multisample_quality;
texture_desc.usage = 0;
if (device->wined3d->flags & WINED3D_NO3D)
texture_desc.usage |= WINED3DUSAGE_OWNDC;
texture_desc.bind_flags = 0;
texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_LOCKABLE_BACKBUFFER)
+ if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_LOCKABLE_BACKBUFFER)
texture_desc.access |= WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
- texture_desc.width = swapchain->desc.backbuffer_width;
- texture_desc.height = swapchain->desc.backbuffer_height;
+ texture_desc.width = swapchain->state.desc.backbuffer_width;
+ texture_desc.height = swapchain->state.desc.backbuffer_height;
texture_desc.depth = 1;
texture_desc.size = 0;
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_GDI_COMPATIBLE)
+ if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_GDI_COMPATIBLE)
texture_flags |= WINED3D_TEXTURE_CREATE_GET_DC;
if (FAILED(hr = device->device_parent->ops->create_swapchain_texture(device->device_parent,
@@ -883,9 +884,9 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
}
}
- if (swapchain->desc.backbuffer_count > 0)
+ if (swapchain->state.desc.backbuffer_count > 0)
{
- if (!(swapchain->back_buffers = heap_calloc(swapchain->desc.backbuffer_count,
+ if (!(swapchain->back_buffers = heap_calloc(swapchain->state.desc.backbuffer_count,
sizeof(*swapchain->back_buffers))))
{
ERR("Failed to allocate backbuffer array memory.\n");
@@ -893,18 +894,18 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
goto err;
}
- texture_desc.bind_flags = swapchain->desc.backbuffer_bind_flags;
+ texture_desc.bind_flags = swapchain->state.desc.backbuffer_bind_flags;
texture_desc.usage = 0;
if (device->wined3d->flags & WINED3D_NO3D)
texture_desc.usage |= WINED3DUSAGE_OWNDC;
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
{
TRACE("Creating back buffer %u.\n", i);
if (FAILED(hr = device->device_parent->ops->create_swapchain_texture(device->device_parent,
parent, &texture_desc, texture_flags, &swapchain->back_buffers[i])))
{
WARN("Failed to create back buffer %u, hr %#x.\n", i, hr);
- swapchain->desc.backbuffer_count = i;
+ swapchain->state.desc.backbuffer_count = i;
goto err;
}
wined3d_texture_set_swapchain(swapchain->back_buffers[i], swapchain);
@@ -920,7 +921,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
struct wined3d_view_desc desc;
struct wined3d_texture *ds;
- texture_desc.format = swapchain->desc.auto_depth_stencil_format;
+ texture_desc.format = swapchain->state.desc.auto_depth_stencil_format;
texture_desc.usage = 0;
texture_desc.bind_flags = WINED3D_BIND_DEPTH_STENCIL;
texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
@@ -964,7 +965,7 @@ err:
if (swapchain->back_buffers)
{
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
{
if (swapchain->back_buffers[i])
{
@@ -1140,7 +1141,7 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
wined3d_resource_update_draw_binding(&swapchain->front_buffer->resource);
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < swapchain->state.desc.backbuffer_count; ++i)
{
wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->resource);
}
@@ -1171,8 +1172,8 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
*
* Guild Wars 1 wants a WINDOWPOSCHANGED message on the device window to
* resume drawing after a focus loss. */
- SetWindowPos(window, NULL, 0, 0, swapchain->desc.backbuffer_width,
- swapchain->desc.backbuffer_height, SWP_NOACTIVATE | SWP_NOZORDER);
+ SetWindowPos(window, NULL, 0, 0, swapchain->state.desc.backbuffer_width,
+ swapchain->state.desc.backbuffer_height, SWP_NOACTIVATE | SWP_NOZORDER);
}
if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE)
@@ -1216,6 +1217,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
unsigned int width, unsigned int height, enum wined3d_format_id format_id,
enum wined3d_multisample_type multisample_type, unsigned int multisample_quality)
{
+ struct wined3d_swapchain_desc *desc = &swapchain->state.desc;
BOOL update_desc = FALSE;
TRACE("swapchain %p, buffer_count %u, width %u, height %u, format %s, "
@@ -1225,7 +1227,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
wined3d_swapchain_apply_sample_count_override(swapchain, format_id, &multisample_type, &multisample_quality);
- if (buffer_count && buffer_count != swapchain->desc.backbuffer_count)
+ if (buffer_count && buffer_count != desc->backbuffer_count)
FIXME("Cannot change the back buffer count yet.\n");
wined3d_cs_finish(swapchain->device->cs, WINED3D_CS_QUEUE_DEFAULT);
@@ -1238,7 +1240,7 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
RECT client_rect;
- if (!swapchain->desc.windowed)
+ if (!desc->windowed)
return WINED3DERR_INVALIDCALL;
if (!GetClientRect(swapchain->device_window, &client_rect))
@@ -1254,32 +1256,31 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
height = client_rect.bottom;
}
- if (width != swapchain->desc.backbuffer_width
- || height != swapchain->desc.backbuffer_height)
+ if (width != desc->backbuffer_width || height != desc->backbuffer_height)
{
- swapchain->desc.backbuffer_width = width;
- swapchain->desc.backbuffer_height = height;
+ desc->backbuffer_width = width;
+ desc->backbuffer_height = height;
update_desc = TRUE;
}
if (format_id == WINED3DFMT_UNKNOWN)
{
- if (!swapchain->desc.windowed)
+ if (!desc->windowed)
return WINED3DERR_INVALIDCALL;
format_id = swapchain->original_mode.format_id;
}
- if (format_id != swapchain->desc.backbuffer_format)
+ if (format_id != desc->backbuffer_format)
{
- swapchain->desc.backbuffer_format = format_id;
+ desc->backbuffer_format = format_id;
update_desc = TRUE;
}
- if (multisample_type != swapchain->desc.multisample_type
- || multisample_quality != swapchain->desc.multisample_quality)
+ if (multisample_type != desc->multisample_type
+ || multisample_quality != desc->multisample_quality)
{
- swapchain->desc.multisample_type = multisample_type;
- swapchain->desc.multisample_quality = multisample_quality;
+ desc->multisample_type = multisample_type;
+ desc->multisample_quality = multisample_quality;
update_desc = TRUE;
}
@@ -1288,16 +1289,16 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
HRESULT hr;
UINT i;
- if (FAILED(hr = wined3d_texture_update_desc(swapchain->front_buffer, swapchain->desc.backbuffer_width,
- swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
- swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0)))
+ if (FAILED(hr = wined3d_texture_update_desc(swapchain->front_buffer, desc->backbuffer_width,
+ desc->backbuffer_height, desc->backbuffer_format,
+ desc->multisample_type, desc->multisample_quality, NULL, 0)))
return hr;
- for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
+ for (i = 0; i < desc->backbuffer_count; ++i)
{
- if (FAILED(hr = wined3d_texture_update_desc(swapchain->back_buffers[i], swapchain->desc.backbuffer_width,
- swapchain->desc.backbuffer_height, swapchain->desc.backbuffer_format,
- swapchain->desc.multisample_type, swapchain->desc.multisample_quality, NULL, 0)))
+ if (FAILED(hr = wined3d_texture_update_desc(swapchain->back_buffers[i], desc->backbuffer_width,
+ desc->backbuffer_height, desc->backbuffer_format,
+ desc->multisample_type, desc->multisample_quality, NULL, 0)))
return hr;
}
}
@@ -1314,7 +1315,7 @@ static HRESULT wined3d_swapchain_set_display_mode(struct wined3d_swapchain *swap
struct wined3d_device *device = swapchain->device;
HRESULT hr;
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
+ if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
{
if (FAILED(hr = wined3d_find_closest_matching_adapter_mode(device->wined3d,
device->adapter->ordinal, mode)))
@@ -1336,6 +1337,7 @@ static HRESULT wined3d_swapchain_set_display_mode(struct wined3d_swapchain *swap
HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchain,
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;
@@ -1349,7 +1351,7 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
device = swapchain->device;
window = swapchain->device_window;
- if (swapchain->desc.windowed)
+ if (state->desc.windowed)
{
SetRect(&window_rect, 0, 0, mode->width, mode->height);
AdjustWindowRectEx(&window_rect,
@@ -1360,7 +1362,7 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
GetWindowRect(window, &original_window_rect);
OffsetRect(&window_rect, original_window_rect.left, original_window_rect.top);
}
- else if (swapchain->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
+ else if (state->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
{
actual_mode = *mode;
if (FAILED(hr = wined3d_swapchain_set_display_mode(swapchain, &actual_mode)))
@@ -1503,13 +1505,14 @@ void wined3d_window_state_restore_from_fullscreen(struct wined3d_swapchain_state
HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapchain,
const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode)
{
+ struct wined3d_swapchain_state *state = &swapchain->state;
struct wined3d_device *device = swapchain->device;
struct wined3d_display_mode actual_mode;
HRESULT hr;
TRACE("swapchain %p, desc %p, mode %p.\n", swapchain, swapchain_desc, mode);
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
+ if (state->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
{
if (mode)
{
@@ -1553,10 +1556,10 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
unsigned int width = actual_mode.width;
unsigned int height = actual_mode.height;
- if (swapchain->desc.windowed)
+ if (state->desc.windowed)
{
/* Switch from windowed to fullscreen */
- if (FAILED(hr = wined3d_swapchain_state_setup_fullscreen(&swapchain->state,
+ if (FAILED(hr = wined3d_swapchain_state_setup_fullscreen(state,
swapchain->device_window, width, height)))
return hr;
}
@@ -1573,16 +1576,16 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
}
swapchain->d3d_mode = actual_mode;
}
- else if (!swapchain->desc.windowed)
+ else if (!state->desc.windowed)
{
/* Fullscreen -> windowed switch */
RECT *window_rect = NULL;
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
+ if (state->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
window_rect = &swapchain->original_window_rect;
- wined3d_window_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, window_rect);
+ wined3d_window_state_restore_from_fullscreen(state, swapchain->device_window, window_rect);
}
- swapchain->desc.windowed = swapchain_desc->windowed;
+ state->desc.windowed = swapchain_desc->windowed;
return WINED3D_OK;
}
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index d74c36f36f3..7962496920b 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -446,13 +446,13 @@ void wined3d_rendertarget_view_get_drawable_size(const struct wined3d_rendertarg
}
else if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
{
- const struct wined3d_swapchain *swapchain = context->swapchain;
+ const struct wined3d_swapchain_desc *desc = &context->swapchain->state.desc;
/* The drawable size of a backbuffer / aux buffer offscreen target is
* the size of the current context's drawable, which is the size of
* the back buffer of the swapchain the active context belongs to. */
- *width = swapchain->desc.backbuffer_width;
- *height = swapchain->desc.backbuffer_height;
+ *width = desc->backbuffer_width;
+ *height = desc->backbuffer_height;
}
else
{
@@ -562,7 +562,7 @@ static void wined3d_render_target_view_gl_cs_init(void *object)
debug_d3dformat(resource->format->id), debug_d3dformat(view_gl->v.format->id));
return;
}
- if (texture_gl->t.swapchain && texture_gl->t.swapchain->desc.backbuffer_count > 1)
+ if (texture_gl->t.swapchain && texture_gl->t.swapchain->state.desc.backbuffer_count > 1)
{
FIXME("Swapchain views not supported.\n");
return;
@@ -761,7 +761,7 @@ static void wined3d_shader_resource_view_gl_cs_init(void *object)
{
TRACE("Creating identity shader resource view.\n");
}
- else if (texture_gl->t.swapchain && texture_gl->t.swapchain->desc.backbuffer_count > 1)
+ else if (texture_gl->t.swapchain && texture_gl->t.swapchain->state.desc.backbuffer_count > 1)
{
FIXME("Swapchain shader resource views not supported.\n");
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2ba7bae33e3..f0660f76096 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4176,6 +4176,8 @@ static inline struct wined3d_unordered_access_view_gl *wined3d_unordered_access_
struct wined3d_swapchain_state
{
+ struct wined3d_swapchain_desc desc;
+
/* Window styles to restore when switching fullscreen mode. */
LONG style;
LONG exstyle;
@@ -4203,7 +4205,6 @@ struct wined3d_swapchain
struct wined3d_texture **back_buffers;
struct wined3d_texture *front_buffer;
- struct wined3d_swapchain_desc desc;
struct wined3d_display_mode original_mode, d3d_mode;
RECT original_window_rect;
struct wined3d_gamma_ramp orig_gamma;
--
2.11.0
2
1
From: Conor McCarthy <cmccarthy(a)codeweavers.com>
Instead of per-device.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 167242.
dlls/wined3d/device.c | 134 ++++-------------------------------------
dlls/wined3d/swapchain.c | 122 +++++++++++++++++++++++++++++++++++--
dlls/wined3d/wined3d_private.h | 21 ++++---
3 files changed, 141 insertions(+), 136 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 71242bba111..8502b967905 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -910,115 +910,6 @@ static void destroy_default_samplers(struct wined3d_device *device, struct wined
device->null_sampler = NULL;
}
-static LONG fullscreen_style(LONG style)
-{
- /* Make sure the window is managed, otherwise we won't get keyboard input. */
- style |= WS_POPUP | WS_SYSMENU;
- style &= ~(WS_CAPTION | WS_THICKFRAME);
-
- return style;
-}
-
-static LONG fullscreen_exstyle(LONG exstyle)
-{
- /* Filter out window decorations. */
- exstyle &= ~(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE);
-
- return exstyle;
-}
-
-HRESULT wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
- HWND window, unsigned int w, unsigned int h)
-{
- LONG style, exstyle;
- BOOL filter;
-
- TRACE("Setting up window %p for fullscreen mode.\n", window);
-
- if (!IsWindow(window))
- {
- WARN("%p is not a valid window.\n", window);
- return WINED3DERR_NOTAVAILABLE;
- }
-
- if (device->style || device->exStyle)
- {
- ERR("Changing the window style for window %p, but another style (%08x, %08x) is already stored.\n",
- window, device->style, device->exStyle);
- }
-
- device->style = GetWindowLongW(window, GWL_STYLE);
- device->exStyle = GetWindowLongW(window, GWL_EXSTYLE);
-
- style = fullscreen_style(device->style);
- exstyle = fullscreen_exstyle(device->exStyle);
-
- TRACE("Old style was %08x, %08x, setting to %08x, %08x.\n",
- device->style, device->exStyle, style, exstyle);
-
- filter = wined3d_filter_messages(window, TRUE);
-
- SetWindowLongW(window, GWL_STYLE, style);
- SetWindowLongW(window, GWL_EXSTYLE, exstyle);
- SetWindowPos(window, HWND_TOPMOST, 0, 0, w, h, SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOACTIVATE);
-
- wined3d_filter_messages(window, filter);
-
- return WINED3D_OK;
-}
-
-void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
- HWND window, const RECT *window_rect)
-{
- unsigned int window_pos_flags = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE;
- LONG style, exstyle;
- RECT rect = {0};
- BOOL filter;
-
- if (!device->style && !device->exStyle)
- return;
-
- style = GetWindowLongW(window, GWL_STYLE);
- exstyle = GetWindowLongW(window, GWL_EXSTYLE);
-
- /* These flags are set by wined3d_device_setup_fullscreen_window, not the
- * application, and we want to ignore them in the test below, since it's
- * not the application's fault that they changed. Additionally, we want to
- * preserve the current status of these flags (i.e. don't restore them) to
- * more closely emulate the behavior of Direct3D, which leaves these flags
- * alone when returning to windowed mode. */
- device->style ^= (device->style ^ style) & WS_VISIBLE;
- device->exStyle ^= (device->exStyle ^ exstyle) & WS_EX_TOPMOST;
-
- TRACE("Restoring window style of window %p to %08x, %08x.\n",
- window, device->style, device->exStyle);
-
- filter = wined3d_filter_messages(window, TRUE);
-
- /* Only restore the style if the application didn't modify it during the
- * fullscreen phase. Some applications change it before calling Reset()
- * when switching between windowed and fullscreen modes (HL2), some
- * depend on the original style (Eve Online). */
- if (style == fullscreen_style(device->style) && exstyle == fullscreen_exstyle(device->exStyle))
- {
- SetWindowLongW(window, GWL_STYLE, device->style);
- SetWindowLongW(window, GWL_EXSTYLE, device->exStyle);
- }
-
- if (window_rect)
- rect = *window_rect;
- else
- window_pos_flags |= (SWP_NOMOVE | SWP_NOSIZE);
- SetWindowPos(window, 0, rect.left, rect.top,
- rect.right - rect.left, rect.bottom - rect.top, window_pos_flags);
-
- wined3d_filter_messages(window, filter);
-
- /* Delete the old values. */
- device->style = 0;
- device->exStyle = 0;
-}
-
HRESULT CDECL wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window)
{
TRACE("device %p, window %p.\n", device, window);
@@ -5543,19 +5434,18 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
}
else if (!swapchain_desc->windowed)
{
- DWORD style = device->style;
- DWORD exStyle = device->exStyle;
- /* If we're in fullscreen, and the mode wasn't changed, we have to get the window back into
- * the right position. Some applications(Battlefield 2, Guild Wars) move it and then call
- * Reset to clear up their mess. Guild Wars also loses the device during that.
- */
- device->style = 0;
- device->exStyle = 0;
- wined3d_device_setup_fullscreen_window(device, swapchain->device_window,
- swapchain_desc->backbuffer_width,
- swapchain_desc->backbuffer_height);
- device->style = style;
- device->exStyle = exStyle;
+ DWORD style = swapchain->state.style;
+ DWORD exstyle = swapchain->state.exstyle;
+ /* If we're in fullscreen, and the mode wasn't changed, we have to get
+ * the window back into the right position. Some applications
+ * (Battlefield 2, Guild Wars) move it and then call Reset() to clean
+ * 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,
+ swapchain_desc->backbuffer_width, swapchain_desc->backbuffer_height);
+ swapchain->state.style = style;
+ swapchain->state.exstyle = exstyle;
}
if (FAILED(hr = wined3d_swapchain_resize_buffers(swapchain, swapchain_desc->backbuffer_count,
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index c5db2e919eb..10363e007a8 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->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
{
- wined3d_device_restore_fullscreen_window(swapchain->device, swapchain->device_window,
- &swapchain->original_window_rect);
+ wined3d_window_state_restore_from_fullscreen(&swapchain->state,
+ swapchain->device_window, &swapchain->original_window_rect);
wined3d_device_release_focus_window(swapchain->device);
}
}
else
{
- wined3d_device_restore_fullscreen_window(swapchain->device, swapchain->device_window, NULL);
+ wined3d_window_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, NULL);
}
}
@@ -811,7 +811,8 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
}
else
{
- wined3d_device_setup_fullscreen_window(device, window, desc->backbuffer_width, desc->backbuffer_height);
+ wined3d_swapchain_state_setup_fullscreen(&swapchain->state,
+ window, desc->backbuffer_width, desc->backbuffer_height);
}
swapchain->desc = *desc;
wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->desc.backbuffer_format,
@@ -1390,6 +1391,115 @@ HRESULT CDECL wined3d_swapchain_resize_target(struct wined3d_swapchain *swapchai
return WINED3D_OK;
}
+static LONG fullscreen_style(LONG style)
+{
+ /* Make sure the window is managed, otherwise we won't get keyboard input. */
+ style |= WS_POPUP | WS_SYSMENU;
+ style &= ~(WS_CAPTION | WS_THICKFRAME);
+
+ return style;
+}
+
+static LONG fullscreen_exstyle(LONG exstyle)
+{
+ /* Filter out window decorations. */
+ exstyle &= ~(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE);
+
+ return exstyle;
+}
+
+HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state *state,
+ HWND window, unsigned int w, unsigned int h)
+{
+ LONG style, exstyle;
+ BOOL filter;
+
+ TRACE("Setting up window %p for fullscreen mode.\n", window);
+
+ if (!IsWindow(window))
+ {
+ WARN("%p is not a valid window.\n", window);
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (state->style || state->exstyle)
+ {
+ ERR("Changing the window style for window %p, but another style (%08x, %08x) is already stored.\n",
+ window, state->style, state->exstyle);
+ }
+
+ state->style = GetWindowLongW(window, GWL_STYLE);
+ state->exstyle = GetWindowLongW(window, GWL_EXSTYLE);
+
+ style = fullscreen_style(state->style);
+ exstyle = fullscreen_exstyle(state->exstyle);
+
+ TRACE("Old style was %08x, %08x, setting to %08x, %08x.\n",
+ state->style, state->exstyle, style, exstyle);
+
+ filter = wined3d_filter_messages(window, TRUE);
+
+ SetWindowLongW(window, GWL_STYLE, style);
+ SetWindowLongW(window, GWL_EXSTYLE, exstyle);
+ SetWindowPos(window, HWND_TOPMOST, 0, 0, w, h, SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOACTIVATE);
+
+ wined3d_filter_messages(window, filter);
+
+ return WINED3D_OK;
+}
+
+void wined3d_window_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;
+ LONG style, exstyle;
+ RECT rect = {0};
+ BOOL filter;
+
+ if (!state->style && !state->exstyle)
+ return;
+
+ style = GetWindowLongW(window, GWL_STYLE);
+ exstyle = GetWindowLongW(window, GWL_EXSTYLE);
+
+ /* These flags are set by wined3d_device_setup_fullscreen_window, not the
+ * application, and we want to ignore them in the test below, since it's
+ * not the application's fault that they changed. Additionally, we want to
+ * preserve the current status of these flags (i.e. don't restore them) to
+ * more closely emulate the behavior of Direct3D, which leaves these flags
+ * alone when returning to windowed mode. */
+ state->style ^= (state->style ^ style) & WS_VISIBLE;
+ state->exstyle ^= (state->exstyle ^ exstyle) & WS_EX_TOPMOST;
+
+ TRACE("Restoring window style of window %p to %08x, %08x.\n",
+ window, state->style, state->exstyle);
+
+ filter = wined3d_filter_messages(window, TRUE);
+
+ /* Only restore the style if the application didn't modify it during the
+ * fullscreen phase. Some applications change it before calling Reset()
+ * when switching between windowed and fullscreen modes (HL2), some
+ * depend on the original style (Eve Online). */
+ if (style == fullscreen_style(state->style) && exstyle == fullscreen_exstyle(state->exstyle))
+ {
+ SetWindowLongW(window, GWL_STYLE, state->style);
+ SetWindowLongW(window, GWL_EXSTYLE, state->exstyle);
+ }
+
+ if (window_rect)
+ rect = *window_rect;
+ else
+ window_pos_flags |= (SWP_NOMOVE | SWP_NOSIZE);
+ SetWindowPos(window, 0, rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top, window_pos_flags);
+
+ wined3d_filter_messages(window, filter);
+
+ /* Delete the old values. */
+ state->style = 0;
+ state->exstyle = 0;
+}
+
HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapchain,
const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode)
{
@@ -1446,7 +1556,7 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
if (swapchain->desc.windowed)
{
/* Switch from windowed to fullscreen */
- if (FAILED(hr = wined3d_device_setup_fullscreen_window(device,
+ if (FAILED(hr = wined3d_swapchain_state_setup_fullscreen(&swapchain->state,
swapchain->device_window, width, height)))
return hr;
}
@@ -1469,7 +1579,7 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
RECT *window_rect = NULL;
if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
window_rect = &swapchain->original_window_rect;
- wined3d_device_restore_fullscreen_window(device, swapchain->device_window, window_rect);
+ wined3d_window_state_restore_from_fullscreen(&swapchain->state, swapchain->device_window, window_rect);
}
swapchain->desc.windowed = swapchain_desc->windowed;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e7da3488315..2ba7bae33e3 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3167,10 +3167,6 @@ struct wined3d_device
struct wined3d *wined3d;
struct wined3d_adapter *adapter;
- /* Window styles to restore when switching fullscreen mode */
- LONG style;
- LONG exStyle;
-
const struct wined3d_shader_backend_ops *shader_backend;
void *shader_priv;
void *fragment_priv;
@@ -3255,12 +3251,8 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL
void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN;
-void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
- HWND window, const RECT *window_rect) DECLSPEC_HIDDEN;
HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device,
struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
-HRESULT wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
- HWND window, unsigned int w, unsigned int h) DECLSPEC_HIDDEN;
void wined3d_device_uninit_3d(struct wined3d_device *device) DECLSPEC_HIDDEN;
struct wined3d_device_no3d
@@ -4182,6 +4174,18 @@ static inline struct wined3d_unordered_access_view_gl *wined3d_unordered_access_
return CONTAINING_RECORD(view, struct wined3d_unordered_access_view_gl, v);
}
+struct wined3d_swapchain_state
+{
+ /* Window styles to restore when switching fullscreen mode. */
+ LONG style;
+ LONG exstyle;
+};
+
+void wined3d_window_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;
+
struct wined3d_swapchain_ops
{
void (*swapchain_present)(struct wined3d_swapchain *swapchain,
@@ -4215,6 +4219,7 @@ struct wined3d_swapchain
struct wined3d_context **context;
unsigned int num_contexts;
+ struct wined3d_swapchain_state state;
HWND win_handle;
HWND device_window;
--
2.11.0
2
1
29 Jul '19
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/device.c | 24 ++++++------------------
dlls/wined3d/swapchain.c | 34 ++++++++++++++++------------------
dlls/wined3d/wined3d_main.c | 37 ++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 4 ++--
4 files changed, 60 insertions(+), 39 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 343e25b482c..71242bba111 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -930,8 +930,8 @@ static LONG fullscreen_exstyle(LONG exstyle)
HRESULT wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
HWND window, unsigned int w, unsigned int h)
{
- BOOL filter_messages;
LONG style, exstyle;
+ BOOL filter;
TRACE("Setting up window %p for fullscreen mode.\n", window);
@@ -956,14 +956,13 @@ HRESULT wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
TRACE("Old style was %08x, %08x, setting to %08x, %08x.\n",
device->style, device->exStyle, style, exstyle);
- filter_messages = device->filter_messages;
- device->filter_messages = TRUE;
+ filter = wined3d_filter_messages(window, TRUE);
SetWindowLongW(window, GWL_STYLE, style);
SetWindowLongW(window, GWL_EXSTYLE, exstyle);
SetWindowPos(window, HWND_TOPMOST, 0, 0, w, h, SWP_FRAMECHANGED | SWP_SHOWWINDOW | SWP_NOACTIVATE);
- device->filter_messages = filter_messages;
+ wined3d_filter_messages(window, filter);
return WINED3D_OK;
}
@@ -972,9 +971,9 @@ void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
HWND window, const RECT *window_rect)
{
unsigned int window_pos_flags = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE;
- BOOL filter_messages;
LONG style, exstyle;
RECT rect = {0};
+ BOOL filter;
if (!device->style && !device->exStyle)
return;
@@ -994,8 +993,7 @@ void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
TRACE("Restoring window style of window %p to %08x, %08x.\n",
window, device->style, device->exStyle);
- filter_messages = device->filter_messages;
- device->filter_messages = TRUE;
+ filter = wined3d_filter_messages(window, TRUE);
/* Only restore the style if the application didn't modify it during the
* fullscreen phase. Some applications change it before calling Reset()
@@ -1014,7 +1012,7 @@ void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
SetWindowPos(window, 0, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, window_pos_flags);
- device->filter_messages = filter_messages;
+ wined3d_filter_messages(window, filter);
/* Delete the old values. */
device->style = 0;
@@ -5994,16 +5992,6 @@ void device_invalidate_state(const struct wined3d_device *device, DWORD state)
LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL unicode,
UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc)
{
- if (device->filter_messages && message != WM_DISPLAYCHANGE)
- {
- TRACE("Filtering message: window %p, message %#x, wparam %#lx, lparam %#lx.\n",
- window, message, wparam, lparam);
- if (unicode)
- return DefWindowProcW(window, message, wparam, lparam);
- else
- return DefWindowProcA(window, message, wparam, lparam);
- }
-
if (message == WM_DESTROY)
{
TRACE("unregister window %p.\n", window);
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index ac2afa27431..c5db2e919eb 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1148,16 +1148,16 @@ 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;
- BOOL filter_messages = device->filter_messages;
- BOOL focus_messages = device->wined3d->flags & WINED3D_FOCUS_MESSAGES;
+ HWND window = swapchain->device_window;
+ BOOL focus_messages, filter;
/* This code is not protected by the wined3d mutex, so it may run while
* wined3d_device_reset is active. Testing on Windows shows that changing
* focus during resets and resetting during focus change events causes
* the application to crash with an invalid memory access. */
- if (!focus_messages)
- device->filter_messages = 1;
+ if (!(focus_messages = device->wined3d->flags & WINED3D_FOCUS_MESSAGES))
+ filter = wined3d_filter_messages(window, TRUE);
if (activate)
{
@@ -1170,9 +1170,8 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
*
* Guild Wars 1 wants a WINDOWPOSCHANGED message on the device window to
* resume drawing after a focus loss. */
- SetWindowPos(swapchain->device_window, NULL, 0, 0,
- swapchain->desc.backbuffer_width, swapchain->desc.backbuffer_height,
- SWP_NOACTIVATE | SWP_NOZORDER);
+ SetWindowPos(window, NULL, 0, 0, swapchain->desc.backbuffer_width,
+ swapchain->desc.backbuffer_height, SWP_NOACTIVATE | SWP_NOZORDER);
}
if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE)
@@ -1204,13 +1203,12 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
if (swapchain == device->swapchains[0])
device->device_parent->ops->activate(device->device_parent, FALSE);
- if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)
- && IsWindowVisible(swapchain->device_window))
- ShowWindow(swapchain->device_window, SW_MINIMIZE);
+ if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES) && IsWindowVisible(window))
+ ShowWindow(window, SW_MINIMIZE);
}
if (!focus_messages)
- device->filter_messages = filter_messages;
+ wined3d_filter_messages(window, filter);
}
HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapchain, unsigned int buffer_count,
@@ -1454,14 +1452,14 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
}
else
{
- /* Fullscreen -> fullscreen mode change */
- BOOL filter_messages = device->filter_messages;
- device->filter_messages = TRUE;
+ HWND window = swapchain->device_window;
+ BOOL filter;
- MoveWindow(swapchain->device_window, 0, 0, width, height, TRUE);
- ShowWindow(swapchain->device_window, SW_SHOW);
-
- device->filter_messages = filter_messages;
+ /* Fullscreen -> fullscreen mode change */
+ filter = wined3d_filter_messages(window, TRUE);
+ MoveWindow(window, 0, 0, width, height, TRUE);
+ ShowWindow(window, SW_SHOW);
+ wined3d_filter_messages(window, filter);
}
swapchain->d3d_mode = actual_mode;
}
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 716a2b088c8..2d74d6f9d94 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -36,6 +36,7 @@ struct wined3d_wndproc
struct wined3d *wined3d;
HWND window;
BOOL unicode;
+ BOOL filter;
WNDPROC proc;
struct wined3d_device *device;
uint32_t flags;
@@ -474,11 +475,32 @@ static struct wined3d_wndproc *wined3d_find_wndproc(HWND window, struct wined3d
return NULL;
}
+BOOL wined3d_filter_messages(HWND window, BOOL filter)
+{
+ struct wined3d_wndproc *entry;
+ BOOL ret;
+
+ wined3d_wndproc_mutex_lock();
+
+ if (!(entry = wined3d_find_wndproc(window, NULL)))
+ {
+ wined3d_wndproc_mutex_unlock();
+ return FALSE;
+ }
+
+ ret = entry->filter;
+ entry->filter = filter;
+
+ wined3d_wndproc_mutex_unlock();
+
+ return ret;
+}
+
static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam, LPARAM lparam)
{
struct wined3d_wndproc *entry;
struct wined3d_device *device;
- BOOL unicode;
+ BOOL unicode, filter;
WNDPROC proc;
wined3d_wndproc_mutex_lock();
@@ -492,11 +514,24 @@ static LRESULT CALLBACK wined3d_wndproc(HWND window, UINT message, WPARAM wparam
device = entry->device;
unicode = entry->unicode;
+ filter = entry->filter;
proc = entry->proc;
wined3d_wndproc_mutex_unlock();
if (device)
+ {
+ if (filter && message != WM_DISPLAYCHANGE)
+ {
+ TRACE("Filtering message: window %p, message %#x, wparam %#lx, lparam %#lx.\n",
+ window, message, wparam, lparam);
+
+ if (unicode)
+ return DefWindowProcW(window, message, wparam, lparam);
+ return DefWindowProcA(window, message, wparam, lparam);
+ }
+
return device_process_message(device, window, unicode, message, wparam, lparam, proc);
+ }
if (unicode)
return CallWindowProcW(proc, window, message, wparam, lparam);
return CallWindowProcA(proc, window, message, wparam, lparam);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9d429a8d893..e7da3488315 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2993,6 +2993,7 @@ struct wined3d
struct wined3d_adapter *adapters[1];
};
+BOOL wined3d_filter_messages(HWND window, BOOL filter) DECLSPEC_HIDDEN;
void wined3d_hook_swapchain(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
HRESULT wined3d_init(struct wined3d *wined3d, DWORD flags) DECLSPEC_HIDDEN;
void wined3d_unhook_swapchain(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
@@ -3183,8 +3184,7 @@ struct wined3d_device
BYTE d3d_initialized : 1;
BYTE inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */
BYTE softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */
- BYTE filter_messages : 1;
- BYTE padding : 3;
+ BYTE padding : 4;
unsigned char surface_alignment; /* Line Alignment of surfaces */
--
2.11.0
2
1
[PATCH 2/5] wined3d: Setup/restore fullscreen window state inside wined3d.
by Henri Verbeet 29 Jul '19
by Henri Verbeet 29 Jul '19
29 Jul '19
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d3d8/device.c | 10 +---------
dlls/d3d9/device.c | 10 ----------
dlls/ddraw/ddraw.c | 15 ---------------
dlls/wined3d/device.c | 6 +++---
dlls/wined3d/swapchain.c | 27 +++++++++++++++++++--------
dlls/wined3d/wined3d.spec | 2 --
dlls/wined3d/wined3d_private.h | 4 ++++
include/wine/wined3d.h | 4 ----
8 files changed, 27 insertions(+), 51 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 36197e3b31f..b5436241a9e 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -3602,10 +3602,8 @@ HRESULT device_init(struct d3d8_device *device, struct d3d8 *parent, struct wine
if (!parameters->Windowed)
{
- HWND device_window = parameters->hDeviceWindow;
-
if (!focus_window)
- focus_window = device_window;
+ focus_window = parameters->hDeviceWindow;
if (FAILED(hr = wined3d_device_acquire_focus_window(device->wined3d_device, focus_window)))
{
ERR("Failed to acquire focus window, hr %#x.\n", hr);
@@ -3614,12 +3612,6 @@ HRESULT device_init(struct d3d8_device *device, struct d3d8 *parent, struct wine
heap_free(device->handle_table.entries);
return hr;
}
-
- if (!device_window)
- device_window = focus_window;
- wined3d_device_setup_fullscreen_window(device->wined3d_device, device_window,
- parameters->BackBufferWidth,
- parameters->BackBufferHeight);
}
if (flags & D3DCREATE_MULTITHREADED)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 8f94eb0698f..dc3363bab8c 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -4503,16 +4503,6 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
wined3d_mutex_unlock();
return hr;
}
-
- for (i = 0; i < count; ++i)
- {
- HWND device_window = parameters[i].hDeviceWindow;
-
- if (!device_window) device_window = focus_window;
- wined3d_device_setup_fullscreen_window(device->wined3d_device, device_window,
- parameters[i].BackBufferWidth,
- parameters[i].BackBufferHeight);
- }
}
if (!(swapchain_desc = heap_alloc(sizeof(*swapchain_desc) * count)))
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 076289be094..2c7619016e1 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -884,21 +884,6 @@ static HRESULT ddraw_set_cooperative_level(struct ddraw *ddraw, HWND window,
ddraw->focuswindow = NULL;
}
- if ((cooplevel & DDSCL_FULLSCREEN) != (ddraw->cooperative_level & DDSCL_FULLSCREEN) || window != ddraw->dest_window)
- {
- if (ddraw->cooperative_level & DDSCL_FULLSCREEN)
- wined3d_device_restore_fullscreen_window(ddraw->wined3d_device, ddraw->dest_window, NULL);
-
- if (cooplevel & DDSCL_FULLSCREEN)
- {
- struct wined3d_display_mode display_mode;
-
- wined3d_get_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &display_mode, NULL);
- wined3d_device_setup_fullscreen_window(ddraw->wined3d_device, window,
- display_mode.width, display_mode.height);
- }
- }
-
if ((cooplevel & DDSCL_EXCLUSIVE) && exclusive_window != window)
{
ddraw->device_state = DDRAW_DEVICE_STATE_NOT_RESTORED;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 2c768514c46..343e25b482c 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -927,7 +927,7 @@ static LONG fullscreen_exstyle(LONG exstyle)
return exstyle;
}
-HRESULT CDECL wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
+HRESULT wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
HWND window, unsigned int w, unsigned int h)
{
BOOL filter_messages;
@@ -968,8 +968,8 @@ HRESULT CDECL wined3d_device_setup_fullscreen_window(struct wined3d_device *devi
return WINED3D_OK;
}
-void CDECL wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window,
- const RECT *window_rect)
+void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
+ HWND window, const RECT *window_rect)
{
unsigned int window_pos_flags = SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE;
BOOL filter_messages;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index bf0c308f0d3..ac2afa27431 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -75,17 +75,24 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
* desktop resolution. In case of d3d7 this will be a NOP because ddraw
* sets the resolution before starting up Direct3D, thus orig_width and
* orig_height will be equal to the modes in the presentation params. */
- if (!swapchain->desc.windowed && swapchain->desc.auto_restore_display_mode)
+ if (!swapchain->desc.windowed)
{
- if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
- swapchain->device->adapter->ordinal, &swapchain->original_mode)))
- ERR("Failed to restore display mode, hr %#x.\n", hr);
+ if (swapchain->desc.auto_restore_display_mode)
+ {
+ if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
+ swapchain->device->adapter->ordinal, &swapchain->original_mode)))
+ ERR("Failed to restore display mode, hr %#x.\n", hr);
- if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
+ if (swapchain->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
+ {
+ wined3d_device_restore_fullscreen_window(swapchain->device, swapchain->device_window,
+ &swapchain->original_window_rect);
+ wined3d_device_release_focus_window(swapchain->device);
+ }
+ }
+ else
{
- wined3d_device_restore_fullscreen_window(swapchain->device, swapchain->device_window,
- &swapchain->original_window_rect);
- wined3d_device_release_focus_window(swapchain->device);
+ wined3d_device_restore_fullscreen_window(swapchain->device, swapchain->device_window, NULL);
}
}
@@ -802,6 +809,10 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
TRACE("Updating format to %s.\n", debug_d3dformat(swapchain->original_mode.format_id));
}
}
+ else
+ {
+ wined3d_device_setup_fullscreen_window(device, window, desc->backbuffer_width, desc->backbuffer_height);
+ }
swapchain->desc = *desc;
wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->desc.backbuffer_format,
&swapchain->desc.multisample_type, &swapchain->desc.multisample_quality);
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 59f99c91e07..8b36753f458 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -127,7 +127,6 @@
@ cdecl wined3d_device_release_focus_window(ptr)
@ cdecl wined3d_device_reset(ptr ptr ptr ptr long)
@ cdecl wined3d_device_resolve_sub_resource(ptr ptr long ptr long long)
-@ cdecl wined3d_device_restore_fullscreen_window(ptr ptr ptr)
@ cdecl wined3d_device_set_base_vertex_index(ptr long)
@ cdecl wined3d_device_set_blend_state(ptr ptr ptr)
@ cdecl wined3d_device_set_clip_plane(ptr long ptr)
@@ -187,7 +186,6 @@
@ cdecl wined3d_device_set_vs_consts_i(ptr long long ptr)
@ cdecl wined3d_device_set_vs_resource_view(ptr long ptr)
@ cdecl wined3d_device_set_vs_sampler(ptr long ptr)
-@ cdecl wined3d_device_setup_fullscreen_window(ptr ptr long long)
@ cdecl wined3d_device_show_cursor(ptr long)
@ cdecl wined3d_device_update_sub_resource(ptr ptr long ptr ptr long long long)
@ cdecl wined3d_device_update_texture(ptr ptr ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dda93a33453..9d429a8d893 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3255,8 +3255,12 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL
void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN;
+void wined3d_device_restore_fullscreen_window(struct wined3d_device *device,
+ HWND window, const RECT *window_rect) DECLSPEC_HIDDEN;
HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device,
struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
+HRESULT wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
+ HWND window, unsigned int w, unsigned int h) DECLSPEC_HIDDEN;
void wined3d_device_uninit_3d(struct wined3d_device *device) DECLSPEC_HIDDEN;
struct wined3d_device_no3d
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 9a698bc8082..c71bb9c54c7 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2378,8 +2378,6 @@ void __cdecl wined3d_device_resolve_sub_resource(struct wined3d_device *device,
struct wined3d_resource *dst_resource, unsigned int dst_sub_resource_idx,
struct wined3d_resource *src_resource, unsigned int src_sub_resource_idx,
enum wined3d_format_id format_id);
-void __cdecl wined3d_device_restore_fullscreen_window(struct wined3d_device *device, HWND window,
- const RECT *window_rect);
void __cdecl wined3d_device_set_base_vertex_index(struct wined3d_device *device, INT base_index);
void __cdecl wined3d_device_set_blend_state(struct wined3d_device *device, struct wined3d_blend_state *blend_state,
const struct wined3d_color *blend_factor);
@@ -2479,8 +2477,6 @@ HRESULT __cdecl wined3d_device_set_vs_consts_i(struct wined3d_device *device,
void __cdecl wined3d_device_set_vs_resource_view(struct wined3d_device *device,
UINT idx, struct wined3d_shader_resource_view *view);
void __cdecl wined3d_device_set_vs_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler);
-HRESULT __cdecl wined3d_device_setup_fullscreen_window(struct wined3d_device *device,
- HWND window, unsigned int w, unsigned int h);
BOOL __cdecl wined3d_device_show_cursor(struct wined3d_device *device, BOOL show);
void __cdecl wined3d_device_update_sub_resource(struct wined3d_device *device, struct wined3d_resource *resource,
unsigned int sub_resource_idx, const struct wined3d_box *box, const void *data, unsigned int row_pitch,
--
2.11.0
2
1
29 Jul '19
From: Kristján Gerhardsson <kristjang(a)ccpgames.com>
Signed-off-by: Kristjan Gerhardsson <kristjang(a)ccpgames.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 167763.
dlls/wined3d/adapter_gl.c | 4 ++--
dlls/wined3d/directx.c | 17 +++++++++++++++--
dlls/wined3d/wined3d_private.h | 17 +++++++++++++++--
3 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index c8ebe346431..dd357e62510 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -1400,7 +1400,7 @@ cards_nvidia_binary[] =
{"GT 730", CARD_NVIDIA_GEFORCE_GT730}, /* Geforce 700 - lowend */
{"GTX 690", CARD_NVIDIA_GEFORCE_GTX690}, /* Geforce 600 - highend */
{"GTX 680", CARD_NVIDIA_GEFORCE_GTX680}, /* Geforce 600 - highend */
- {"GTX 675MX", CARD_NVIDIA_GEFORCE_GTX675MX}, /* Geforce 600 - highend */
+ {"GTX 675MX", CARD_NVIDIA_GEFORCE_GTX675MX_1},/* Geforce 600 - highend */
{"GTX 670MX", CARD_NVIDIA_GEFORCE_GTX670MX}, /* Geforce 600 - highend */
{"GTX 670", CARD_NVIDIA_GEFORCE_GTX670}, /* Geforce 600 - midend high */
{"GTX 660 Ti", CARD_NVIDIA_GEFORCE_GTX660TI}, /* Geforce 600 - midend high */
@@ -1629,7 +1629,7 @@ cards_intel[] =
/* Haswell */
{"Iris Pro 5200", CARD_INTEL_IP5200_1},
{"Iris 5100", CARD_INTEL_I5100_1},
- {"HD Graphics 5000", CARD_INTEL_HD5000}, /* MacOS */
+ {"HD Graphics 5000", CARD_INTEL_HD5000_1}, /* MacOS */
{"Haswell Mobile", CARD_INTEL_HWM},
{"Iris OpenGL Engine", CARD_INTEL_HWM}, /* MacOS */
/* Ivybridge */
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 72c3de98a95..6043cc1e6f4 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -278,6 +278,7 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT610, "NVIDIA GeForce GT 610", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT630, "NVIDIA GeForce GT 630", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT630M, "NVIDIA GeForce GT 630M", DRIVER_NVIDIA_GEFORCE8, 1024},
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT640, "NVIDIA GeForce GT 640", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT640M, "NVIDIA GeForce GT 640M", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT650M, "NVIDIA GeForce GT 650M", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX650, "NVIDIA GeForce GTX 650", DRIVER_NVIDIA_GEFORCE8, 1024},
@@ -287,7 +288,8 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX660TI, "NVIDIA GeForce GTX 660 Ti", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX670, "NVIDIA GeForce GTX 670", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX670MX, "NVIDIA GeForce GTX 670MX", DRIVER_NVIDIA_GEFORCE8, 3072},
- {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX675MX, "NVIDIA GeForce GTX 675MX", DRIVER_NVIDIA_GEFORCE8, 4096},
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX675MX_1, "NVIDIA GeForce GTX 675MX", DRIVER_NVIDIA_GEFORCE8, 4096},
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX675MX_2, "NVIDIA GeForce GTX 675MX", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX680, "NVIDIA GeForce GTX 680", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX690, "NVIDIA GeForce GTX 690", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT720, "NVIDIA GeForce GT 720", DRIVER_NVIDIA_GEFORCE8, 2048},
@@ -295,6 +297,7 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT730M, "NVIDIA GeForce GT 730M", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT740M, "NVIDIA GeForce GT 740M", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT750M, "NVIDIA GeForce GT 750M", DRIVER_NVIDIA_GEFORCE8, 1024},
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT755M, "NVIDIA GeForce GT 755M", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX750, "NVIDIA GeForce GTX 750", DRIVER_NVIDIA_GEFORCE8, 1024},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX750TI, "NVIDIA GeForce GTX 750 Ti", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX760, "NVIDIA GeForce GTX 760", DRIVER_NVIDIA_GEFORCE8, 2048},
@@ -302,7 +305,9 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX765M, "NVIDIA GeForce GTX 765M", DRIVER_NVIDIA_GEFORCE8, 2048},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX770M, "NVIDIA GeForce GTX 770M", DRIVER_NVIDIA_GEFORCE8, 3072},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX770, "NVIDIA GeForce GTX 770", DRIVER_NVIDIA_GEFORCE8, 2048},
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX775M, "NVIDIA GeForce GTX 775M", DRIVER_NVIDIA_GEFORCE8, 3072},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX780, "NVIDIA GeForce GTX 780", DRIVER_NVIDIA_GEFORCE8, 3072},
+ {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX780M, "NVIDIA GeForce GTX 780M", DRIVER_NVIDIA_GEFORCE8, 4096},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX780TI, "NVIDIA GeForce GTX 780 Ti", DRIVER_NVIDIA_GEFORCE8, 3072},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTXTITAN, "NVIDIA GeForce GTX TITAN", DRIVER_NVIDIA_GEFORCE8, 6144},
{HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTXTITANB, "NVIDIA GeForce GTX TITAN Black", DRIVER_NVIDIA_GEFORCE8, 6144},
@@ -365,6 +370,7 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD6400, "AMD Radeon HD 6400 Series", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD6410D, "AMD Radeon HD 6410D", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD6480G, "AMD Radeon HD 6480G", DRIVER_AMD_R600, 512 },
+ {HW_VENDOR_AMD, CARD_AMD_RADEON_HD6490M, "AMD Radeon HD 6490M", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD6550D, "AMD Radeon HD 6550D", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD6600, "AMD Radeon HD 6600 Series", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD6600M, "AMD Radeon HD 6600M Series", DRIVER_AMD_R600, 512 },
@@ -374,6 +380,7 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD7660D, "AMD Radeon HD 7660D", DRIVER_AMD_R600, 2048},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD7700, "AMD Radeon HD 7700 Series", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD7800, "AMD Radeon HD 7800 Series", DRIVER_AMD_R600, 2048},
+ {HW_VENDOR_AMD, CARD_AMD_RADEON_HD7870, "AMD Radeon HD 7870 Series", DRIVER_AMD_R600, 2048},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD7900, "AMD Radeon HD 7900 Series", DRIVER_AMD_R600, 2048},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD8600M, "AMD Radeon HD 8600M Series", DRIVER_AMD_R600, 1024},
{HW_VENDOR_AMD, CARD_AMD_RADEON_HD8670, "AMD Radeon HD 8670", DRIVER_AMD_R600, 2048},
@@ -382,7 +389,11 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_AMD, CARD_AMD_RADEON_R7, "AMD Radeon(TM) R7 Graphics", DRIVER_AMD_R600, 2048},
{HW_VENDOR_AMD, CARD_AMD_RADEON_R9_285, "AMD Radeon R9 285", DRIVER_AMD_RX, 2048},
{HW_VENDOR_AMD, CARD_AMD_RADEON_R9_290, "AMD Radeon R9 290", DRIVER_AMD_RX, 4096},
+ {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_290X, "AMD Radeon R9 290X", DRIVER_AMD_RX, 4096},
{HW_VENDOR_AMD, CARD_AMD_RADEON_R9_FURY, "AMD Radeon (TM) R9 Fury Series", DRIVER_AMD_RX, 4096},
+ {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_M370X, "AMD Radeon R9 M370X", DRIVER_AMD_RX, 2048},
+ {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_M380, "AMD Radeon R9 M380", DRIVER_AMD_RX, 2048},
+ {HW_VENDOR_AMD, CARD_AMD_RADEON_R9_M395X, "AMD Radeon R9 M395X", DRIVER_AMD_RX, 4096},
{HW_VENDOR_AMD, CARD_AMD_RADEON_RX_460, "Radeon(TM) RX 460 Graphics", DRIVER_AMD_RX, 4096},
{HW_VENDOR_AMD, CARD_AMD_RADEON_RX_480, "Radeon (TM) RX 480 Graphics", DRIVER_AMD_RX, 4096},
{HW_VENDOR_AMD, CARD_AMD_RADEON_RX_VEGA, "Radeon RX Vega", DRIVER_AMD_RX, 8192},
@@ -430,7 +441,8 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_INTEL, CARD_INTEL_IVBS, "Intel(R) HD Graphics Family", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_HWD, "Intel(R) HD Graphics 4600", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_HWM, "Intel(R) HD Graphics 4600", DRIVER_INTEL_HD4000, 1536},
- {HW_VENDOR_INTEL, CARD_INTEL_HD5000, "Intel(R) HD Graphics 5000", DRIVER_INTEL_HD4000, 1536},
+ {HW_VENDOR_INTEL, CARD_INTEL_HD5000_1, "Intel(R) HD Graphics 5000", DRIVER_INTEL_HD4000, 1536},
+ {HW_VENDOR_INTEL, CARD_INTEL_HD5000_2, "Intel(R) HD Graphics 5000", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_I5100_1, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_I5100_2, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_I5100_3, "Intel(R) Iris(TM) Graphics 5100", DRIVER_INTEL_HD4000, 1536},
@@ -440,6 +452,7 @@ static const struct wined3d_gpu_description gpu_description_table[] =
{HW_VENDOR_INTEL, CARD_INTEL_IP5200_3, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_IP5200_4, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
{HW_VENDOR_INTEL, CARD_INTEL_IP5200_5, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 1536},
+ {HW_VENDOR_INTEL, CARD_INTEL_IP5200_6, "Intel(R) Iris(TM) Pro Graphics 5200", DRIVER_INTEL_HD4000, 2048},
{HW_VENDOR_INTEL, CARD_INTEL_HD5300, "Intel(R) HD Graphics 5300", DRIVER_INTEL_HD4000, 2048},
{HW_VENDOR_INTEL, CARD_INTEL_HD5500, "Intel(R) HD Graphics 5500", DRIVER_INTEL_HD4000, 2048},
{HW_VENDOR_INTEL, CARD_INTEL_HD5600, "Intel(R) HD Graphics 5600", DRIVER_INTEL_HD4000, 2048},
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b959a280608..dda93a33453 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2350,6 +2350,7 @@ enum wined3d_pci_device
CARD_AMD_RADEON_HD5900 = 0x689c,
CARD_AMD_RADEON_HD6300 = 0x9803,
CARD_AMD_RADEON_HD6400 = 0x6770,
+ CARD_AMD_RADEON_HD6490M = 0x6760,
CARD_AMD_RADEON_HD6410D = 0x9644,
CARD_AMD_RADEON_HD6480G = 0x9648,
CARD_AMD_RADEON_HD6550D = 0x9640,
@@ -2361,6 +2362,7 @@ enum wined3d_pci_device
CARD_AMD_RADEON_HD7660D = 0x9901,
CARD_AMD_RADEON_HD7700 = 0x683d,
CARD_AMD_RADEON_HD7800 = 0x6819,
+ CARD_AMD_RADEON_HD7870 = 0x6818,
CARD_AMD_RADEON_HD7900 = 0x679a,
CARD_AMD_RADEON_HD8600M = 0x6660,
CARD_AMD_RADEON_HD8670 = 0x6610,
@@ -2369,7 +2371,11 @@ enum wined3d_pci_device
CARD_AMD_RADEON_R7 = 0x130f,
CARD_AMD_RADEON_R9_285 = 0x6939,
CARD_AMD_RADEON_R9_290 = 0x67b1,
+ CARD_AMD_RADEON_R9_290X = 0x67b0,
CARD_AMD_RADEON_R9_FURY = 0x7300,
+ CARD_AMD_RADEON_R9_M370X = 0x6821,
+ CARD_AMD_RADEON_R9_M380 = 0x6647,
+ CARD_AMD_RADEON_R9_M395X = 0x6920,
CARD_AMD_RADEON_RX_460 = 0x67ef,
CARD_AMD_RADEON_RX_480 = 0x67df,
CARD_AMD_RADEON_RX_VEGA = 0x687f,
@@ -2446,6 +2452,7 @@ enum wined3d_pci_device
CARD_NVIDIA_GEFORCE_GT610 = 0x104a,
CARD_NVIDIA_GEFORCE_GT630 = 0x0f00,
CARD_NVIDIA_GEFORCE_GT630M = 0x0de9,
+ CARD_NVIDIA_GEFORCE_GT640 = 0x0fc1,
CARD_NVIDIA_GEFORCE_GT640M = 0x0fd2,
CARD_NVIDIA_GEFORCE_GT650M = 0x0fd1,
CARD_NVIDIA_GEFORCE_GTX650 = 0x0fc6,
@@ -2455,7 +2462,8 @@ enum wined3d_pci_device
CARD_NVIDIA_GEFORCE_GTX660TI = 0x1183,
CARD_NVIDIA_GEFORCE_GTX670 = 0x1189,
CARD_NVIDIA_GEFORCE_GTX670MX = 0x11a1,
- CARD_NVIDIA_GEFORCE_GTX675MX = 0x11a7,
+ CARD_NVIDIA_GEFORCE_GTX675MX_1 = 0x11a7,
+ CARD_NVIDIA_GEFORCE_GTX675MX_2 = 0x11a2,
CARD_NVIDIA_GEFORCE_GTX680 = 0x1180,
CARD_NVIDIA_GEFORCE_GTX690 = 0x1188,
CARD_NVIDIA_GEFORCE_GT720 = 0x128b,
@@ -2463,6 +2471,7 @@ enum wined3d_pci_device
CARD_NVIDIA_GEFORCE_GT730M = 0x0fe1,
CARD_NVIDIA_GEFORCE_GT740M = 0x1292,
CARD_NVIDIA_GEFORCE_GT750M = 0x0fe9,
+ CARD_NVIDIA_GEFORCE_GT755M = 0x0fcd,
CARD_NVIDIA_GEFORCE_GTX750 = 0x1381,
CARD_NVIDIA_GEFORCE_GTX750TI = 0x1380,
CARD_NVIDIA_GEFORCE_GTX760 = 0x1187,
@@ -2470,7 +2479,9 @@ enum wined3d_pci_device
CARD_NVIDIA_GEFORCE_GTX765M = 0x11e2,
CARD_NVIDIA_GEFORCE_GTX770M = 0x11e0,
CARD_NVIDIA_GEFORCE_GTX770 = 0x1184,
+ CARD_NVIDIA_GEFORCE_GTX775M = 0x119d,
CARD_NVIDIA_GEFORCE_GTX780 = 0x1004,
+ CARD_NVIDIA_GEFORCE_GTX780M = 0x119e,
CARD_NVIDIA_GEFORCE_GTX780TI = 0x100a,
CARD_NVIDIA_GEFORCE_GTXTITAN = 0x1005,
CARD_NVIDIA_GEFORCE_GTXTITANB = 0x100c,
@@ -2546,7 +2557,8 @@ enum wined3d_pci_device
CARD_INTEL_IVBS = 0x015a,
CARD_INTEL_HWD = 0x0412,
CARD_INTEL_HWM = 0x0416,
- CARD_INTEL_HD5000 = 0x0a26,
+ CARD_INTEL_HD5000_1 = 0x0a26,
+ CARD_INTEL_HD5000_2 = 0x0422,
CARD_INTEL_I5100_1 = 0x0a22,
CARD_INTEL_I5100_2 = 0x0a2a,
CARD_INTEL_I5100_3 = 0x0a2b,
@@ -2556,6 +2568,7 @@ enum wined3d_pci_device
CARD_INTEL_IP5200_3 = 0x0d2a,
CARD_INTEL_IP5200_4 = 0x0d2b,
CARD_INTEL_IP5200_5 = 0x0d2e,
+ CARD_INTEL_IP5200_6 = 0x0c22,
CARD_INTEL_HD5300 = 0x161e,
CARD_INTEL_HD5500 = 0x1616,
CARD_INTEL_HD5600 = 0x1612,
--
2.11.0
1
0
[PATCH 5/5] wined3d: Pass a wined3d_context structure to wined3d_vertex_pipe_ops.vp_enable().
by Henri Verbeet 29 Jul '19
by Henri Verbeet 29 Jul '19
29 Jul '19
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 6 +++---
dlls/wined3d/glsl_shader.c | 6 +++---
dlls/wined3d/shader.c | 4 ++--
dlls/wined3d/state.c | 6 ++++--
dlls/wined3d/wined3d_private.h | 2 +-
5 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 0628c7cddbb..f91ff871081 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -4659,7 +4659,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
checkGLcall("glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id);");
- priv->vertex_pipe->vp_enable(gl_info, FALSE);
+ priv->vertex_pipe->vp_enable(context, FALSE);
/* Enable OpenGL vertex programs */
gl_info->gl_ops.gl.p_glEnable(GL_VERTEX_PROGRAM_ARB);
@@ -4690,7 +4690,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
}
- priv->vertex_pipe->vp_enable(gl_info, TRUE);
+ priv->vertex_pipe->vp_enable(context, TRUE);
}
}
@@ -4720,7 +4720,7 @@ static void shader_arb_disable(void *shader_priv, struct wined3d_context *contex
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
}
- priv->vertex_pipe->vp_enable(gl_info, FALSE);
+ priv->vertex_pipe->vp_enable(context, FALSE);
if (gl_info->supported[ARB_COLOR_BUFFER_FLOAT] && priv->last_vs_color_unclamp)
{
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 89a34c84ed5..d5003293e6d 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -10553,7 +10553,7 @@ static void shader_glsl_select(void *shader_priv, struct wined3d_context *contex
GLenum current_vertex_color_clamp;
GLuint program_id, prev_id;
- priv->vertex_pipe->vp_enable(gl_info, !use_vs(state));
+ priv->vertex_pipe->vp_enable(context, !use_vs(state));
priv->fragment_pipe->enable_extension(gl_info, !use_ps(state));
prev_id = ctx_data->glsl_program ? ctx_data->glsl_program->id : 0;
@@ -10655,7 +10655,7 @@ static void shader_glsl_disable(void *shader_priv, struct wined3d_context *conte
GL_EXTCALL(glUseProgram(0));
checkGLcall("glUseProgram");
- priv->vertex_pipe->vp_enable(gl_info, FALSE);
+ priv->vertex_pipe->vp_enable(context, FALSE);
priv->fragment_pipe->enable_extension(gl_info, FALSE);
if (needs_legacy_glsl_syntax(gl_info) && gl_info->supported[ARB_COLOR_BUFFER_FLOAT])
@@ -11399,7 +11399,7 @@ const struct wined3d_shader_backend_ops glsl_shader_backend =
shader_glsl_has_ffp_proj_control,
};
-static void glsl_vertex_pipe_vp_enable(const struct wined3d_gl_info *gl_info, BOOL enable) {}
+static void glsl_vertex_pipe_vp_enable(const struct wined3d_context *context, BOOL enable) {}
static void glsl_vertex_pipe_vp_get_caps(const struct wined3d_adapter *adapter, struct wined3d_vertex_caps *caps)
{
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index c23305988b4..e0055f6ff16 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3188,7 +3188,7 @@ static void shader_none_select(void *shader_priv, struct wined3d_context *contex
const struct wined3d_gl_info *gl_info = context->gl_info;
struct shader_none_priv *priv = shader_priv;
- priv->vertex_pipe->vp_enable(gl_info, !use_vs(state));
+ priv->vertex_pipe->vp_enable(context, !use_vs(state));
priv->fragment_pipe->enable_extension(gl_info, !use_ps(state));
}
@@ -3198,7 +3198,7 @@ static void shader_none_disable(void *shader_priv, struct wined3d_context *conte
struct shader_none_priv *priv = shader_priv;
const struct wined3d_gl_info *gl_info = context->gl_info;
- priv->vertex_pipe->vp_enable(gl_info, FALSE);
+ priv->vertex_pipe->vp_enable(context, FALSE);
priv->fragment_pipe->enable_extension(gl_info, FALSE);
context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 06b30ba5e1e..6df20a40d74 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -5187,6 +5187,7 @@ 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)
{
@@ -5225,7 +5226,7 @@ static DWORD vp_ffp_get_emul_mask(const struct wined3d_gl_info *gl_info)
const struct wined3d_vertex_pipe_ops ffp_vertex_pipe =
{
- ffp_enable,
+ ffp_pipe_enable,
vp_ffp_get_caps,
vp_ffp_get_emul_mask,
ffp_alloc,
@@ -5309,6 +5310,7 @@ const struct fragment_pipeline ffp_fragment_pipeline = {
};
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)
{
@@ -5329,7 +5331,7 @@ static DWORD vp_none_get_emul_mask(const struct wined3d_gl_info *gl_info)
const struct wined3d_vertex_pipe_ops none_vertex_pipe =
{
- none_enable,
+ none_pipe_enable,
vp_none_get_caps,
vp_none_get_emul_mask,
none_alloc,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b959a280608..801b467436b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2188,7 +2188,7 @@ struct wined3d_vertex_caps
struct wined3d_vertex_pipe_ops
{
- void (*vp_enable)(const struct wined3d_gl_info *gl_info, BOOL enable);
+ void (*vp_enable)(const struct wined3d_context *context, BOOL enable);
void (*vp_get_caps)(const struct wined3d_adapter *adapter, struct wined3d_vertex_caps *caps);
DWORD (*vp_get_emul_mask)(const struct wined3d_gl_info *gl_info);
void *(*vp_alloc)(const struct wined3d_shader_backend_ops *shader_backend, void *shader_priv);
--
2.11.0
1
0
[PATCH 4/5] wined3d: Pass a wined3d_context_gl structure to arbfp_free_ffpshader().
by Henri Verbeet 29 Jul '19
by Henri Verbeet 29 Jul '19
29 Jul '19
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 15d13a234ba..0628c7cddbb 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -5722,10 +5722,10 @@ static void *arbfp_alloc(const struct wined3d_shader_backend_ops *shader_backend
static void arbfp_free_ffpshader(struct wine_rb_entry *entry, void *param)
{
struct arbfp_ffp_desc *entry_arb = WINE_RB_ENTRY_VALUE(entry, struct arbfp_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(glDeleteProgramsARB(1, &entry_arb->shader));
checkGLcall("delete ffp program");
heap_free(entry_arb);
@@ -5734,9 +5734,10 @@ static void arbfp_free_ffpshader(struct wine_rb_entry *entry, void *param)
/* Context activation is done by the caller. */
static void arbfp_free(struct wined3d_device *device, struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
struct shader_arb_priv *priv = device->fragment_priv;
- wine_rb_destroy(&priv->fragment_shaders, arbfp_free_ffpshader, context);
+ wine_rb_destroy(&priv->fragment_shaders, arbfp_free_ffpshader, context_gl);
priv->use_arbfp_fixed_func = FALSE;
if (device->shader_backend != &arb_program_shader_backend)
--
2.11.0
1
0
[PATCH 3/5] wined3d: Don't acquire a context in wined3d_texture_load_drawable().
by Henri Verbeet 29 Jul '19
by Henri Verbeet 29 Jul '19
29 Jul '19
The one we already have should be fine.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/texture.c | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 6ae822ddf28..19c2f3b6146 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -2547,9 +2547,7 @@ static BOOL wined3d_texture_gl_load_sysmem(struct wined3d_texture_gl *texture_gl
static BOOL wined3d_texture_load_drawable(struct wined3d_texture *texture,
unsigned int sub_resource_idx, struct wined3d_context *context)
{
- struct wined3d_texture *restore_texture;
struct wined3d_device *device;
- unsigned int restore_idx;
unsigned int level;
RECT r;
@@ -2569,13 +2567,6 @@ static BOOL wined3d_texture_load_drawable(struct wined3d_texture *texture,
}
device = texture->resource.device;
- restore_texture = context->current_rt.texture;
- restore_idx = context->current_rt.sub_resource_idx;
- if (restore_texture != texture || restore_idx != sub_resource_idx)
- context = context_acquire(device, texture, sub_resource_idx);
- else
- restore_texture = NULL;
-
level = sub_resource_idx % texture->level_count;
SetRect(&r, 0, 0, wined3d_texture_get_level_width(texture, level),
wined3d_texture_get_level_height(texture, level));
@@ -2585,9 +2576,6 @@ static BOOL wined3d_texture_load_drawable(struct wined3d_texture *texture,
texture, sub_resource_idx, WINED3D_LOCATION_DRAWABLE, &r,
NULL, WINED3D_TEXF_POINT);
- if (restore_texture)
- context_restore(context, restore_texture, restore_idx);
-
return TRUE;
}
--
2.11.0
1
0
[PATCH 2/5] wined3d: Acquire front-buffer contexts when blitting to the drawable in texture2d_blt_fbo().
by Henri Verbeet 29 Jul '19
by Henri Verbeet 29 Jul '19
29 Jul '19
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/surface.c | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 3668c61fa33..7d7dd257f62 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -147,9 +147,9 @@ void texture2d_blt_fbo(struct wined3d_device *device, struct wined3d_context *co
const RECT *dst_rect)
{
struct wined3d_texture *required_texture, *restore_texture;
- unsigned int required_idx, restore_idx;
const struct wined3d_gl_info *gl_info;
struct wined3d_context_gl *context_gl;
+ unsigned int restore_idx;
GLenum gl_filter;
GLenum buffer;
RECT s, d;
@@ -192,26 +192,21 @@ void texture2d_blt_fbo(struct wined3d_device *device, struct wined3d_context *co
else
wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, context, dst_location);
+ /* Acquire a context for the front-buffer, even though we may be blitting
+ * to/from a back-buffer. Since context_acquire() doesn't take the
+ * resource location into account, it may consider the back-buffer to be
+ * offscreen. */
if (src_location == WINED3D_LOCATION_DRAWABLE)
- {
- required_texture = src_texture;
- required_idx = src_sub_resource_idx;
- }
+ required_texture = src_texture->swapchain->front_buffer;
else if (dst_location == WINED3D_LOCATION_DRAWABLE)
- {
- required_texture = dst_texture;
- required_idx = dst_sub_resource_idx;
- }
+ required_texture = dst_texture->swapchain->front_buffer;
else
- {
required_texture = NULL;
- required_idx = 0;
- }
restore_texture = context->current_rt.texture;
restore_idx = context->current_rt.sub_resource_idx;
- if (restore_texture != required_texture || restore_idx != required_idx)
- context = context_acquire(device, required_texture, required_idx);
+ if (restore_texture != required_texture)
+ context = context_acquire(device, required_texture, 0);
else
restore_texture = NULL;
--
2.11.0
1
0