diff --git a/topology.cpp b/topology.cpp index 777dc55949..e1b152cdd3 100644 --- a/topology.cpp +++ b/topology.cpp @@ -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; } diff --git a/wddm/device.cpp b/wddm/device.cpp index 3e4f1df905..6f19bf23e1 100644 --- a/wddm/device.cpp +++ b/wddm/device.cpp @@ -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 &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;