From a7beb9974e97ccebbb5309b4ff7caa584531b392 Mon Sep 17 00:00:00 2001 From: Caleb Cornett Date: Tue, 23 May 2023 21:11:43 -0400 Subject: [PATCH] d3d12: Fix Xbox frame scheduling for interval != 1 Part-of: --- .../winsys/d3d12/wgl/d3d12_wgl_framebuffer_xbox.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer_xbox.cpp b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer_xbox.cpp index 753e8fb2b42..289fbe22e6c 100644 --- a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer_xbox.cpp +++ b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer_xbox.cpp @@ -178,14 +178,21 @@ d3d12_wgl_framebuffer_present(stw_winsys_framebuffer *fb, int interval) D3D12XBOX_PRESENT_FLAG_IMMEDIATE : D3D12XBOX_PRESENT_FLAG_NONE; - if (cached_interval != interval) { + int clamped_interval = CLAMP(interval, 1, 4); // SetFrameIntervalX only supports values [1,4] + if (cached_interval != clamped_interval) { framebuffer->screen->dev->SetFrameIntervalX( nullptr, D3D12XBOX_FRAME_INTERVAL_60_HZ, - interval, + clamped_interval, D3D12XBOX_FRAME_INTERVAL_FLAG_NONE ); - cached_interval = interval; + framebuffer->screen->dev->ScheduleFrameEventX( + D3D12XBOX_FRAME_EVENT_ORIGIN, + 0, + nullptr, + D3D12XBOX_SCHEDULE_FRAME_EVENT_FLAG_NONE + ); + cached_interval = clamped_interval; } framebuffer->screen->cmdqueue->PresentX(1, &planeParams, &presentParams);