d3d12: Split memory size info to device and system memory

We need to split memory size counters into two to fill pipe_memory_info correctly.
Device local and system values are needed for this.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31853>
This commit is contained in:
George Ouzounoudis 2024-10-25 18:00:21 +03:00 committed by Marge Bot
parent 334b368fc9
commit 60cb0ebc25
5 changed files with 28 additions and 11 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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;