Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d8/device.c | 2 +- dlls/d3d9/device.c | 2 +- dlls/wined3d/directx.c | 3 --- include/wine/wined3d.h | 1 - 4 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 5daf6f46c2a6..ddf7a3fc4151 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -294,7 +294,7 @@ void d3dcaps_from_wined3dcaps(D3DCAPS8 *caps, const WINED3DCAPS *wined3d_caps) caps->Caps = wined3d_caps->Caps; caps->Caps2 = wined3d_caps->Caps2; caps->Caps3 = wined3d_caps->Caps3; - caps->PresentationIntervals = wined3d_caps->PresentationIntervals; + caps->PresentationIntervals = D3DPRESENT_INTERVAL_IMMEDIATE | D3DPRESENT_INTERVAL_ONE; caps->CursorCaps = wined3d_caps->CursorCaps; caps->DevCaps = wined3d_caps->DevCaps; caps->PrimitiveMiscCaps = wined3d_caps->PrimitiveMiscCaps; diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index aac0961d559e..f3c24c91c28a 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -330,7 +330,7 @@ void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const WINED3DCAPS *wined3d_caps) caps->Caps = wined3d_caps->Caps; caps->Caps2 = wined3d_caps->Caps2; caps->Caps3 = wined3d_caps->Caps3; - caps->PresentationIntervals = wined3d_caps->PresentationIntervals; + caps->PresentationIntervals = D3DPRESENT_INTERVAL_IMMEDIATE | D3DPRESENT_INTERVAL_ONE; caps->CursorCaps = wined3d_caps->CursorCaps; caps->DevCaps = wined3d_caps->DevCaps; caps->PrimitiveMiscCaps = wined3d_caps->PrimitiveMiscCaps; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 8bda9c4d6d28..cf9723edf9f1 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -5641,9 +5641,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte WINED3DCAPS3_COPY_TO_VIDMEM | WINED3DCAPS3_COPY_TO_SYSTEMMEM;
- caps->PresentationIntervals = WINED3DPRESENT_INTERVAL_IMMEDIATE | - WINED3DPRESENT_INTERVAL_ONE; - caps->CursorCaps = WINED3DCURSORCAPS_COLOR | WINED3DCURSORCAPS_LOWRES;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index b6a2ec38a004..f0c8ae39c5f9 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1863,7 +1863,6 @@ typedef struct _WINED3DCAPS DWORD Caps; DWORD Caps2; DWORD Caps3; - DWORD PresentationIntervals;
DWORD CursorCaps; DWORD DevCaps;
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d8/device.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- dlls/d3d9/device.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- dlls/dxgi/factory.c | 2 +- dlls/wined3d/swapchain.c | 27 +++------------------------ include/wine/wined3d.h | 21 ++++++++++++--------- 5 files changed, 108 insertions(+), 38 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index ddf7a3fc4151..2cc67fe100de 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -208,6 +208,27 @@ static D3DSWAPEFFECT d3dswapeffect_from_wined3dswapeffect(enum wined3d_swap_effe } }
+static DWORD d3dpresentationinterval_from_wined3dswapinterval(enum wined3d_swap_interval interval) +{ + switch (interval) + { + case WINED3D_SWAP_INTERVAL_IMMEDIATE: + return D3DPRESENT_INTERVAL_IMMEDIATE; + case WINED3D_SWAP_INTERVAL_ONE: + return D3DPRESENT_INTERVAL_ONE; + case WINED3D_SWAP_INTERVAL_TWO: + return D3DPRESENT_INTERVAL_TWO; + case WINED3D_SWAP_INTERVAL_THREE: + return D3DPRESENT_INTERVAL_THREE; + case WINED3D_SWAP_INTERVAL_FOUR: + return D3DPRESENT_INTERVAL_FOUR; + default: + ERR("Invalid swap interval %#x.\n", interval); + case WINED3D_SWAP_INTERVAL_DEFAULT: + return D3DPRESENT_INTERVAL_DEFAULT; + } +} + static void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS *present_parameters, const struct wined3d_swapchain_desc *swapchain_desc) { @@ -224,7 +245,8 @@ static void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS = d3dformat_from_wined3dformat(swapchain_desc->auto_depth_stencil_format); present_parameters->Flags = swapchain_desc->flags & D3DPRESENTFLAGS_MASK; present_parameters->FullScreen_RefreshRateInHz = swapchain_desc->refresh_rate; - present_parameters->FullScreen_PresentationInterval = swapchain_desc->swap_interval; + present_parameters->FullScreen_PresentationInterval + = d3dpresentationinterval_from_wined3dswapinterval(swapchain_desc->swap_interval); }
static enum wined3d_swap_effect wined3dswapeffect_from_d3dswapeffect(D3DSWAPEFFECT effect) @@ -245,6 +267,27 @@ static enum wined3d_swap_effect wined3dswapeffect_from_d3dswapeffect(D3DSWAPEFFE } }
+static enum wined3d_swap_interval wined3dswapinterval_from_d3dpresentationinterval(DWORD interval) +{ + switch (interval) + { + case D3DPRESENT_INTERVAL_IMMEDIATE: + return WINED3D_SWAP_INTERVAL_IMMEDIATE; + case D3DPRESENT_INTERVAL_ONE: + return WINED3D_SWAP_INTERVAL_ONE; + case D3DPRESENT_INTERVAL_TWO: + return WINED3D_SWAP_INTERVAL_TWO; + case D3DPRESENT_INTERVAL_THREE: + return WINED3D_SWAP_INTERVAL_THREE; + case D3DPRESENT_INTERVAL_FOUR: + return WINED3D_SWAP_INTERVAL_FOUR; + default: + FIXME("Unhandled presentation interval %#x.\n", interval); + case D3DPRESENT_INTERVAL_DEFAULT: + return WINED3D_SWAP_INTERVAL_DEFAULT; + } +} + static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapchain_desc *swapchain_desc, const D3DPRESENT_PARAMETERS *present_parameters) { @@ -278,7 +321,8 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch swapchain_desc->flags = (present_parameters->Flags & D3DPRESENTFLAGS_MASK) | WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH; swapchain_desc->refresh_rate = present_parameters->FullScreen_RefreshRateInHz; - swapchain_desc->swap_interval = present_parameters->FullScreen_PresentationInterval; + swapchain_desc->swap_interval + = wined3dswapinterval_from_d3dpresentationinterval(present_parameters->FullScreen_PresentationInterval); swapchain_desc->auto_restore_display_mode = TRUE;
if (present_parameters->Flags & ~D3DPRESENTFLAGS_MASK) diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index f3c24c91c28a..28c96c420894 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -230,6 +230,27 @@ static D3DSWAPEFFECT d3dswapeffect_from_wined3dswapeffect(enum wined3d_swap_effe } }
+static DWORD d3dpresentationinterval_from_wined3dswapinterval(enum wined3d_swap_interval interval) +{ + switch (interval) + { + case WINED3D_SWAP_INTERVAL_IMMEDIATE: + return D3DPRESENT_INTERVAL_IMMEDIATE; + case WINED3D_SWAP_INTERVAL_ONE: + return D3DPRESENT_INTERVAL_ONE; + case WINED3D_SWAP_INTERVAL_TWO: + return D3DPRESENT_INTERVAL_TWO; + case WINED3D_SWAP_INTERVAL_THREE: + return D3DPRESENT_INTERVAL_THREE; + case WINED3D_SWAP_INTERVAL_FOUR: + return D3DPRESENT_INTERVAL_FOUR; + default: + ERR("Invalid swap interval %#x.\n", interval); + case WINED3D_SWAP_INTERVAL_DEFAULT: + return D3DPRESENT_INTERVAL_DEFAULT; + } +} + void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS *present_parameters, const struct wined3d_swapchain_desc *swapchain_desc) { @@ -247,7 +268,8 @@ void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS *prese = d3dformat_from_wined3dformat(swapchain_desc->auto_depth_stencil_format); present_parameters->Flags = swapchain_desc->flags & D3DPRESENTFLAGS_MASK; present_parameters->FullScreen_RefreshRateInHz = swapchain_desc->refresh_rate; - present_parameters->PresentationInterval = swapchain_desc->swap_interval; + present_parameters->PresentationInterval + = d3dpresentationinterval_from_wined3dswapinterval(swapchain_desc->swap_interval); }
static enum wined3d_swap_effect wined3dswapeffect_from_d3dswapeffect(D3DSWAPEFFECT effect) @@ -270,6 +292,27 @@ static enum wined3d_swap_effect wined3dswapeffect_from_d3dswapeffect(D3DSWAPEFFE } }
+static enum wined3d_swap_interval wined3dswapinterval_from_d3dpresentationinterval(DWORD interval) +{ + switch (interval) + { + case D3DPRESENT_INTERVAL_IMMEDIATE: + return WINED3D_SWAP_INTERVAL_IMMEDIATE; + case D3DPRESENT_INTERVAL_ONE: + return WINED3D_SWAP_INTERVAL_ONE; + case D3DPRESENT_INTERVAL_TWO: + return WINED3D_SWAP_INTERVAL_TWO; + case D3DPRESENT_INTERVAL_THREE: + return WINED3D_SWAP_INTERVAL_THREE; + case D3DPRESENT_INTERVAL_FOUR: + return WINED3D_SWAP_INTERVAL_FOUR; + default: + FIXME("Unhandled presentation interval %#x.\n", interval); + case D3DPRESENT_INTERVAL_DEFAULT: + return WINED3D_SWAP_INTERVAL_DEFAULT; + } +} + static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapchain_desc *swapchain_desc, const D3DPRESENT_PARAMETERS *present_parameters, BOOL extended) { @@ -305,7 +348,8 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch swapchain_desc->flags = (present_parameters->Flags & D3DPRESENTFLAGS_MASK) | WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH; swapchain_desc->refresh_rate = present_parameters->FullScreen_RefreshRateInHz; - swapchain_desc->swap_interval = present_parameters->PresentationInterval; + swapchain_desc->swap_interval + = wined3dswapinterval_from_d3dpresentationinterval(present_parameters->PresentationInterval); swapchain_desc->auto_restore_display_mode = TRUE;
if (present_parameters->Flags & ~D3DPRESENTFLAGS_MASK) diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c index 7fc32791ab57..bbef76867a37 100644 --- a/dlls/dxgi/factory.c +++ b/dlls/dxgi/factory.c @@ -333,7 +333,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChainForHwnd(IWineDXGIFa wined3d_desc.auto_depth_stencil_format = 0; wined3d_desc.flags = wined3d_swapchain_flags_from_dxgi(swapchain_desc->Flags); wined3d_desc.refresh_rate = fullscreen_desc ? dxgi_rational_to_uint(&fullscreen_desc->RefreshRate) : 0; - wined3d_desc.swap_interval = WINED3DPRESENT_INTERVAL_DEFAULT; + wined3d_desc.swap_interval = WINED3D_SWAP_INTERVAL_DEFAULT; wined3d_desc.auto_restore_display_mode = TRUE;
hr = IWineDXGIDevice_create_swapchain(dxgi_device, &wined3d_desc, FALSE, &wined3d_swapchain); diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 0d76b671717e..f848044f1194 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -683,34 +683,13 @@ static void wined3d_swapchain_update_swap_interval_cs(void *object) context = context_acquire(swapchain->device, swapchain->front_buffer, 0); gl_info = context->gl_info;
- switch (swapchain->desc.swap_interval) - { - case WINED3DPRESENT_INTERVAL_IMMEDIATE: - swap_interval = 0; - break; - case WINED3DPRESENT_INTERVAL_DEFAULT: - case WINED3DPRESENT_INTERVAL_ONE: - swap_interval = 1; - break; - case WINED3DPRESENT_INTERVAL_TWO: - swap_interval = 2; - break; - case WINED3DPRESENT_INTERVAL_THREE: - swap_interval = 3; - break; - case WINED3DPRESENT_INTERVAL_FOUR: - swap_interval = 4; - break; - default: - FIXME("Unhandled present interval %#x.\n", swapchain->desc.swap_interval); - swap_interval = 1; - } + swap_interval = swapchain->desc.swap_interval > 4 ? 1 : swapchain->desc.swap_interval;
if (gl_info->supported[WGL_EXT_SWAP_CONTROL]) { if (!GL_EXTCALL(wglSwapIntervalEXT(swap_interval))) - ERR("wglSwapIntervalEXT failed to set swap interval %d for context %p, last error %#x\n", - swap_interval, context, GetLastError()); + ERR("wglSwapIntervalEXT failed to set swap interval %d for context %p, last error %#x.\n", + swap_interval, context, GetLastError()); }
context_release(context); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index f0c8ae39c5f9..2b4f27438c8d 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -515,6 +515,16 @@ enum wined3d_swap_effect WINED3D_SWAP_EFFECT_OVERLAY, };
+enum wined3d_swap_interval +{ + WINED3D_SWAP_INTERVAL_IMMEDIATE = 0, + WINED3D_SWAP_INTERVAL_ONE = 1, + WINED3D_SWAP_INTERVAL_TWO = 2, + WINED3D_SWAP_INTERVAL_THREE = 3, + WINED3D_SWAP_INTERVAL_FOUR = 4, + WINED3D_SWAP_INTERVAL_DEFAULT = ~0u, +}; + enum wined3d_sampler_state { WINED3D_SAMP_ADDRESS_U = 1, @@ -574,7 +584,7 @@ enum wined3d_texture_stage_state WINED3D_TSS_ALPHA_ARG0 = 15, WINED3D_TSS_RESULT_ARG = 16, WINED3D_TSS_CONSTANT = 17, - WINED3D_TSS_INVALID = ~0U, + WINED3D_TSS_INVALID = ~0u, }; #define WINED3D_HIGHEST_TEXTURE_STATE WINED3D_TSS_CONSTANT
@@ -923,13 +933,6 @@ enum wined3d_shader_byte_code_format
#define WINED3DPRESENT_RATE_DEFAULT 0x00000000
-#define WINED3DPRESENT_INTERVAL_DEFAULT 0x00000000 -#define WINED3DPRESENT_INTERVAL_ONE 0x00000001 -#define WINED3DPRESENT_INTERVAL_TWO 0x00000002 -#define WINED3DPRESENT_INTERVAL_THREE 0x00000004 -#define WINED3DPRESENT_INTERVAL_FOUR 0x00000008 -#define WINED3DPRESENT_INTERVAL_IMMEDIATE 0x80000000 - #define WINED3DCLIPPLANE0 (1u << 0) #define WINED3DCLIPPLANE1 (1u << 1) #define WINED3DCLIPPLANE2 (1u << 2) @@ -1724,7 +1727,7 @@ struct wined3d_swapchain_desc enum wined3d_format_id auto_depth_stencil_format; DWORD flags; UINT refresh_rate; - UINT swap_interval; + enum wined3d_swap_interval swap_interval; BOOL auto_restore_display_mode; };
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d8/device.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 2cc67fe100de..f53b97d3294a 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -304,6 +304,20 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch WARN("Invalid backbuffer count %u.\n", present_parameters->BackBufferCount); return FALSE; } + switch (present_parameters->FullScreen_PresentationInterval) + { + case D3DPRESENT_INTERVAL_DEFAULT: + case D3DPRESENT_INTERVAL_ONE: + case D3DPRESENT_INTERVAL_TWO: + case D3DPRESENT_INTERVAL_THREE: + case D3DPRESENT_INTERVAL_FOUR: + case D3DPRESENT_INTERVAL_IMMEDIATE: + break; + default: + WARN("Invalid presentation interval %#x.\n", + present_parameters->FullScreen_PresentationInterval); + return FALSE; + }
swapchain_desc->backbuffer_width = present_parameters->BackBufferWidth; swapchain_desc->backbuffer_height = present_parameters->BackBufferHeight;
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d9/device.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 28c96c420894..8c74494638c6 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -331,6 +331,19 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch WARN("Invalid backbuffer count %u.\n", present_parameters->BackBufferCount); return FALSE; } + switch (present_parameters->PresentationInterval) + { + case D3DPRESENT_INTERVAL_DEFAULT: + case D3DPRESENT_INTERVAL_ONE: + case D3DPRESENT_INTERVAL_TWO: + case D3DPRESENT_INTERVAL_THREE: + case D3DPRESENT_INTERVAL_FOUR: + case D3DPRESENT_INTERVAL_IMMEDIATE: + break; + default: + WARN("Invalid presentation interval %#x.\n", present_parameters->PresentationInterval); + return FALSE; + }
swapchain_desc->backbuffer_width = present_parameters->BackBufferWidth; swapchain_desc->backbuffer_height = present_parameters->BackBufferHeight;
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d8/tests/device.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 6ae17829b818..851de3fac30c 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -7865,11 +7865,12 @@ static void test_resource_priority(void)
static void test_swapchain_parameters(void) { + IDirect3DSurface8 *backbuffer; IDirect3DDevice8 *device; + HRESULT hr, expected_hr; IDirect3D8 *d3d; - IDirect3DSurface8 *backbuffer; + D3DCAPS8 caps; HWND window; - HRESULT hr; unsigned int i, j; D3DPRESENT_PARAMETERS present_parameters, present_parameters_windowed = {0}; static const struct @@ -7933,6 +7934,8 @@ static void test_swapchain_parameters(void) DestroyWindow(window); return; } + hr = IDirect3DDevice8_GetDeviceCaps(device, &caps); + ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr); IDirect3DDevice8_Release(device);
present_parameters_windowed.BackBufferWidth = registry_mode.dmPelsWidth; @@ -8012,6 +8015,42 @@ static void test_swapchain_parameters(void) IDirect3DDevice8_Release(device); }
+ for (i = 0; i < 10; ++i) + { + memset(&present_parameters, 0, sizeof(present_parameters)); + present_parameters.BackBufferWidth = registry_mode.dmPelsWidth; + present_parameters.BackBufferHeight = registry_mode.dmPelsHeight; + present_parameters.hDeviceWindow = window; + present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8; + present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; + present_parameters.Windowed = FALSE; + present_parameters.BackBufferCount = 2; + + present_parameters.FullScreen_PresentationInterval = i; + switch (present_parameters.FullScreen_PresentationInterval) + { + case D3DPRESENT_INTERVAL_ONE: + case D3DPRESENT_INTERVAL_TWO: + case D3DPRESENT_INTERVAL_THREE: + case D3DPRESENT_INTERVAL_FOUR: + if (!(caps.PresentationIntervals & present_parameters.FullScreen_PresentationInterval)) + continue; + /* Fall through */ + case D3DPRESENT_INTERVAL_DEFAULT: + expected_hr = D3D_OK; + break; + default: + expected_hr = D3DERR_INVALIDCALL; + break; + } + + hr = IDirect3D8_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device); + ok(hr == expected_hr, "Got unexpected hr %#x, test %u.\n", hr, i); + if (SUCCEEDED(hr)) + IDirect3DDevice8_Release(device); + } + IDirect3D8_Release(d3d); DestroyWindow(window); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d9/tests/device.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 9fa6a7ebec52..547e0d07e21a 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -11424,9 +11424,10 @@ static void test_resource_priority(void) static void test_swapchain_parameters(void) { IDirect3DDevice9 *device; + HRESULT hr, expected_hr; IDirect3D9 *d3d; + D3DCAPS9 caps; HWND window; - HRESULT hr; unsigned int i; D3DPRESENT_PARAMETERS present_parameters, present_parameters_windowed = {0}, present_parameters2; IDirect3DSwapChain9 *swapchain; @@ -11490,6 +11491,9 @@ static void test_swapchain_parameters(void) DestroyWindow(window); return; } + memset(&caps, 0, sizeof(caps)); + hr = IDirect3DDevice9_GetDeviceCaps(device, &caps); + ok(hr == D3D_OK, "Failed to get device caps, hr %#x.\n", hr); IDirect3DDevice9_Release(device);
present_parameters_windowed.BackBufferWidth = registry_mode.dmPelsWidth; @@ -11560,6 +11564,54 @@ static void test_swapchain_parameters(void) IDirect3DDevice9_Release(device); }
+ for (i = 0; i < 10; ++i) + { + memset(&present_parameters, 0, sizeof(present_parameters)); + present_parameters.BackBufferWidth = registry_mode.dmPelsWidth; + present_parameters.BackBufferHeight = registry_mode.dmPelsHeight; + present_parameters.hDeviceWindow = window; + present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8; + present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD; + present_parameters.Windowed = FALSE; + present_parameters.BackBufferCount = 2; + + present_parameters.PresentationInterval = i; + switch (present_parameters.PresentationInterval) + { + case D3DPRESENT_INTERVAL_ONE: + case D3DPRESENT_INTERVAL_TWO: + case D3DPRESENT_INTERVAL_THREE: + case D3DPRESENT_INTERVAL_FOUR: + if (!(caps.PresentationIntervals & present_parameters.PresentationInterval)) + continue; + /* Fall through */ + case D3DPRESENT_INTERVAL_DEFAULT: + expected_hr = D3D_OK; + break; + default: + expected_hr = D3DERR_INVALIDCALL; + break; + } + + hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device); + ok(hr == expected_hr, "Got unexpected hr %#x, test %u.\n", hr, i); + if (FAILED(hr)) + continue; + + hr = IDirect3DDevice9_GetSwapChain(device, 0, &swapchain); + ok(SUCCEEDED(hr), "Failed to get swapchain, hr %#x, test %u.\n", hr, i); + + hr = IDirect3DSwapChain9_GetPresentParameters(swapchain, &present_parameters2); + ok(SUCCEEDED(hr), "Failed to get present parameters, hr %#x, test %u.\n", hr, i); + ok(present_parameters2.PresentationInterval == i, + "Got presentation interval %#x, expected %#x.\n", + present_parameters2.PresentationInterval, i); + + IDirect3DSwapChain9_Release(swapchain); + IDirect3DDevice9_Release(device); + } + IDirect3D9_Release(d3d); DestroyWindow(window); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com