diff --git a/src/config.h b/src/config.h index e3bee223..910c37b2 100644 --- a/src/config.h +++ b/src/config.h @@ -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 diff --git a/src/gp_dx12.c b/src/gp_dx12.c index 965bf97d..29a5515d 100644 --- a/src/gp_dx12.c +++ b/src/gp_dx12.c @@ -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 */ { diff --git a/src/prof_tracy.h b/src/prof_tracy.h index 1e9903b7..5320e40b 100644 --- a/src/prof_tracy.h +++ b/src/prof_tracy.h @@ -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"