/* * Copyright (C) 2019 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "runtime/device/root_device.h" #include "runtime/device/sub_device.h" #include "runtime/helpers/device_helpers.h" #include "runtime/os_interface/debug_settings_manager.h" namespace NEO { RootDevice::RootDevice(ExecutionEnvironment *executionEnvironment, uint32_t rootDeviceIndex) : Device(executionEnvironment), rootDeviceIndex(rootDeviceIndex) {} RootDevice::~RootDevice() = default; uint32_t RootDevice::getNumSubDevices() const { return static_cast(subdevices.size()); } uint32_t RootDevice::getRootDeviceIndex() const { return rootDeviceIndex; } uint32_t RootDevice::getNumAvailableDevices() const { if (subdevices.empty()) { return 1u; } return getNumSubDevices(); } Device *RootDevice::getDeviceById(uint32_t deviceId) const { UNRECOVERABLE_IF(deviceId >= getNumAvailableDevices()); if (subdevices.empty()) { return const_cast(this); } return subdevices[deviceId].get(); }; SubDevice *RootDevice::createSubDevice(uint32_t subDeviceIndex) { return Device::create(executionEnvironment, subDeviceIndex, *this); } bool RootDevice::createDeviceImpl() { auto numSubDevices = DeviceHelper::getSubDevicesCount(&getHardwareInfo()); if (numSubDevices == 1) { numSubDevices = 0; } subdevices.resize(numSubDevices); for (auto i = 0u; i < numSubDevices; i++) { auto subDevice = createSubDevice(i); if (!subDevice) { return false; } subdevices[i].reset(subDevice); } auto status = Device::createDeviceImpl(); if (!status) { return status; } return true; } /* We hide the retain and release function of BaseObject. */ void RootDevice::retain() { DEBUG_BREAK_IF(!isValid()); } unique_ptr_if_unused RootDevice::release() { DEBUG_BREAK_IF(!isValid()); return unique_ptr_if_unused(this, false); } DeviceBitfield RootDevice::getDeviceBitfieldForOsContext() const { DeviceBitfield deviceBitfield; deviceBitfield.set(0); return deviceBitfield; } bool RootDevice::createEngines() { if (!initializeRootCommandStreamReceiver()) { return Device::createEngines(); } return true; } } // namespace NEO