wait on frame latency object

This commit is contained in:
jacob 2025-07-10 13:55:10 -05:00
parent c548eacd35
commit e3e0a98456
3 changed files with 19 additions and 7 deletions

View File

@ -83,5 +83,5 @@
/* TODO: Move these to user-configurable settings */
#define AUDIO_ENABLED 0
#define VSYNC_ENABLED 0
#define VSYNC_ENABLED 1
#define USER_FPS_LIMIT 300

View File

@ -39,11 +39,9 @@
# pragma comment(lib, "advapi32")
#endif
//#define DX12_WAIT_FRAME_LATENCY 1
//#define DX12_SWAPCHAIN_FLAGS ((DX12_ALLOW_TEARING * DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) | (DX12_WAIT_FRAME_LATENCY * DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT))
#define DX12_ALLOW_TEARING 1
#define DX12_SWAPCHAIN_FLAGS (DX12_ALLOW_TEARING * DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING)
#define DX12_WAIT_FRAME_LATENCY 1
#define DX12_SWAPCHAIN_FLAGS ((DX12_ALLOW_TEARING * DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) | (DX12_WAIT_FRAME_LATENCY * DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT))
#define DX12_SWAPCHAIN_BUFFER_COUNT (2)
#define DX12_SWAPCHAIN_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM)
@ -235,6 +233,7 @@ struct swapchain_buffer {
struct swapchain {
IDXGISwapChain3 *swapchain;
HWND hwnd;
HANDLE waitable;
struct v2i32 resolution;
struct swapchain_buffer buffers[DX12_SWAPCHAIN_BUFFER_COUNT];
};
@ -2635,6 +2634,13 @@ INTERNAL struct swapchain_buffer *update_swapchain(struct swapchain *swapchain,
sys_panic(LIT("Failed to create IDXGISwapChain3"));
}
/* Create waitable object */
#if DX12_WAIT_FRAME_LATENCY
IDXGISwapChain3_SetMaximumFrameLatency(swapchain->swapchain, 1);
swapchain->waitable = IDXGISwapChain2_GetFrameLatencyWaitableObject(swapchain->swapchain);
ASSERT(swapchain->waitable);
#endif
/* Disable Alt+Enter changing monitor resolution to match window size */
IDXGIFactory_MakeWindowAssociation(G.factory, hwnd, DXGI_MWA_NO_ALT_ENTER);
@ -2780,6 +2786,12 @@ void gp_present(struct sys_window *window, struct v2i32 backresolution, struct g
present_flags |= (DXGI_PRESENT_ALLOW_TEARING * DX12_ALLOW_TEARING);
}
/* Wait */
if (swapchain->waitable) {
__profn("Present wait");
WaitForSingleObjectEx(swapchain->waitable, 1000, 1);
}
/* Present */
/* FIXME: Resource barrier */
{

View File

@ -7,10 +7,10 @@
#if PROFILING
#define PROFILING_SYSTEM_TRACE 0
#define PROFILING_SYSTEM_TRACE 1
#define PROFILING_CAPTURE_FRAME_IMAGE 0
#define PROFILING_LOCKS 0
#define PROFILING_D3D 0
#define PROFILING_D3D 1
#define PROFILING_FILE_WSTR L".tracy"
#define PROFILING_CMD_WSTR L"cmd /C start \"\" /wait tracy-capture.exe -o .tracy -a 127.0.0.1 && start \"\" tracy-profiler.exe .tracy"
//#define PROFILING_CMD_WSTR L"tracy-profiler.exe -a 127.0.0.1"