diff --git a/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp b/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp index ef862c7c305..7aaedb0409d 100644 --- a/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp @@ -149,7 +149,12 @@ dxcore_get_memory_info(struct d3d12_screen *screen, struct d3d12_memory_info *ou DXCoreAdapterMemoryBudgetNodeSegmentGroup nonlocal_node_segment = { 0, DXCoreSegmentGroup::NonLocal }; dxcore_screen->adapter->QueryState(DXCoreAdapterState::AdapterMemoryBudget, &local_node_segment, &local_info); dxcore_screen->adapter->QueryState(DXCoreAdapterState::AdapterMemoryBudget, &nonlocal_node_segment, &nonlocal_info); + + output->budget_local = local_info.budget; + output->budget_nonlocal = nonlocal_info.budget; output->budget = local_info.budget + nonlocal_info.budget; + output->usage_local = local_info.currentUsage; + output->usage_nonlocal = nonlocal_info.currentUsage; output->usage = local_info.currentUsage + nonlocal_info.currentUsage; } @@ -213,7 +218,8 @@ d3d12_init_dxcore_screen(struct d3d12_screen *dscreen) screen->base.device_id = hardware_ids.deviceID; screen->base.subsys_id = hardware_ids.subSysID; screen->base.revision = hardware_ids.revision; - screen->base.memory_size_megabytes = (dedicated_video_memory + dedicated_system_memory + shared_system_memory) >> 20; + screen->base.memory_device_size_megabytes = dedicated_video_memory >> 20; + screen->base.memory_system_size_megabytes = (dedicated_system_memory + shared_system_memory) >> 20; screen->base.base.get_name = dxcore_get_name; screen->base.get_memory_info = dxcore_get_memory_info; diff --git a/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp b/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp index 8dd3aeeff2f..b29973128aa 100644 --- a/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_dxgi_screen.cpp @@ -120,7 +120,12 @@ dxgi_get_memory_info(struct d3d12_screen *screen, struct d3d12_memory_info *outp DXGI_QUERY_VIDEO_MEMORY_INFO local_info, nonlocal_info; dxgi_screen->adapter->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &local_info); dxgi_screen->adapter->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, &nonlocal_info); + + output->budget_local = local_info.Budget; + output->budget_nonlocal = nonlocal_info.Budget; output->budget = local_info.Budget + nonlocal_info.Budget; + output->usage_local = local_info.CurrentUsage; + output->usage_nonlocal = nonlocal_info.CurrentUsage; output->usage = local_info.CurrentUsage + nonlocal_info.CurrentUsage; } @@ -179,11 +184,12 @@ d3d12_init_dxgi_screen(struct d3d12_screen *dscreen) screen->base.device_id = adapter_desc.DeviceId; screen->base.subsys_id = adapter_desc.SubSysId; screen->base.revision = adapter_desc.Revision; + screen->base.memory_device_size_megabytes = adapter_desc.DedicatedVideoMemory >> 20; // Note: memory sizes in bytes, but stored in size_t, so may be capped at 4GB. // In that case, adding before conversion to MB can easily overflow. - screen->base.memory_size_megabytes = (adapter_desc.DedicatedVideoMemory >> 20) + - (adapter_desc.DedicatedSystemMemory >> 20) + - (adapter_desc.SharedSystemMemory >> 20); + screen->base.memory_system_size_megabytes = + (adapter_desc.DedicatedSystemMemory >> 20) + (adapter_desc.SharedSystemMemory >> 20); + wcsncpy(screen->description, adapter_desc.Description, ARRAY_SIZE(screen->description)); screen->base.base.get_name = dxgi_get_name; screen->base.get_memory_info = dxgi_get_memory_info; diff --git a/src/gallium/drivers/d3d12/d3d12_dxgi_xbox_screen.cpp b/src/gallium/drivers/d3d12/d3d12_dxgi_xbox_screen.cpp index 6e6104962fb..8fa4607d1a3 100644 --- a/src/gallium/drivers/d3d12/d3d12_dxgi_xbox_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_dxgi_xbox_screen.cpp @@ -104,11 +104,11 @@ d3d12_init_dxgi_screen(struct d3d12_screen *dscreen) screen->base.device_id = adapter_desc.DeviceId; screen->base.subsys_id = adapter_desc.SubSysId; screen->base.revision = adapter_desc.Revision; + screen->base.memory_device_size_megabytes = adapter_desc.DedicatedVideoMemory >> 20; // Note: memory sizes in bytes, but stored in size_t, so may be capped at 4GB. // In that case, adding before conversion to MB can easily overflow. - screen->base.memory_size_megabytes = (adapter_desc.DedicatedVideoMemory >> 20) + - (adapter_desc.DedicatedSystemMemory >> 20) + - (adapter_desc.SharedSystemMemory >> 20); + screen->base.memory_system_size_megabytes = + (adapter_desc.DedicatedSystemMemory >> 20) + (adapter_desc.SharedSystemMemory >> 20); wcsncpy(screen->description, adapter_desc.Description, ARRAY_SIZE(screen->description)); screen->base.base.get_name = dxgi_get_name; screen->base.get_memory_info = dxgi_get_memory_info; diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 14b1b0ba71a..4cd33662a12 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -120,7 +120,7 @@ d3d12_get_video_mem(struct pipe_screen *pscreen) { struct d3d12_screen* screen = d3d12_screen(pscreen); - return screen->memory_size_megabytes; + return screen->memory_device_size_megabytes + screen->memory_system_size_megabytes; } static int diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h b/src/gallium/drivers/d3d12/d3d12_screen.h index ed4a9f513fc..cabc64e1469 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.h +++ b/src/gallium/drivers/d3d12/d3d12_screen.h @@ -54,8 +54,12 @@ enum resource_dimension }; struct d3d12_memory_info { - uint64_t usage; - uint64_t budget; + uint64_t usage_local; + uint64_t budget_local; + uint64_t usage_nonlocal; + uint64_t budget_nonlocal; + uint64_t usage; // local + nonlocal + uint64_t budget; // local + nonlocal }; struct d3d12_screen { @@ -133,7 +137,8 @@ struct d3d12_screen { uint32_t subsys_id; uint32_t revision; uint64_t driver_version; - uint64_t memory_size_megabytes; + uint64_t memory_device_size_megabytes; + uint64_t memory_system_size_megabytes; float timestamp_multiplier; bool have_load_at_vertex; bool support_shader_images;