From 11aec42474520355517eca41d3c82f989cd1d60a Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 24 Sep 2025 18:08:09 -0500 Subject: [PATCH] fake swapchain frame latency wait --- src/config.h | 2 +- src/gpu/gpu_dx12/gpu_dx12.c | 9 +++++++-- src/gpu/gpu_dx12/gpu_dx12.h | 2 +- src/meta/meta.c | 1 + src/pp/pp.c | 8 ++++---- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/config.h b/src/config.h index 42c7ace3..0499a2f7 100644 --- a/src/config.h +++ b/src/config.h @@ -96,4 +96,4 @@ #define VSYNC !RtcIsEnabled #define AUDIO_ENABLED 0 -#define FPS_LIMIT 0 +#define FPS_LIMIT 300 diff --git a/src/gpu/gpu_dx12/gpu_dx12.c b/src/gpu/gpu_dx12/gpu_dx12.c index 89e42a53..ba526ea2 100644 --- a/src/gpu/gpu_dx12/gpu_dx12.c +++ b/src/gpu/gpu_dx12/gpu_dx12.c @@ -2112,9 +2112,14 @@ void GPU_ReleaseSwapchain(GPU_Swapchain *swapchain) /* TODO */ } -void GPU_YieldOnSwapchain(GPU_Swapchain *swapchain) +void GPU_YieldOnSwapchain(GPU_Swapchain *gpu_swapchain) { - /* TODO */ + /* TODO: Actually yield, don't block */ + GPU_D12_Swapchain *swapchain = (GPU_D12_Swapchain *)gpu_swapchain; + if (swapchain->waitable) + { + WaitForSingleObjectEx(swapchain->waitable, 1000, 1); + } } i64 GPU_PresentSwapchain(GPU_Swapchain *gpu_swapchain, GPU_Resource *gpu_texture, Vec2I32 backbuffer_size, Vec2I32 dst, i32 vsync) diff --git a/src/gpu/gpu_dx12/gpu_dx12.h b/src/gpu/gpu_dx12/gpu_dx12.h index b083e5bd..80da76c0 100644 --- a/src/gpu/gpu_dx12/gpu_dx12.h +++ b/src/gpu/gpu_dx12/gpu_dx12.h @@ -12,7 +12,7 @@ //~ Tweakable defines #define GPU_D12_TearingIsAllowed 1 -#define GPU_D12_FrameLatency 0 /* TODO: Set this to 1 */ +#define GPU_D12_FrameLatency 1 #define GPU_D12_SwapchainBufferCount 4 #define GPU_D12_SwapchainFlags (((GPU_D12_TearingIsAllowed != 0) * DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) \ | ((GPU_D12_FrameLatency != 0) * DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT)) diff --git a/src/meta/meta.c b/src/meta/meta.c index f27bf08b..2fe8aed1 100644 --- a/src/meta/meta.c +++ b/src/meta/meta.c @@ -922,6 +922,7 @@ JobDef(Build, _, __) PushStringToList(arena, &cp.warnings_msvc, Lit("-wd4101")); /* unreferenced local variable */ PushStringToList(arena, &cp.warnings_msvc, Lit("-wd4189")); /* local variable is initialized but not referenced */ PushStringToList(arena, &cp.warnings_msvc, Lit("-wd4200")); /* nonstandard extension used: zero-sized array in struct/union */ + PushStringToList(arena, &cp.warnings_msvc, Lit("-wd4702")); /* unreachable code */ } //- Clang diff --git a/src/pp/pp.c b/src/pp/pp.c index a639e904..0d3cc505 100644 --- a/src/pp/pp.c +++ b/src/pp/pp.c @@ -2560,10 +2560,6 @@ JobDef(UpdateUserOrSleep, UNUSED sig, UNUSED id) P_Window *window = g->window; { __profn("User sleep"); - { - __profn("Swapchain wait"); - GPU_YieldOnSwapchain(g->swapchain); - } #if FPS_LIMIT > 0 { __profn("Frame limiter wait"); @@ -2571,6 +2567,10 @@ JobDef(UpdateUserOrSleep, UNUSED sig, UNUSED id) time_ns = TimeNs(); } #endif + { + __profn("Swapchain wait"); + GPU_YieldOnSwapchain(g->swapchain); + } } UpdateUser(window); }