wsl/libhsakmt: refactor WDDMDevice creation

Signed-off-by: Flora Cui <flora.cui@amd.com>
Reviewed-by: Tianci Yin <tianci.yin@amd.com>
Part-of: <http://10.67.69.192/wsl/rocr-runtime/-/merge_requests/95>
Šī revīzija ir iekļauta:
Flora Cui
2025-07-25 11:42:16 +08:00
revīziju iesūtīja Frank Min
vecāks e0f40ae8d4
revīzija d520b11006
2 mainīti faili ar 15 papildinājumiem un 29 dzēšanām
+7 -18
Parādīt failu
@@ -362,35 +362,24 @@ HSAKMT_STATUS topology_sysfs_get_system_props(HsaSystemProperties& props) {
std::memset(&props, 0, sizeof(props));
D3DKMT_ADAPTERINFO *adapters;
int num_adapters;
if (wsl::thunk::WDDMGetAdapters(adapters, num_adapters) != STATUS_SUCCESS) {
pr_err("Failed to get adapters\n");
ret = HSAKMT_STATUS_ERROR;
goto err;
}
dxg_topology->num_sysfs_nodes = num_adapters + 1;
dxg_runtime->HeapFini();
for (auto device : dxg_topology->wdevices_)
delete device;
dxg_topology->wdevices_.clear();
for (uint32_t i = 0; i < num_adapters; i++) {
wsl::thunk::WDDMDevice *device = new wsl::thunk::WDDMDevice(
adapters[i].hAdapter, adapters[i].AdapterLuid, i+1);
assert(device && "Create WDDM Device fail");
dxg_topology->wdevices_.push_back(device);
WDDMCreateDevices(dxg_topology->wdevices_);
int num_adapters = dxg_topology->wdevices_.size();
if (num_adapters == 0) {
pr_err("No WDDM adapters found.\n");
return HSAKMT_STATUS_ERROR;
}
dxg_topology->num_sysfs_nodes = num_adapters + 1;
dxg_runtime->HeapInit();
props.NumNodes = dxg_topology->num_sysfs_nodes;
if (dxg_runtime->default_node > num_adapters)
dxg_runtime->default_node = num_adapters;
delete[] adapters;
return ret;
err:
return ret;
}
+8 -11
Parādīt failu
@@ -422,7 +422,7 @@ uint32_t WDDMDevice::LdsBlocks(const hsa_kernel_dispatch_packet_t *pkt) {
return blk_num;
}
NTSTATUS WDDMGetAdapters(D3DKMT_ADAPTERINFO *&adapters, int &num_adapters)
NTSTATUS WDDMCreateDevices(std::vector<WDDMDevice *> &devices)
{
bool supported = false;
D3DKMT_ENUMADAPTERS2 args = {0};
@@ -431,8 +431,6 @@ NTSTATUS WDDMGetAdapters(D3DKMT_ADAPTERINFO *&adapters, int &num_adapters)
return ret;
if (!args.NumAdapters) {
adapters = NULL;
num_adapters = 0;
return STATUS_SUCCESS;
}
@@ -445,11 +443,6 @@ NTSTATUS WDDMGetAdapters(D3DKMT_ADAPTERINFO *&adapters, int &num_adapters)
if (ret != STATUS_SUCCESS)
goto err_out0;
adapters = new D3DKMT_ADAPTERINFO[args.NumAdapters];
if (!adapters)
goto err_out0;
num_adapters = 0;
for (int i = 0; i < args.NumAdapters; i++) {
D3DKMT_QUERY_DEVICE_IDS query = {0};
@@ -464,7 +457,11 @@ NTSTATUS WDDMGetAdapters(D3DKMT_ADAPTERINFO *&adapters, int &num_adapters)
supported = thunk_proxy::QueryAdapterSupported(query.DeviceIds.DeviceID);
if (supported) {
adapters[num_adapters++] = info[i];
auto device = new WDDMDevice(
info[i].hAdapter, info[i].AdapterLuid, devices.size() + 1);
if (!device)
goto err_out1;
devices.push_back(device);
}
}
@@ -472,8 +469,8 @@ NTSTATUS WDDMGetAdapters(D3DKMT_ADAPTERINFO *&adapters, int &num_adapters)
return STATUS_SUCCESS;
err_out1:
delete[] adapters;
adapters = NULL;
for (auto &device : devices)
delete device;
err_out0:
delete[] info;
return ret;