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 */ /* TODO: Move these to user-configurable settings */
#define AUDIO_ENABLED 0 #define AUDIO_ENABLED 0
#define VSYNC_ENABLED 0 #define VSYNC_ENABLED 1
#define USER_FPS_LIMIT 300 #define USER_FPS_LIMIT 300

View File

@ -39,11 +39,9 @@
# pragma comment(lib, "advapi32") # pragma comment(lib, "advapi32")
#endif #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_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_BUFFER_COUNT (2)
#define DX12_SWAPCHAIN_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM) #define DX12_SWAPCHAIN_FORMAT (DXGI_FORMAT_R8G8B8A8_UNORM)
@ -235,6 +233,7 @@ struct swapchain_buffer {
struct swapchain { struct swapchain {
IDXGISwapChain3 *swapchain; IDXGISwapChain3 *swapchain;
HWND hwnd; HWND hwnd;
HANDLE waitable;
struct v2i32 resolution; struct v2i32 resolution;
struct swapchain_buffer buffers[DX12_SWAPCHAIN_BUFFER_COUNT]; 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")); 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 */ /* Disable Alt+Enter changing monitor resolution to match window size */
IDXGIFactory_MakeWindowAssociation(G.factory, hwnd, DXGI_MWA_NO_ALT_ENTER); 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); present_flags |= (DXGI_PRESENT_ALLOW_TEARING * DX12_ALLOW_TEARING);
} }
/* Wait */
if (swapchain->waitable) {
__profn("Present wait");
WaitForSingleObjectEx(swapchain->waitable, 1000, 1);
}
/* Present */ /* Present */
/* FIXME: Resource barrier */ /* FIXME: Resource barrier */
{ {

View File

@ -7,10 +7,10 @@
#if PROFILING #if PROFILING
#define PROFILING_SYSTEM_TRACE 0 #define PROFILING_SYSTEM_TRACE 1
#define PROFILING_CAPTURE_FRAME_IMAGE 0 #define PROFILING_CAPTURE_FRAME_IMAGE 0
#define PROFILING_LOCKS 0 #define PROFILING_LOCKS 0
#define PROFILING_D3D 0 #define PROFILING_D3D 1
#define PROFILING_FILE_WSTR L".tracy" #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"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" //#define PROFILING_CMD_WSTR L"tracy-profiler.exe -a 127.0.0.1"