mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-22 18:25:05 +08:00
Close adapter after veryfing adapter luid from HDC
Related-To: NEO-4952 Change-Id: Ieac35973895baec92ae7f093b1b693cd60994022 Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
@@ -88,7 +88,12 @@ class WddmMock : public Wddm {
|
|||||||
uint64_t *getPagingFenceAddress() override;
|
uint64_t *getPagingFenceAddress() override;
|
||||||
void waitOnPagingFenceFromCpu() override;
|
void waitOnPagingFenceFromCpu() override;
|
||||||
void createPagingFenceLogger() override;
|
void createPagingFenceLogger() override;
|
||||||
bool verifyAdapterLuid(LUID adapterLuid) const override { return verifyAdapterLuidReturnValue; }
|
bool verifyAdapterLuid(LUID adapterLuid) const override {
|
||||||
|
if (callBaseVerifyAdapterLuid) {
|
||||||
|
return Wddm::verifyAdapterLuid(adapterLuid);
|
||||||
|
}
|
||||||
|
return verifyAdapterLuidReturnValue;
|
||||||
|
}
|
||||||
|
|
||||||
bool configureDeviceAddressSpace() {
|
bool configureDeviceAddressSpace() {
|
||||||
configureDeviceAddressSpaceResult.called++;
|
configureDeviceAddressSpaceResult.called++;
|
||||||
@@ -142,6 +147,7 @@ class WddmMock : public Wddm {
|
|||||||
|
|
||||||
NTSTATUS createAllocationStatus = STATUS_SUCCESS;
|
NTSTATUS createAllocationStatus = STATUS_SUCCESS;
|
||||||
bool verifyAdapterLuidReturnValue = true;
|
bool verifyAdapterLuidReturnValue = true;
|
||||||
|
bool callBaseVerifyAdapterLuid = false;
|
||||||
bool mapGpuVaStatus = true;
|
bool mapGpuVaStatus = true;
|
||||||
bool callBaseDestroyAllocations = true;
|
bool callBaseDestroyAllocations = true;
|
||||||
bool failOpenSharedHandle = false;
|
bool failOpenSharedHandle = false;
|
||||||
|
|||||||
@@ -1269,8 +1269,8 @@ HWTEST_F(Wddm20WithMockGdiDllTests, givenNonGen12LPPlatformWhenConfigureDeviceAd
|
|||||||
EXPECT_EQ(NEO::windowsMinAddress, wddm->getWddmMinAddress());
|
EXPECT_EQ(NEO::windowsMinAddress, wddm->getWddmMinAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GdiWithMockedCloseFunc : public Gdi {
|
struct GdiWithMockedCloseFunc : public MockGdi {
|
||||||
GdiWithMockedCloseFunc() : Gdi() {
|
GdiWithMockedCloseFunc() : MockGdi() {
|
||||||
closeAdapter = mockCloseAdapter;
|
closeAdapter = mockCloseAdapter;
|
||||||
GdiWithMockedCloseFunc::closeAdapterCalled = 0u;
|
GdiWithMockedCloseFunc::closeAdapterCalled = 0u;
|
||||||
GdiWithMockedCloseFunc::closeAdapterCalledArgPassed = 0u;
|
GdiWithMockedCloseFunc::closeAdapterCalledArgPassed = 0u;
|
||||||
@@ -1451,7 +1451,7 @@ TEST(DiscoverDevices, whenDriverInfoHasIncompatibleDriverStoreThenHwDeviceIdIsNo
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(VerifyHdcTest, givenHdcHandleFromCorrectAdapterLuidWhenVerifyHdcHandleIsCalledThenSuccessIsReturned) {
|
TEST(VerifyHdcTest, givenHdcHandleFromCorrectAdapterLuidWhenVerifyHdcHandleIsCalledThenSuccessIsReturned) {
|
||||||
auto gdi = std::make_unique<MockGdi>();
|
auto gdi = std::make_unique<GdiWithMockedCloseFunc>();
|
||||||
auto osEnv = std::make_unique<OsEnvironmentWin>();
|
auto osEnv = std::make_unique<OsEnvironmentWin>();
|
||||||
osEnv->gdi = std::move(gdi);
|
osEnv->gdi = std::move(gdi);
|
||||||
|
|
||||||
@@ -1466,20 +1466,25 @@ TEST(VerifyHdcTest, givenHdcHandleFromCorrectAdapterLuidWhenVerifyHdcHandleIsCal
|
|||||||
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
|
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
|
||||||
|
|
||||||
WddmMock wddm(std::move(hwDeviceId), rootDeviceEnvironment);
|
WddmMock wddm(std::move(hwDeviceId), rootDeviceEnvironment);
|
||||||
|
wddm.callBaseVerifyAdapterLuid = true;
|
||||||
|
|
||||||
size_t hdcHandle = 0x1;
|
size_t hdcHandle = 0x1;
|
||||||
|
|
||||||
auto status = wddm.Wddm::verifyHdcHandle(hdcHandle);
|
auto status = wddm.Wddm::verifyHdcHandle(hdcHandle);
|
||||||
|
|
||||||
|
EXPECT_EQ(1u, GdiWithMockedCloseFunc::closeAdapterCalled);
|
||||||
|
EXPECT_EQ(MockGdi::adapterHandleForHdc, GdiWithMockedCloseFunc::closeAdapterCalledArgPassed);
|
||||||
|
|
||||||
EXPECT_TRUE(status);
|
EXPECT_TRUE(status);
|
||||||
|
|
||||||
status = wddm.Wddm::verifyHdcHandle(0u);
|
status = wddm.Wddm::verifyHdcHandle(0u);
|
||||||
|
|
||||||
|
EXPECT_EQ(1u, GdiWithMockedCloseFunc::closeAdapterCalled);
|
||||||
EXPECT_FALSE(status);
|
EXPECT_FALSE(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(VerifyHdcTest, givenHdcHandleFromInvalidAdapterLuidWhenVerifyHdcHandleIsCalledThenFailureIsReturned) {
|
TEST(VerifyHdcTest, givenHdcHandleFromInvalidAdapterLuidWhenVerifyHdcHandleIsCalledThenFailureIsReturned) {
|
||||||
auto gdi = std::make_unique<MockGdi>();
|
auto gdi = std::make_unique<GdiWithMockedCloseFunc>();
|
||||||
auto osEnv = std::make_unique<OsEnvironmentWin>();
|
auto osEnv = std::make_unique<OsEnvironmentWin>();
|
||||||
osEnv->gdi = std::move(gdi);
|
osEnv->gdi = std::move(gdi);
|
||||||
|
|
||||||
@@ -1494,6 +1499,7 @@ TEST(VerifyHdcTest, givenHdcHandleFromInvalidAdapterLuidWhenVerifyHdcHandleIsCal
|
|||||||
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
|
RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);
|
||||||
|
|
||||||
WddmMock wddm(std::move(hwDeviceId), rootDeviceEnvironment);
|
WddmMock wddm(std::move(hwDeviceId), rootDeviceEnvironment);
|
||||||
|
wddm.callBaseVerifyAdapterLuid = true;
|
||||||
|
|
||||||
size_t hdcHandle = 0x1;
|
size_t hdcHandle = 0x1;
|
||||||
|
|
||||||
@@ -1501,11 +1507,16 @@ TEST(VerifyHdcTest, givenHdcHandleFromInvalidAdapterLuidWhenVerifyHdcHandleIsCal
|
|||||||
|
|
||||||
auto status = wddm.Wddm::verifyHdcHandle(hdcHandle);
|
auto status = wddm.Wddm::verifyHdcHandle(hdcHandle);
|
||||||
|
|
||||||
|
EXPECT_EQ(1u, GdiWithMockedCloseFunc::closeAdapterCalled);
|
||||||
|
EXPECT_EQ(MockGdi::adapterHandleForHdc, GdiWithMockedCloseFunc::closeAdapterCalledArgPassed);
|
||||||
|
|
||||||
EXPECT_FALSE(status);
|
EXPECT_FALSE(status);
|
||||||
|
|
||||||
MockGdi::adapterLuidToReturn = {0x1234, 0x5679};
|
MockGdi::adapterLuidToReturn = {0x1234, 0x5679};
|
||||||
|
|
||||||
status = wddm.Wddm::verifyHdcHandle(hdcHandle);
|
status = wddm.Wddm::verifyHdcHandle(hdcHandle);
|
||||||
|
|
||||||
|
EXPECT_EQ(2u, GdiWithMockedCloseFunc::closeAdapterCalled);
|
||||||
|
EXPECT_EQ(MockGdi::adapterHandleForHdc, GdiWithMockedCloseFunc::closeAdapterCalledArgPassed);
|
||||||
EXPECT_FALSE(status);
|
EXPECT_FALSE(status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1071,7 +1071,14 @@ bool Wddm::verifyHdcHandle(size_t hdcHandle) const {
|
|||||||
DEBUG_BREAK_IF(true);
|
DEBUG_BREAK_IF(true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return openAdapterFromHdcStruct.AdapterLuid.HighPart == hwDeviceId->getAdapterLuid().HighPart && openAdapterFromHdcStruct.AdapterLuid.LowPart == hwDeviceId->getAdapterLuid().LowPart;
|
|
||||||
|
auto adapterLuid = openAdapterFromHdcStruct.AdapterLuid;
|
||||||
|
D3DKMT_CLOSEADAPTER closeAdapterStruct{};
|
||||||
|
|
||||||
|
closeAdapterStruct.hAdapter = openAdapterFromHdcStruct.hAdapter;
|
||||||
|
getGdi()->closeAdapter(&closeAdapterStruct);
|
||||||
|
|
||||||
|
return verifyAdapterLuid(adapterLuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace NEO
|
} // namespace NEO
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class MockGdi : public Gdi {
|
|||||||
}
|
}
|
||||||
~MockGdi(){};
|
~MockGdi(){};
|
||||||
|
|
||||||
|
static const D3DKMT_HANDLE adapterHandleForHdc = 0x1233;
|
||||||
static UINT64 pagingFenceReturnValue;
|
static UINT64 pagingFenceReturnValue;
|
||||||
bool nonZeroNumBytesToTrim = false;
|
bool nonZeroNumBytesToTrim = false;
|
||||||
static LUID adapterLuidToReturn;
|
static LUID adapterLuidToReturn;
|
||||||
@@ -173,6 +174,7 @@ class MockGdi : public Gdi {
|
|||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
openAdapterFromHdcStruct->AdapterLuid = MockGdi::adapterLuidToReturn;
|
openAdapterFromHdcStruct->AdapterLuid = MockGdi::adapterLuidToReturn;
|
||||||
|
openAdapterFromHdcStruct->hAdapter = MockGdi::adapterHandleForHdc;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user