Add cl_khr_pci_bus_info extension

Signed-off-by: Egor Suldin <egor.suldin@intel.com>

https://github.com/intel/compute-runtime/pull/374
This commit is contained in:
Suldin, Egor
2020-11-05 15:40:03 +03:00
committed by Compute-Runtime-Automation
parent c94ad034d9
commit 2b3b47b495
23 changed files with 435 additions and 45 deletions

View File

@ -83,7 +83,7 @@ class MockDriverInfoWindows : public DriverInfoWindows {
static MockDriverInfoWindows *create(std::string path) {
auto result = new MockDriverInfoWindows("");
auto result = new MockDriverInfoWindows("", PhysicalDevicePciBusInfo(PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue));
result->reader = new TestedRegistryReader(path);
result->registryReader.reset(result->reader);
@ -152,7 +152,7 @@ struct DriverInfoWindowsTest : public ::testing::Test {
DriverInfoWindows::createRegistryReaderFunc = [](const std::string &) -> std::unique_ptr<SettingsReader> {
return std::make_unique<MockRegistryReader>();
};
driverInfo = std::make_unique<MockDriverInfoWindows>("");
driverInfo = std::make_unique<MockDriverInfoWindows>("", PhysicalDevicePciBusInfo(PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue));
}
VariableBackup<decltype(DriverInfoWindows::createRegistryReaderFunc)> createFuncBackup{&DriverInfoWindows::createRegistryReaderFunc};
@ -178,7 +178,7 @@ TEST_F(DriverInfoWindowsTest, GivenDriverInfoWhenThenReturnNonNullptr) {
};
TEST(DriverInfo, givenDriverInfoWhenGetStringReturnNotMeaningEmptyStringThenEnableSharingSupport) {
MockDriverInfoWindows driverInfo("");
MockDriverInfoWindows driverInfo("", PhysicalDevicePciBusInfo(PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue));
MockRegistryReader *registryReaderMock = new MockRegistryReader();
driverInfo.registryReader.reset(registryReaderMock);
@ -190,7 +190,7 @@ TEST(DriverInfo, givenDriverInfoWhenGetStringReturnNotMeaningEmptyStringThenEnab
};
TEST(DriverInfo, givenDriverInfoWhenGetStringReturnMeaningEmptyStringThenDisableSharingSupport) {
MockDriverInfoWindows driverInfo("");
MockDriverInfoWindows driverInfo("", PhysicalDevicePciBusInfo(PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue));
MockRegistryReader *registryReaderMock = new MockRegistryReader();
registryReaderMock->returnString = "<>";
driverInfo.registryReader.reset(registryReaderMock);
@ -206,7 +206,7 @@ TEST(DriverInfo, givenFullPathToRegistryWhenCreatingDriverInfoWindowsThenTheRegi
std::string registryPath = "Path\\In\\Registry";
std::string fullRegistryPath = "\\REGISTRY\\MACHINE\\" + registryPath;
std::string expectedTrimmedRegistryPath = registryPath;
MockDriverInfoWindows driverInfo(std::move(fullRegistryPath));
MockDriverInfoWindows driverInfo(std::move(fullRegistryPath), PhysicalDevicePciBusInfo(PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue, PhysicalDevicePciBusInfo::InvalidValue));
EXPECT_STREQ(expectedTrimmedRegistryPath.c_str(), driverInfo.path.c_str());
};

View File

@ -1553,3 +1553,83 @@ TEST_F(WddmTestWithMockGdiDll, givenValidInputwhenSettingAllocationPriorityThenT
EXPECT_TRUE(wddm->setAllocationPriority(handles, 2, DXGI_RESOURCE_PRIORITY_NORMAL));
EXPECT_EQ(DXGI_RESOURCE_PRIORITY_NORMAL, getLastPriorityFcn());
}
struct GdiWithMockedQueryAdapterInfoFunc : public MockGdi {
GdiWithMockedQueryAdapterInfoFunc() : MockGdi() {
queryAdapterInfo = mockQueryAdapterInfo;
GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCalled = 0u;
}
static NTSTATUS __stdcall mockQueryAdapterInfo(IN CONST D3DKMT_QUERYADAPTERINFO *adapterInfo) {
++queryAdapterInfoCalled;
if (queryAdapterInfoCallAlwaysReturnsUnsuccessful) {
return STATUS_UNSUCCESSFUL;
}
if (adapterInfo->Type != KMTQAITYPE_ADAPTERADDRESS) {
return STATUS_NOT_IMPLEMENTED;
}
if (adapterInfo->PrivateDriverDataSize != sizeof(D3DKMT_ADAPTERADDRESS)) {
return STATUS_INFO_LENGTH_MISMATCH;
}
D3DKMT_ADAPTERADDRESS *adapterAddress = static_cast<D3DKMT_ADAPTERADDRESS *>(adapterInfo->pPrivateDriverData);
adapterAddress->BusNumber = 1;
adapterAddress->DeviceNumber = 2;
adapterAddress->FunctionNumber = 3;
return STATUS_SUCCESS;
}
static uint32_t queryAdapterInfoCalled;
static bool queryAdapterInfoCallAlwaysReturnsUnsuccessful;
};
uint32_t GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCalled;
bool GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCallAlwaysReturnsUnsuccessful;
TEST(VerifyPciBusInfo, givenQueryAdapterInfoCallReturnsSuccesThenPciBusInfoIsValid) {
GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCallAlwaysReturnsUnsuccessful = false;
auto osEnv = std::make_unique<OsEnvironmentWin>();
osEnv->gdi = std::make_unique<GdiWithMockedQueryAdapterInfoFunc>();
MockExecutionEnvironment executionEnvironment;
executionEnvironment.osEnvironment = std::move(osEnv);
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
std::unique_ptr<Wddm> wddm(Wddm::createWddm(nullptr, rootDeviceEnvironment));
auto pciBusInfo = wddm->getPciBusInfo();
EXPECT_EQ(GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCalled, 1u);
EXPECT_EQ(pciBusInfo.pciDomain, 0u);
EXPECT_EQ(pciBusInfo.pciBus, 1u);
EXPECT_EQ(pciBusInfo.pciDevice, 2u);
EXPECT_EQ(pciBusInfo.pciFunction, 3u);
}
TEST(VerifyPciBusInfo, givenQueryAdapterInfoCallReturnsErrorThenPciBusInfoIsNotValid) {
GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCallAlwaysReturnsUnsuccessful = true;
auto osEnv = std::make_unique<OsEnvironmentWin>();
osEnv->gdi = std::make_unique<GdiWithMockedQueryAdapterInfoFunc>();
MockExecutionEnvironment executionEnvironment;
executionEnvironment.osEnvironment = std::move(osEnv);
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
std::unique_ptr<Wddm> wddm(Wddm::createWddm(nullptr, rootDeviceEnvironment));
auto pciBusInfo = wddm->getPciBusInfo();
EXPECT_EQ(GdiWithMockedQueryAdapterInfoFunc::queryAdapterInfoCalled, 1u);
EXPECT_EQ(pciBusInfo.pciDomain, PhysicalDevicePciBusInfo::InvalidValue);
EXPECT_EQ(pciBusInfo.pciBus, PhysicalDevicePciBusInfo::InvalidValue);
EXPECT_EQ(pciBusInfo.pciDevice, PhysicalDevicePciBusInfo::InvalidValue);
EXPECT_EQ(pciBusInfo.pciFunction, PhysicalDevicePciBusInfo::InvalidValue);
}