mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
feature: Add support for Media frequncy Domain on linux
Related-To: LOCI-4552 Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
46007dde5b
commit
085293b230
@@ -422,7 +422,19 @@ OsFrequency *OsFrequency::create(OsSysman *pOsSysman, ze_bool_t onSubdevice, uin
|
||||
}
|
||||
|
||||
std::vector<zes_freq_domain_t> OsFrequency::getNumberOfFreqDomainsSupported(OsSysman *pOsSysman) {
|
||||
std::vector<zes_freq_domain_t> freqDomains = {ZES_FREQ_DOMAIN_GPU};
|
||||
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
|
||||
auto &productHelper = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironment().getHelper<NEO::ProductHelper>();
|
||||
auto releaseHelper = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironment().getReleaseHelper();
|
||||
std::vector<zes_freq_domain_t> freqDomains = {};
|
||||
uint32_t mediaFreqTileIndex;
|
||||
if (productHelper.getMediaFrequencyTileIndex(releaseHelper, mediaFreqTileIndex) == true) {
|
||||
auto pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess();
|
||||
const std::string baseDir = "gt/gt" + std::to_string(mediaFreqTileIndex) + "/";
|
||||
if (pSysfsAccess->directoryExists(baseDir)) {
|
||||
freqDomains.push_back(ZES_FREQ_DOMAIN_MEDIA);
|
||||
}
|
||||
}
|
||||
freqDomains.push_back(ZES_FREQ_DOMAIN_GPU);
|
||||
return freqDomains;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,9 @@ struct SysmanDeviceImp : SysmanDevice, NEO::NonCopyableOrMovableClass {
|
||||
const NEO::RootDeviceEnvironment &getRootDeviceEnvironment() const {
|
||||
return *executionEnvironment->rootDeviceEnvironments[rootDeviceIndex];
|
||||
}
|
||||
NEO::RootDeviceEnvironment &getRootDeviceEnvironmentRef() const {
|
||||
return *executionEnvironment->rootDeviceEnvironments[rootDeviceIndex];
|
||||
}
|
||||
const NEO::HardwareInfo &getHardwareInfo() const override { return *getRootDeviceEnvironment().getHardwareInfo(); }
|
||||
PRODUCT_FAMILY getProductFamily() const { return getHardwareInfo().platform.eProductFamily; }
|
||||
NEO::ExecutionEnvironment *getExecutionEnvironment() const { return executionEnvironment; }
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "shared/source/os_interface/product_helper_hw.h"
|
||||
#include "shared/source/release_helper/release_helper.h"
|
||||
#include "shared/test/common/test_macros/mock_method_macros.h"
|
||||
|
||||
#include "level_zero/sysman/source/frequency/linux/sysman_os_frequency_imp_prelim.h"
|
||||
@@ -346,6 +348,15 @@ struct MockFrequencySysfsAccess : public L0::Sysman::SysfsAccess {
|
||||
~MockFrequencySysfsAccess() override = default;
|
||||
};
|
||||
|
||||
struct MockProductHelperFreq : NEO::ProductHelperHw<IGFX_UNKNOWN> {
|
||||
MockProductHelperFreq() = default;
|
||||
bool isMediaFreqDomainPresent = false;
|
||||
bool getMediaFrequencyTileIndex(const NEO::ReleaseHelper *releaseHelper, uint32_t &tileIndex) const override {
|
||||
tileIndex = 1;
|
||||
return isMediaFreqDomainPresent;
|
||||
}
|
||||
};
|
||||
|
||||
class PublicLinuxFrequencyImp : public L0::Sysman::LinuxFrequencyImp {
|
||||
public:
|
||||
PublicLinuxFrequencyImp(L0::Sysman::OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type) : L0::Sysman::LinuxFrequencyImp(pOsSysman, onSubdevice, subdeviceId, type) {}
|
||||
|
||||
@@ -31,6 +31,8 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
L0::Sysman::SysmanDevice *device = nullptr;
|
||||
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
|
||||
L0::Sysman::SysfsAccess *pSysfsAccessOld = nullptr;
|
||||
std::unique_ptr<ProductHelper> pProductHelper;
|
||||
std::unique_ptr<ProductHelper> pProductHelperOld;
|
||||
uint32_t numClocks = 0;
|
||||
double step = 0;
|
||||
PRODUCT_FAMILY productFamily{};
|
||||
@@ -40,6 +42,9 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
device = pSysmanDevice;
|
||||
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
|
||||
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
|
||||
pProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
|
||||
productFamily = pLinuxSysmanImp->getProductFamily();
|
||||
if (productFamily >= IGFX_XE_HP_SDV) {
|
||||
@@ -62,11 +67,12 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
delete handle;
|
||||
}
|
||||
pSysmanDeviceImp->pFrequencyHandleContext->handleList.clear();
|
||||
getFreqHandles(0);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
|
||||
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
SysmanDeviceFixture::TearDown();
|
||||
}
|
||||
|
||||
@@ -153,6 +159,51 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroAndValidPtrWhenEnume
|
||||
EXPECT_EQ(handle, static_cast<zes_freq_handle_t>(0UL));
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaFreqDomainIsPresentThenNonZeroCountIsReturnedAndCallSucceds) {
|
||||
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
mockProductHelper->isMediaFreqDomainPresent = true;
|
||||
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
|
||||
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
uint32_t count = 0U;
|
||||
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
|
||||
EXPECT_EQ(count, 2U);
|
||||
|
||||
uint32_t testCount = count + 1;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
|
||||
EXPECT_EQ(count, testCount);
|
||||
|
||||
auto handles = getFreqHandles(count);
|
||||
for (auto handle : handles) {
|
||||
EXPECT_NE(handle, nullptr);
|
||||
}
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaDomainIsAbsentThenNonZeroCountIsReturnedAndCallSucceds) {
|
||||
pSysfsAccess->directoryExistsResult = false;
|
||||
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
mockProductHelper->isMediaFreqDomainPresent = true;
|
||||
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
|
||||
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
uint32_t count = 0U;
|
||||
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
|
||||
EXPECT_EQ(count, 1U);
|
||||
|
||||
uint32_t testCount = count + 1;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
|
||||
EXPECT_EQ(count, testCount);
|
||||
|
||||
auto handles = getFreqHandles(count);
|
||||
for (auto handle : handles) {
|
||||
EXPECT_NE(handle, nullptr);
|
||||
}
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFrequencyFixture, GivenActualComponentCountTwoWhenTryingToGetOneComponentOnlyThenOneComponentIsReturnedAndCountUpdated) {
|
||||
auto subDeviceCount = pLinuxSysmanImp->getSubDeviceCount();
|
||||
ze_bool_t onSubdevice = (subDeviceCount == 0) ? false : true;
|
||||
@@ -174,7 +225,8 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFreq
|
||||
zes_freq_properties_t properties;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetProperties(handle, &properties));
|
||||
EXPECT_EQ(nullptr, properties.pNext);
|
||||
EXPECT_EQ(ZES_FREQ_DOMAIN_GPU, properties.type);
|
||||
EXPECT_GE(properties.type, ZES_FREQ_DOMAIN_GPU);
|
||||
EXPECT_LE(properties.type, ZES_FREQ_DOMAIN_MEDIA);
|
||||
EXPECT_FALSE(properties.onSubdevice);
|
||||
EXPECT_DOUBLE_EQ(maxFreq, properties.max);
|
||||
EXPECT_DOUBLE_EQ(minFreq, properties.min);
|
||||
@@ -857,6 +909,7 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
L0::Sysman::SysmanDevice *device = nullptr;
|
||||
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
|
||||
L0::Sysman::SysfsAccess *pSysfsAccessOld = nullptr;
|
||||
std::unique_ptr<ProductHelper> pProductHelper;
|
||||
|
||||
void SetUp() override {
|
||||
SysmanMultiDeviceFixture::SetUp();
|
||||
@@ -864,6 +917,9 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
|
||||
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
|
||||
pProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
// delete handles created in initial SysmanDeviceHandleContext::init() call
|
||||
for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
|
||||
delete handle;
|
||||
@@ -874,6 +930,8 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
|
||||
void TearDown() override {
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
|
||||
auto &rootDeviceEnvironment = pLinuxSysmanImp->getParentSysmanDeviceImp()->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
SysmanMultiDeviceFixture::TearDown();
|
||||
}
|
||||
|
||||
|
||||
@@ -427,7 +427,20 @@ OsFrequency *OsFrequency::create(OsSysman *pOsSysman, ze_bool_t onSubdevice, uin
|
||||
}
|
||||
|
||||
std::vector<zes_freq_domain_t> OsFrequency::getNumberOfFreqDomainsSupported(OsSysman *pOsSysman) {
|
||||
std::vector<zes_freq_domain_t> freqDomains = {ZES_FREQ_DOMAIN_GPU};
|
||||
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
|
||||
auto pDevice = Device::fromHandle(pLinuxSysmanImp->getSysmanDeviceImp()->hCoreDevice);
|
||||
auto &productHelper = pDevice->getNEODevice()->getProductHelper();
|
||||
auto releaseHelper = pDevice->getNEODevice()->getReleaseHelper();
|
||||
std::vector<zes_freq_domain_t> freqDomains = {};
|
||||
uint32_t mediaFreqTileIndex;
|
||||
if (productHelper.getMediaFrequencyTileIndex(releaseHelper, mediaFreqTileIndex) == true) {
|
||||
auto pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess();
|
||||
const std::string baseDir = "gt/gt" + std::to_string(mediaFreqTileIndex) + "/";
|
||||
if (pSysfsAccess->directoryExists(baseDir)) {
|
||||
freqDomains.push_back(ZES_FREQ_DOMAIN_MEDIA);
|
||||
}
|
||||
}
|
||||
freqDomains.push_back(ZES_FREQ_DOMAIN_GPU);
|
||||
return freqDomains;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "shared/source/os_interface/product_helper_hw.h"
|
||||
#include "shared/source/release_helper/release_helper.h"
|
||||
#include "shared/test/common/test_macros/mock_method_macros.h"
|
||||
|
||||
#include "level_zero/tools/source/sysman/frequency/linux/os_frequency_imp_prelim.h"
|
||||
@@ -341,6 +343,15 @@ struct MockFrequencySysfsAccess : public SysfsAccess {
|
||||
~MockFrequencySysfsAccess() override = default;
|
||||
};
|
||||
|
||||
struct MockProductHelperFreq : NEO::ProductHelperHw<IGFX_UNKNOWN> {
|
||||
MockProductHelperFreq() = default;
|
||||
bool isMediaFreqDomainPresent = false;
|
||||
bool getMediaFrequencyTileIndex(const NEO::ReleaseHelper *releaseHelper, uint32_t &tileIndex) const override {
|
||||
tileIndex = 1;
|
||||
return isMediaFreqDomainPresent;
|
||||
}
|
||||
};
|
||||
|
||||
class PublicLinuxFrequencyImp : public L0::LinuxFrequencyImp {
|
||||
public:
|
||||
PublicLinuxFrequencyImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type) : LinuxFrequencyImp(pOsSysman, onSubdevice, subdeviceId, type) {}
|
||||
|
||||
@@ -35,6 +35,7 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
protected:
|
||||
std::vector<ze_device_handle_t> deviceHandles;
|
||||
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
|
||||
std::unique_ptr<ProductHelper> pProductHelper;
|
||||
SysfsAccess *pSysfsAccessOld = nullptr;
|
||||
uint32_t numClocks = 0;
|
||||
double step = 0;
|
||||
@@ -54,6 +55,9 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
|
||||
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
|
||||
pProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
|
||||
pSysfsAccess->setVal(minFreqFile, minFreq);
|
||||
pSysfsAccess->setVal(maxFreqFile, maxFreq);
|
||||
@@ -78,7 +82,6 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
deviceHandles.resize(subDeviceCount, nullptr);
|
||||
Device::fromHandle(device->toHandle())->getSubDevices(&subDeviceCount, deviceHandles.data());
|
||||
}
|
||||
getFreqHandles(0);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
@@ -86,6 +89,8 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
|
||||
GTEST_SKIP();
|
||||
}
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
|
||||
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
SysmanDeviceFixture::TearDown();
|
||||
}
|
||||
|
||||
@@ -163,6 +168,51 @@ TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequ
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaFreqDomainIsPresentThenNonZeroCountIsReturnedAndCallSucceds) {
|
||||
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
mockProductHelper->isMediaFreqDomainPresent = true;
|
||||
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
|
||||
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
uint32_t count = 0U;
|
||||
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
|
||||
EXPECT_EQ(count, 2U);
|
||||
|
||||
uint32_t testCount = count + 1;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
|
||||
EXPECT_EQ(count, testCount);
|
||||
|
||||
auto handles = getFreqHandles(count);
|
||||
for (auto handle : handles) {
|
||||
EXPECT_NE(handle, nullptr);
|
||||
}
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesAndMediaDomainIsAbsentThenNonZeroCountIsReturnedAndCallSucceds) {
|
||||
pSysfsAccess->directoryExistsResult = false;
|
||||
auto mockProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
mockProductHelper->isMediaFreqDomainPresent = true;
|
||||
std::unique_ptr<ProductHelper> productHelper = std::move(mockProductHelper);
|
||||
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
uint32_t count = 0U;
|
||||
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
|
||||
EXPECT_EQ(count, 1U);
|
||||
|
||||
uint32_t testCount = count + 1;
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
|
||||
EXPECT_EQ(count, testCount);
|
||||
|
||||
auto handles = getFreqHandles(count);
|
||||
for (auto handle : handles) {
|
||||
EXPECT_NE(handle, nullptr);
|
||||
}
|
||||
std::swap(rootDeviceEnvironment.productHelper, productHelper);
|
||||
}
|
||||
|
||||
TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroAndValidPtrWhenEnumeratingFrequencyHandlesThenNonZeroCountAndNoHandlesAreReturnedAndCallSucceds) {
|
||||
uint32_t count = 0U;
|
||||
zes_freq_handle_t handle = static_cast<zes_freq_handle_t>(0UL);
|
||||
@@ -853,6 +903,7 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
protected:
|
||||
DebugManagerStateRestore restorer;
|
||||
std::unique_ptr<MockFrequencySysfsAccess> pSysfsAccess;
|
||||
std::unique_ptr<ProductHelper> pProductHelper;
|
||||
SysfsAccess *pSysfsAccessOld = nullptr;
|
||||
std::vector<ze_device_handle_t> deviceHandles;
|
||||
|
||||
@@ -865,6 +916,9 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
|
||||
pSysfsAccess = std::make_unique<MockFrequencySysfsAccess>();
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
|
||||
pProductHelper = std::make_unique<MockProductHelperFreq>();
|
||||
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
// delete handles created in initial SysmanDeviceHandleContext::init() call
|
||||
for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
|
||||
delete handle;
|
||||
@@ -887,6 +941,8 @@ class FreqMultiDeviceFixture : public SysmanMultiDeviceFixture {
|
||||
GTEST_SKIP();
|
||||
}
|
||||
pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
|
||||
auto &rootDeviceEnvironment = neoDevice->getRootDeviceEnvironmentRef();
|
||||
std::swap(rootDeviceEnvironment.productHelper, pProductHelper);
|
||||
SysmanMultiDeviceFixture::TearDown();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user