[PATCH 1/5] wined3d: Implement mode setting in the adapter instead of the device.
Henri Verbeet
hverbeet at codeweavers.com
Fri Jun 22 08:57:27 CDT 2012
---
dlls/ddraw/ddraw.c | 2 +-
dlls/wined3d/device.c | 80 +++-----------------------------------------
dlls/wined3d/directx.c | 72 ++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/swapchain.c | 8 +++--
dlls/wined3d/wined3d.spec | 2 +-
include/wine/wined3d.h | 4 +-
6 files changed, 87 insertions(+), 81 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 6c45737..7b07089 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1076,7 +1076,7 @@ static HRESULT ddraw_set_display_mode(struct ddraw *ddraw, DWORD Width, DWORD He
*/
/* TODO: Lose the primary surface */
- hr = wined3d_device_set_display_mode(ddraw->wined3d_device, 0, &mode);
+ hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &mode);
wined3d_mutex_unlock();
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8aadbbb..54eea3f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1562,79 +1562,6 @@ void CDECL wined3d_device_set_multithreaded(struct wined3d_device *device)
device->create_parms.flags |= WINED3DCREATE_MULTITHREADED;
}
-HRESULT CDECL wined3d_device_set_display_mode(struct wined3d_device *device,
- UINT swapchain_idx, const struct wined3d_display_mode *mode)
-{
- struct wined3d_adapter *adapter = device->adapter;
- const struct wined3d_format *format = wined3d_get_format(&adapter->gl_info, mode->format_id);
- struct wined3d_display_mode current_mode;
- DEVMODEW devmode;
- LONG ret;
- RECT clip_rc;
- HRESULT hr;
-
- TRACE("device %p, swapchain_idx %u, mode %p (%ux%u@%u %s).\n", device, swapchain_idx, mode,
- mode->width, mode->height, mode->refresh_rate, debug_d3dformat(mode->format_id));
-
- /* Resize the screen even without a window:
- * The app could have unset it with SetCooperativeLevel, but not called
- * RestoreDisplayMode first. Then the release will call RestoreDisplayMode,
- * but we don't have any hwnd
- */
-
- memset(&devmode, 0, sizeof(devmode));
- devmode.dmSize = sizeof(devmode);
- devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
- devmode.dmBitsPerPel = format->byte_count * CHAR_BIT;
- devmode.dmPelsWidth = mode->width;
- devmode.dmPelsHeight = mode->height;
-
- devmode.dmDisplayFrequency = mode->refresh_rate;
- if (mode->refresh_rate)
- devmode.dmFields |= DM_DISPLAYFREQUENCY;
-
- /* Only change the mode if necessary */
- if (FAILED(hr = wined3d_device_get_display_mode(device, swapchain_idx, ¤t_mode)))
- {
- ERR("Failed to get current display mode, hr %#x.\n", hr);
- }
- else if (current_mode.width == mode->width
- && current_mode.height == mode->height
- && current_mode.format_id == mode->format_id
- && (current_mode.refresh_rate == mode->refresh_rate
- || !mode->refresh_rate))
- {
- TRACE("Skipping redundant mode setting call.\n");
- return WINED3D_OK;
- }
-
- ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL);
- if (ret != DISP_CHANGE_SUCCESSFUL)
- {
- if (devmode.dmDisplayFrequency)
- {
- WARN("ChangeDisplaySettingsExW failed, trying without the refresh rate\n");
- devmode.dmFields &= ~DM_DISPLAYFREQUENCY;
- devmode.dmDisplayFrequency = 0;
- ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL;
- }
- if(ret != DISP_CHANGE_SUCCESSFUL) {
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Store the new values */
- adapter->screen_size.cx = mode->width;
- adapter->screen_size.cy = mode->height;
- adapter->screen_format = mode->format_id;
-
- /* And finally clip mouse to our screen */
- SetRect(&clip_rc, 0, 0, mode->width, mode->height);
- ClipCursor(&clip_rc);
-
- return WINED3D_OK;
-}
-
HRESULT CDECL wined3d_device_get_wined3d(const struct wined3d_device *device, struct wined3d **wined3d)
{
TRACE("device %p, wined3d %p.\n", device, wined3d);
@@ -5476,7 +5403,12 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
if (!swapchain_desc->windowed != !swapchain->desc.windowed
|| DisplayModeChanged)
{
- wined3d_device_set_display_mode(device, 0, &mode);
+ if (FAILED(hr = wined3d_set_adapter_display_mode(device->wined3d, device->adapter->ordinal, &mode)))
+ {
+ WARN("Failed to set display mode, hr %#x.\n", hr);
+ wined3d_swapchain_decref(swapchain);
+ return hr;
+ }
if (!swapchain_desc->windowed)
{
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index df22efd..8fe3109 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3075,6 +3075,78 @@ HRESULT CDECL wined3d_get_adapter_display_mode(const struct wined3d *wined3d, UI
return WINED3D_OK;
}
+HRESULT CDECL wined3d_set_adapter_display_mode(struct wined3d *wined3d,
+ UINT adapter_idx, const struct wined3d_display_mode *mode)
+{
+ struct wined3d_display_mode current_mode;
+ const struct wined3d_format *format;
+ struct wined3d_adapter *adapter;
+ DEVMODEW devmode;
+ RECT clip_rc;
+ HRESULT hr;
+ LONG ret;
+
+ TRACE("wined3d %p, adapter_idx %u, mode %p (%ux%u@%u %s).\n", wined3d, adapter_idx, mode,
+ mode->width, mode->height, mode->refresh_rate, debug_d3dformat(mode->format_id));
+
+ if (adapter_idx >= wined3d->adapter_count)
+ return WINED3DERR_INVALIDCALL;
+
+ adapter = &wined3d->adapters[adapter_idx];
+ format = wined3d_get_format(&adapter->gl_info, mode->format_id);
+
+ memset(&devmode, 0, sizeof(devmode));
+ devmode.dmSize = sizeof(devmode);
+ devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ devmode.dmBitsPerPel = format->byte_count * CHAR_BIT;
+ devmode.dmPelsWidth = mode->width;
+ devmode.dmPelsHeight = mode->height;
+
+ devmode.dmDisplayFrequency = mode->refresh_rate;
+ if (mode->refresh_rate)
+ devmode.dmFields |= DM_DISPLAYFREQUENCY;
+
+ /* Only change the mode if necessary. */
+ if (FAILED(hr = wined3d_get_adapter_display_mode(wined3d, adapter_idx, ¤t_mode)))
+ {
+ ERR("Failed to get current display mode, hr %#x.\n", hr);
+ }
+ else if (current_mode.width == mode->width
+ && current_mode.height == mode->height
+ && current_mode.format_id == mode->format_id
+ && (current_mode.refresh_rate == mode->refresh_rate
+ || !mode->refresh_rate))
+ {
+ TRACE("Skipping redundant mode setting call.\n");
+ return WINED3D_OK;
+ }
+
+ ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL);
+ if (ret != DISP_CHANGE_SUCCESSFUL)
+ {
+ if (devmode.dmDisplayFrequency)
+ {
+ WARN("ChangeDisplaySettingsExW failed, trying without the refresh rate.\n");
+ devmode.dmFields &= ~DM_DISPLAYFREQUENCY;
+ devmode.dmDisplayFrequency = 0;
+ ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL);
+ }
+ if (ret != DISP_CHANGE_SUCCESSFUL)
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ /* Store the new values. */
+ adapter->screen_size.cx = mode->width;
+ adapter->screen_size.cy = mode->height;
+ adapter->screen_format = mode->format_id;
+
+ /* And finally clip mouse to our screen. */
+ SetRect(&clip_rc, 0, 0, mode->width, mode->height);
+ ClipCursor(&clip_rc);
+
+ return WINED3D_OK;
+}
+
/* NOTE: due to structure differences between dx8 and dx9 D3DADAPTER_IDENTIFIER,
and fields being inserted in the middle, a new structure is used in place */
HRESULT CDECL wined3d_get_adapter_identifier(const struct wined3d *wined3d,
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 6600806..3f93e83 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -31,6 +31,7 @@ WINE_DECLARE_DEBUG_CHANNEL(fps);
static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
{
struct wined3d_display_mode mode;
+ HRESULT hr;
UINT i;
TRACE("Destroying swapchain %p.\n", swapchain);
@@ -79,7 +80,9 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
mode.height = swapchain->orig_height;
mode.refresh_rate = 0;
mode.format_id = swapchain->orig_fmt;
- wined3d_device_set_display_mode(swapchain->device, 0, &mode);
+ if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
+ swapchain->device->adapter->ordinal, &mode)))
+ ERR("Failed to restore display mode, hr %#x.\n", hr);
}
if (swapchain->backup_dc)
@@ -964,8 +967,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, enum wined3d_
mode.format_id = desc->backbuffer_format;
mode.refresh_rate = desc->refresh_rate;
- hr = wined3d_device_set_display_mode(device, 0, &mode);
- if (FAILED(hr))
+ if (FAILED(hr = wined3d_set_adapter_display_mode(device->wined3d, device->adapter->ordinal, &mode)))
{
WARN("Failed to set display mode, hr %#x.\n", hr);
goto err;
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 679754f..9e0cb65 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -17,6 +17,7 @@
@ cdecl wined3d_get_device_caps(ptr long long ptr)
@ cdecl wined3d_incref(ptr)
@ cdecl wined3d_register_software_device(ptr ptr)
+@ cdecl wined3d_set_adapter_display_mode(ptr long ptr)
@ cdecl wined3d_buffer_create(ptr ptr ptr ptr ptr ptr)
@ cdecl wined3d_buffer_create_ib(ptr long long long ptr ptr ptr)
@@ -109,7 +110,6 @@
@ cdecl wined3d_device_set_cursor_properties(ptr long long ptr)
@ cdecl wined3d_device_set_depth_stencil(ptr ptr)
@ cdecl wined3d_device_set_dialog_box_mode(ptr long)
-@ cdecl wined3d_device_set_display_mode(ptr long ptr)
@ cdecl wined3d_device_set_gamma_ramp(ptr long long ptr)
@ cdecl wined3d_device_set_index_buffer(ptr ptr long)
@ cdecl wined3d_device_set_light(ptr long ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index b68d996..47a519d 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2033,6 +2033,8 @@ HRESULT __cdecl wined3d_get_device_caps(const struct wined3d *wined3d, UINT adap
enum wined3d_device_type device_type, WINED3DCAPS *caps);
ULONG __cdecl wined3d_incref(struct wined3d *wined3d);
HRESULT __cdecl wined3d_register_software_device(struct wined3d *wined3d, void *init_function);
+HRESULT __cdecl wined3d_set_adapter_display_mode(struct wined3d *wined3d,
+ UINT adapter_idx, const struct wined3d_display_mode *mode);
HRESULT __cdecl wined3d_buffer_create(struct wined3d_device *device, struct wined3d_buffer_desc *desc,
const void *data, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_buffer **buffer);
@@ -2181,8 +2183,6 @@ HRESULT __cdecl wined3d_device_set_cursor_properties(struct wined3d_device *devi
UINT x_hotspot, UINT y_hotspot, struct wined3d_surface *cursor_surface);
HRESULT __cdecl wined3d_device_set_depth_stencil(struct wined3d_device *device, struct wined3d_surface *depth_stencil);
HRESULT __cdecl wined3d_device_set_dialog_box_mode(struct wined3d_device *device, BOOL enable_dialogs);
-HRESULT __cdecl wined3d_device_set_display_mode(struct wined3d_device *device,
- UINT swapchain_idx, const struct wined3d_display_mode *mode);
void __cdecl wined3d_device_set_gamma_ramp(const struct wined3d_device *device,
UINT swapchain_idx, DWORD flags, const struct wined3d_gamma_ramp *ramp);
HRESULT __cdecl wined3d_device_set_index_buffer(struct wined3d_device *device,
--
1.7.3.4
More information about the wine-patches
mailing list