On 28 February 2018 at 12:12, Józef Kucia <jkucia(a)codeweavers.com> wrote:
@@ -105,7 +105,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d8_swapchain_Present(IDirect3DSwapChai
wined3d_mutex_lock(); hr = wined3d_swapchain_present(swapchain->wined3d_swapchain, - src_rect, dst_rect, dst_window_override, 0); + src_rect, dst_rect, dst_window_override, 0, 0); ... @@ -453,6 +454,12 @@ static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) swapchain = op->swapchain; wined3d_swapchain_set_window(swapchain, op->dst_window_override);
+ if (op->swap_interval && swapchain->desc.swap_interval != op->swap_interval) + { + swapchain->desc.swap_interval = op->swap_interval; + swapchain_update_swap_interval(swapchain); + } + swapchain->swapchain_ops->swapchain_present(swapchain, &op->src_rect, &op->dst_rect, op->flags); It seems undesirable to have two conflicting mechanism to set the swap interval. Is there any reason to avoid using the DXGI mechanism for d3d9 and before as well?
@@ -528,11 +528,34 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_Present1(IDXGISwapChain1 *iface, UINT sync_interval, UINT flags, const DXGI_PRESENT_PARAMETERS *present_parameters) { struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain1(iface); + DWORD swap_interval; HRESULT hr;
TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n", iface, sync_interval, flags, present_parameters);
+ switch (sync_interval) + { + case 0: + swap_interval = WINED3DPRESENT_INTERVAL_IMMEDIATE; + break; + case 1: + swap_interval = WINED3DPRESENT_INTERVAL_ONE; + break; + case 2: + swap_interval = WINED3DPRESENT_INTERVAL_TWO; + break; + case 3: + swap_interval = WINED3DPRESENT_INTERVAL_THREE; + break; + case 4: + swap_interval = WINED3DPRESENT_INTERVAL_FOUR; + break; + default: + WARN("Invalid sync interval %u.\n", sync_interval); + return DXGI_ERROR_INVALID_CALL; + } I think it would be better to just pass the DXGI interval to wined3d. Not in the least because we convert it back again in wined3d_swapchain_update_swap_interval_cs().
@@ -94,6 +94,7 @@ struct wined3d_cs_present struct wined3d_swapchain *swapchain; RECT src_rect; RECT dst_rect; + DWORD swap_interval; DWORD flags; }; unsigned int, probably.