From 054fe159f51e35104791fa09856deedb926c0736 Mon Sep 17 00:00:00 2001 From: jacob Date: Mon, 27 Oct 2025 01:30:51 -0500 Subject: [PATCH] keep backbuffer at monitor size --- src/gpu/gpu_core.h | 13 +++++---- src/gpu/gpu_dx12/gpu_dx12.c | 40 +++++++++++++++++++++----- src/gpu/gpu_dx12/gpu_dx12.h | 2 +- src/pp/pp.c | 9 +++--- src/window/window.h | 1 + src/window/window_win32/window_win32.c | 1 + 6 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/gpu/gpu_core.h b/src/gpu/gpu_core.h index ee6fc609..18e18a5c 100644 --- a/src/gpu/gpu_core.h +++ b/src/gpu/gpu_core.h @@ -351,10 +351,12 @@ Struct(GPU_Scissor) //////////////////////////////////////////////////////////// //~ Memory info types -Struct(GPU_MemoryInfo) +Struct(GPU_MemoryStats) { - u64 local_used; - u64 non_local_used; + u64 budget; + u64 committed; + u64 reserved; + u64 available_to_reserve; }; //////////////////////////////////////////////////////////// @@ -468,10 +470,11 @@ void GPU_CopyBytesToFootprint(void *dst, void *src, GPU_Resource *footprint_refe //////////////////////////////////////////////////////////// //~ @hookdecl Memory info operations -GPU_MemoryInfo GPU_QueryMemoryInfo(void); +GPU_MemoryStats GPU_QueryDedicatedMemoryStats(void); +GPU_MemoryStats GPU_QuerySharedMemoryStats(void); //////////////////////////////////////////////////////////// -//~ @hookdecl Swapchain operations +//~ @hookdecl Swapchain available_to_reserve GPU_Swapchain *GPU_AcquireSwapchain(WND_Handle window, GPU_Format format, Vec2I32 size); void GPU_ReleaseSwapchain(GPU_Swapchain *swapchain); diff --git a/src/gpu/gpu_dx12/gpu_dx12.c b/src/gpu/gpu_dx12/gpu_dx12.c index f872b612..dec530d8 100644 --- a/src/gpu/gpu_dx12/gpu_dx12.c +++ b/src/gpu/gpu_dx12/gpu_dx12.c @@ -169,7 +169,7 @@ void GPU_D12_InitDevice(void) /* Create device */ { __profn("Create device"); - IDXGIAdapter1 *adapter = 0; + IDXGIAdapter3 *adapter = 0; ID3D12Device *device = 0; String error = Lit("Could not initialize GPU device."); String first_gpu_name = ZI; @@ -178,12 +178,12 @@ void GPU_D12_InitDevice(void) for (;;) { { - hr = IDXGIFactory6_EnumAdapterByGpuPreference(g->factory, adapter_index, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, &IID_IDXGIAdapter1, (void **)&adapter); + hr = IDXGIFactory6_EnumAdapterByGpuPreference(g->factory, adapter_index, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, &IID_IDXGIAdapter3, (void **)&adapter); } if (SUCCEEDED(hr)) { DXGI_ADAPTER_DESC1 desc; - IDXGIAdapter1_GetDesc1(adapter, &desc); + IDXGIAdapter3_GetDesc1(adapter, &desc); if (first_gpu_name.len == 0) { first_gpu_name = StringFromWstrNoLimit(scratch.arena, desc.Description); @@ -197,7 +197,7 @@ void GPU_D12_InitDevice(void) } skip = 0; ID3D12Device_Release(device); - IDXGIAdapter1_Release(adapter); + IDXGIAdapter3_Release(adapter); adapter = 0; device = 0; ++adapter_index; @@ -1810,10 +1810,36 @@ void GPU_CopyBytesToFootprint(void *dst, void *src, GPU_Resource *footprint_refe //////////////////////////////////////////////////////////// //~ @hookdef Memory info hooks -GPU_MemoryInfo GPU_QueryMemoryInfo(void) +GPU_MemoryStats GPU_QueryDedicatedMemoryStats(void) { - /* TODO */ - return (GPU_MemoryInfo) ZI; + GPU_D12_SharedState *g = &GPU_D12_shared_state; + GPU_MemoryStats result = ZI; + { + DXGI_QUERY_VIDEO_MEMORY_INFO info = ZI; + IDXGIAdapter3_QueryVideoMemoryInfo(g->adapter, 0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &info); + result.budget = info.Budget; + result.committed = info.CurrentUsage; + result.reserved = info.CurrentReservation; + result.available_to_reserve = info.AvailableForReservation; + + } + return result; +} + +GPU_MemoryStats GPU_QuerySharedMemoryStats(void) +{ + GPU_D12_SharedState *g = &GPU_D12_shared_state; + GPU_MemoryStats result = ZI; + { + DXGI_QUERY_VIDEO_MEMORY_INFO info = ZI; + IDXGIAdapter3_QueryVideoMemoryInfo(g->adapter, 0, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, &info); + result.budget = info.Budget; + result.committed = info.CurrentUsage; + result.reserved = info.CurrentReservation; + result.available_to_reserve = info.AvailableForReservation; + + } + return result; } //////////////////////////////////////////////////////////// diff --git a/src/gpu/gpu_dx12/gpu_dx12.h b/src/gpu/gpu_dx12/gpu_dx12.h index 2a45097d..e9ce2e23 100644 --- a/src/gpu/gpu_dx12/gpu_dx12.h +++ b/src/gpu/gpu_dx12/gpu_dx12.h @@ -313,7 +313,7 @@ Struct(GPU_D12_SharedState) /* Device */ IDXGIFactory6 *factory; - IDXGIAdapter1 *adapter; + IDXGIAdapter3 *adapter; ID3D12Device *device; } extern GPU_D12_shared_state; diff --git a/src/pp/pp.c b/src/pp/pp.c index db1b369c..9abaae89 100644 --- a/src/pp/pp.c +++ b/src/pp/pp.c @@ -2057,7 +2057,8 @@ void UpdateUser(void) //- Query vram - GPU_MemoryInfo vram = GPU_QueryMemoryInfo(); + GPU_MemoryStats vram_dedi = GPU_QueryDedicatedMemoryStats(); + GPU_MemoryStats vram_shared = GPU_QuerySharedMemoryStats(); ////////////////////////////// //- Debug draw @@ -2124,8 +2125,8 @@ void UpdateUser(void) UI_BuildLabelF("Arenas allocated: %F", FmtUint(GetGstat(GSTAT_NUM_ARENAS))); UI_BuildSpacer(UI_PixelSize(20, 0)); - UI_BuildLabelF("Video memory (GPU): %F MiB", FmtFloat((f64)vram.local_used / 1024 / 1024)); - UI_BuildLabelF("Video memory (shared): %F MiB", FmtFloat((f64)vram.non_local_used / 1024 / 1024)); + UI_BuildLabelF("Video memory (GPU): %F MiB", FmtFloat((f64)vram_dedi.committed / 1024 / 1024)); + UI_BuildLabelF("Video memory (shared): %F MiB", FmtFloat((f64)vram_shared.committed / 1024 / 1024)); //UI_BuildLabelF(\n")); //UI_BuildLabelF(\n")); @@ -2388,7 +2389,7 @@ void UpdateUser(void) } Vec2 backbuffer_dst_f = MulXformV2(g->ui_to_screen_xf, VEC2(0, 0)); Vec2I32 backbuffer_dst = VEC2I32(RoundF32ToI32(backbuffer_dst_f.x), RoundF32ToI32(backbuffer_dst_f.y)); - g->gpu_submit_fence_target = GPU_PresentSwapchain(g->swapchain, g->ui_target, g->screen_size, backbuffer_dst, VSYNC); + g->gpu_submit_fence_target = GPU_PresentSwapchain(g->swapchain, g->ui_target, window_frame.monitor_size, backbuffer_dst, VSYNC); } WND_EndFrame(window_frame); diff --git a/src/window/window.h b/src/window/window.h index a6534a63..ab20f85e 100644 --- a/src/window/window.h +++ b/src/window/window.h @@ -39,6 +39,7 @@ Struct(WND_Frame) /* Window info */ Vec2I32 draw_size; + Vec2I32 monitor_size; String restore; b32 minimized; b32 maximized; diff --git a/src/window/window_win32/window_win32.c b/src/window/window_win32/window_win32.c index d39d114d..e1464b9e 100644 --- a/src/window/window_win32/window_win32.c +++ b/src/window/window_win32/window_win32.c @@ -444,6 +444,7 @@ WND_Frame WND_BeginFrame(Arena *arena) GetMonitorInfo(MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info); monitor_rect = monitor_info.rcMonitor; } + result.monitor_size = VEC2I32(monitor_rect.right - monitor_rect.left, monitor_rect.bottom - monitor_rect.top); /* Client rect */ RECT client_rect = ZI;