@@ -28,6 +28,13 @@ class MockWddmResidencyController : public WddmResidencyController {
2828 using WddmResidencyController::trimResidency;
2929 using WddmResidencyController::trimResidencyToBudget;
3030 using WddmResidencyController::WddmResidencyController;
31+
32+ uint32_t acquireLockCallCount = 0u ;
33+
34+ std::unique_lock<SpinLock> acquireLock () override {
35+ acquireLockCallCount++;
36+ return WddmResidencyController::acquireLock ();
37+ }
3138};
3239
3340struct WddmResidencyControllerTest : ::testing::Test {
@@ -690,3 +697,33 @@ TEST_F(WddmResidencyControllerWithGdiTest, givenThreeAllocationsAlignedSizeBigge
690697 EXPECT_FALSE (allocation2.getResidencyData ().resident );
691698 EXPECT_TRUE (allocation3.getResidencyData ().resident );
692699}
700+
701+ using WddmResidencyControllerLockTest = WddmResidencyControllerWithGdiTest;
702+
703+ TEST_F (WddmResidencyControllerLockTest, givenPeriodicTrimWhenTrimmingResidencyThenLockOnce) {
704+ D3DKMT_TRIMNOTIFICATION trimNotification = {0 };
705+ trimNotification.Flags .PeriodicTrim = 1 ;
706+ trimNotification.NumBytesToTrim = 0 ;
707+
708+ residencyController->trimResidency (trimNotification.Flags , trimNotification.NumBytesToTrim );
709+ EXPECT_EQ (1 , residencyController->acquireLockCallCount );
710+ }
711+
712+ TEST_F (WddmResidencyControllerLockTest, givenTrimToBudgetWhenTrimmingResidencyThenLockOnce) {
713+ D3DKMT_TRIMNOTIFICATION trimNotification = {0 };
714+ trimNotification.Flags .TrimToBudget = 1 ;
715+ trimNotification.NumBytesToTrim = 0 ;
716+
717+ residencyController->trimResidency (trimNotification.Flags , trimNotification.NumBytesToTrim );
718+ EXPECT_EQ (1 , residencyController->acquireLockCallCount );
719+ }
720+
721+ TEST_F (WddmResidencyControllerLockTest, givenPeriodicTrimAndTrimToBudgetWhenTrimmingResidencyThenLockTwice) {
722+ D3DKMT_TRIMNOTIFICATION trimNotification = {0 };
723+ trimNotification.Flags .PeriodicTrim = 1 ;
724+ trimNotification.Flags .TrimToBudget = 1 ;
725+ trimNotification.NumBytesToTrim = 0 ;
726+
727+ residencyController->trimResidency (trimNotification.Flags , trimNotification.NumBytesToTrim );
728+ EXPECT_EQ (2 , residencyController->acquireLockCallCount );
729+ }
0 commit comments