@@ -118,6 +118,9 @@ struct GdiMockConfig {
118
118
D3DKMT_LOCK2 receivedLock2Args = {};
119
119
D3DKMT_DESTROYALLOCATION2 receivedDestroyAllocation2Args = {};
120
120
uint32_t mockAllocationHandle = 7U ;
121
+
122
+ D3DKMT_GETDEVICESTATE receivedGetDeviceStateArgs = {};
123
+ GdiMockCallbackWithReturn getDeviceStateClb = {};
121
124
} gdiMockConfig;
122
125
123
126
NTSTATUS __stdcall reserveDeviceAddressSpaceMock (D3DDDI_RESERVEGPUVIRTUALADDRESS *arg) {
@@ -185,6 +188,15 @@ NTSTATUS __stdcall escapeMock(const D3DKMT_ESCAPE *arg) {
185
188
return gdiMockConfig.escapeClb .returnValue ;
186
189
}
187
190
191
+ NTSTATUS __stdcall getDeviceStateMock (D3DKMT_GETDEVICESTATE *arg) {
192
+ gdiMockConfig.receivedGetDeviceStateArgs = *arg;
193
+ gdiMockConfig.getDeviceStateClb .callCount += 1 ;
194
+ if (gdiMockConfig.getDeviceStateClb .callback ) {
195
+ gdiMockConfig.getDeviceStateClb .callback ();
196
+ }
197
+ return gdiMockConfig.getDeviceStateClb .returnValue ;
198
+ }
199
+
188
200
struct WddmLinuxTest : public ::testing::Test {
189
201
void SetUp () override {
190
202
mockRootDeviceEnvironment = std::make_unique<NEO::MockRootDeviceEnvironment>(mockExecEnv);
@@ -248,9 +260,16 @@ TEST_F(WddmLinuxConfigureDeviceAddressSpaceTest, givenPreReservedSvmAddressSpace
248
260
}
249
261
250
262
this ->osEnvironment ->gdi ->reserveGpuVirtualAddress = reserveDeviceAddressSpaceMock;
251
- gdiMockConfig.reserveGpuVaClb .returnValue = -2 ;
252
- gdiMockConfig.reserveGpuVaClb .callback = []() { gdiMockConfig.reserveGpuVaClb .returnValue += 1 ; };
263
+ auto cantReserveWholeGpuVAButCanReservePortion = []() {
264
+ gdiMockConfig.reserveGpuVaClb .returnValue = (gdiMockConfig.reserveGpuVaClb .callCount == 1 ) ? -1 : 0 ;
265
+ };
266
+ gdiMockConfig.reserveGpuVaClb .callback = cantReserveWholeGpuVAButCanReservePortion;
253
267
bool success = this ->wddm ->configureDeviceAddressSpace ();
268
+ EXPECT_FALSE (success);
269
+
270
+ auto cantReserveWholeGpuVAAndCantReservePortion = []() { gdiMockConfig.reserveGpuVaClb .returnValue = -1 ; };
271
+ gdiMockConfig.reserveGpuVaClb .callback = cantReserveWholeGpuVAAndCantReservePortion;
272
+ success = this ->wddm ->configureDeviceAddressSpace ();
254
273
EXPECT_TRUE (success);
255
274
256
275
auto svmSize = this ->getMaxSvmSize ();
@@ -261,19 +280,6 @@ TEST_F(WddmLinuxConfigureDeviceAddressSpaceTest, givenPreReservedSvmAddressSpace
261
280
EXPECT_EQ (wddm->getAdapter (), gdiMockConfig.receivedReserveGpuVaArgs .hAdapter );
262
281
}
263
282
264
- TEST_F (WddmLinuxConfigureDeviceAddressSpaceTest, givenSvmAddressSpaceWhenCouldNotReserveGpuVAForSvmThenFail) {
265
- if (NEO::hardwareInfoTable[productFamily]->capabilityTable .gpuAddressSpace < MemoryConstants::max64BitAppAddress) {
266
- GTEST_SKIP ();
267
- }
268
-
269
- osEnvironment->gdi ->reserveGpuVirtualAddress = reserveDeviceAddressSpaceMock;
270
- this ->osEnvironment ->gdi ->reserveGpuVirtualAddress = reserveDeviceAddressSpaceMock;
271
-
272
- gdiMockConfig.reserveGpuVaClb .returnValue = -1 ;
273
- bool success = this ->wddm ->configureDeviceAddressSpace ();
274
- EXPECT_FALSE (success);
275
- }
276
-
277
283
TEST_F (WddmLinuxConfigureDeviceAddressSpaceTest, givenNonSvmAddressSpaceThenReserveGpuVAForUSMIsNotCalled) {
278
284
if (NEO::hardwareInfoTable[productFamily]->capabilityTable .gpuAddressSpace >= MemoryConstants::max64BitAppAddress) {
279
285
GTEST_SKIP ();
@@ -531,10 +537,13 @@ TEST_F(WddmLinuxConfigureReduced48bitDeviceAddressSpaceTest, givenTwoSvmAddressS
531
537
}
532
538
533
539
this ->wddm ->featureTable ->ftrCCSRing = 1 ;
534
- gdiMockConfig.reserveGpuVaClb .returnValue = -1 ;
535
540
536
541
osEnvironment->gdi ->escape = escapeMock;
537
542
osEnvironment->gdi ->reserveGpuVirtualAddress = reserveDeviceAddressSpaceMock;
543
+ auto cantReserveWholeGpuVAButCanReservePortion = []() {
544
+ gdiMockConfig.reserveGpuVaClb .returnValue = (gdiMockConfig.reserveGpuVaClb .callCount == 1 ) ? -1 : 0 ;
545
+ };
546
+ gdiMockConfig.reserveGpuVaClb .callback = cantReserveWholeGpuVAButCanReservePortion;
538
547
bool success = this ->wddm ->configureDeviceAddressSpace ();
539
548
EXPECT_FALSE (success);
540
549
EXPECT_EQ (1U , this ->wddm ->validAddressRangeReservations .size ());
@@ -549,14 +558,12 @@ TEST_F(WddmLinuxConfigureReduced48bitDeviceAddressSpaceTest, givenTwoSvmAddressS
549
558
}
550
559
551
560
this ->wddm ->featureTable ->ftrCCSRing = 1 ;
552
- gdiMockConfig.reserveGpuVaClb .callback = []() {
553
- if (gdiMockConfig.reserveGpuVaClb .callCount > 1 ) {
554
- gdiMockConfig.reserveGpuVaClb .returnValue = -1 ;
555
- };
556
- };
557
-
558
561
osEnvironment->gdi ->escape = escapeMock;
559
562
osEnvironment->gdi ->reserveGpuVirtualAddress = reserveDeviceAddressSpaceMock;
563
+ auto cantReserveWholeGpuVAOfSecondButCanReservePortionOfSecont = []() {
564
+ gdiMockConfig.reserveGpuVaClb .returnValue = (gdiMockConfig.reserveGpuVaClb .callCount == 2 ) ? -1 : 0 ;
565
+ };
566
+ gdiMockConfig.reserveGpuVaClb .callback = cantReserveWholeGpuVAOfSecondButCanReservePortionOfSecont;
560
567
bool success = this ->wddm ->configureDeviceAddressSpace ();
561
568
EXPECT_FALSE (success);
562
569
EXPECT_EQ (1U , this ->wddm ->validAddressRangeReservations .size ());
@@ -605,6 +612,20 @@ TEST_F(WddmLinuxTest, givenRequestFor32bitAllocationWithoutPreexistingHostPtrWhe
605
612
memoryManager.freeGraphicsMemoryImpl (alloc);
606
613
}
607
614
615
+ TEST_F (WddmLinuxTest, whenCheckedIfResourcesCleanupCanBeSkippedAndDeviceIsAliveThenReturnsFalse) {
616
+ osEnvironment->gdi ->getDeviceState = getDeviceStateMock;
617
+ gdiMockConfig.getDeviceStateClb .returnValue = STATUS_SUCCESS;
618
+ EXPECT_FALSE (this ->wddm ->skipResourceCleanup ());
619
+ EXPECT_EQ (1 , gdiMockConfig.getDeviceStateClb .callCount );
620
+ }
621
+
622
+ TEST_F (WddmLinuxTest, whenCheckedIfResourcesCleanupCanBeSkippedAndDeviceIsLostThenReturnsTrue) {
623
+ osEnvironment->gdi ->getDeviceState = getDeviceStateMock;
624
+ gdiMockConfig.getDeviceStateClb .returnValue = -1 ;
625
+ EXPECT_TRUE (this ->wddm ->skipResourceCleanup ());
626
+ EXPECT_EQ (1 , gdiMockConfig.getDeviceStateClb .callCount );
627
+ }
628
+
608
629
class MockOsTimeLinux : public NEO ::OSTimeLinux {
609
630
public:
610
631
MockOsTimeLinux (NEO::OSInterface *osInterface, std::unique_ptr<NEO::DeviceTime> deviceTime) : NEO::OSTimeLinux(osInterface, std::move(deviceTime)) {}
0 commit comments