Skip to content

Commit 1a89a01

Browse files
Register trim callback after creating monitored fence
Change-Id: Ib0510a0aed180c7bfe883a60632fd642664e1085 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 5b316d1 commit 1a89a01

File tree

8 files changed

+39
-3
lines changed

8 files changed

+39
-3
lines changed

runtime/os_interface/windows/os_context_win.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ OsContextWin::OsContextImpl(Wddm &wddm, uint32_t osContextId) : wddm(wddm), resi
2424
}
2525
}
2626
initialized = wddmInterface->createMonitoredFence(this->residencyController);
27+
this->residencyController.registerCallback();
2728
};
2829
OsContextWin::~OsContextImpl() {
2930
wddm.getWddmInterface()->destroyHwQueue(hwQueueHandle);

runtime/os_interface/windows/wddm/wddm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class Wddm {
7878
MOCKABLE_VIRTUAL bool waitFromCpu(uint64_t lastFenceValue, const MonitoredFence &monitoredFence);
7979

8080
NTSTATUS escape(D3DKMT_ESCAPE &escapeCommand);
81-
VOID *registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController);
81+
MOCKABLE_VIRTUAL VOID *registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController);
8282
void unregisterTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, VOID *trimCallbackHandle);
8383
MOCKABLE_VIRTUAL void releaseReservedAddress(void *reservedAddress);
8484
MOCKABLE_VIRTUAL bool reserveValidAddressRange(size_t size, void *&reservedMem);

runtime/os_interface/windows/wddm_residency_controller.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
namespace OCLRT {
1717

1818
WddmResidencyController::WddmResidencyController(Wddm &wddm, uint32_t osContextId) : wddm(wddm), osContextId(osContextId) {
19+
}
20+
21+
void WddmResidencyController::registerCallback() {
1922
this->trimCallbackHandle = wddm.registerTrimCallback(WddmMemoryManager::trimCallback, *this);
2023
}
2124

runtime/os_interface/windows/wddm_residency_controller.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class WddmResidencyController {
4646
MonitoredFence &getMonitoredFence() { return monitoredFence; }
4747
void resetMonitoredFenceParams(D3DKMT_HANDLE &handle, uint64_t *cpuAddress, D3DGPU_VIRTUAL_ADDRESS &gpuAddress);
4848

49+
void registerCallback();
50+
4951
void trimResidency(D3DDDI_TRIMRESIDENCYSET_FLAGS flags, uint64_t bytes);
5052
bool trimResidencyToBudget(uint64_t bytes);
5153

unit_tests/mocks/mock_wddm.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ bool WddmMock::reserveValidAddressRange(size_t size, void *&reservedMem) {
220220
}
221221
return ret;
222222
}
223+
VOID *WddmMock::registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController) {
224+
registerTrimCallbackResult.called++;
225+
return Wddm::registerTrimCallback(callback, residencyController);
226+
}
223227

224228
GmmMemory *WddmMock::getGmmMemory() const {
225229
return gmmMemory.get();

unit_tests/mocks/mock_wddm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class WddmMock : public Wddm {
7777
void *virtualAlloc(void *inPtr, size_t size, unsigned long flags, unsigned long type) override;
7878
int virtualFree(void *ptr, size_t size, unsigned long flags) override;
7979
void releaseReservedAddress(void *reservedAddress) override;
80+
VOID *registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController) override;
8081
bool reserveValidAddressRange(size_t size, void *&reservedMem);
8182
GmmMemory *getGmmMemory() const;
8283
PLATFORM *getGfxPlatform() { return gfxPlatform.get(); }
@@ -110,6 +111,7 @@ class WddmMock : public Wddm {
110111
WddmMockHelpers::CallResult waitFromCpuResult;
111112
WddmMockHelpers::CallResult releaseReservedAddressResult;
112113
WddmMockHelpers::CallResult reserveValidAddressRangeResult;
114+
WddmMockHelpers::CallResult registerTrimCallbackResult;
113115

114116
NTSTATUS createAllocationStatus;
115117
bool mapGpuVaStatus;

unit_tests/os_interface/windows/os_interface_win_tests.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,17 @@ TEST(OsContextTest, givenWddmWhenCreateOsContextBeforeInitWddmThenOsContextIsNot
3232
EXPECT_THROW(auto osContext = std::make_unique<OsContext>(&osInterface, 0u), std::exception);
3333
}
3434

35-
TEST(OsContextTest, givenWddmWhenCreateOsContextAfterInitWddmThenOsContextIsInitialized) {
35+
TEST(OsContextTest, givenWddmWhenCreateOsContextAfterInitWddmThenOsContextIsInitializedAndTrimCallbackIsRegistered) {
3636
auto wddm = new WddmMock;
3737
OSInterface osInterface;
3838
osInterface.get()->setWddm(wddm);
3939
wddm->init();
40+
EXPECT_EQ(0u, wddm->registerTrimCallbackResult.called);
4041
auto osContext = std::make_unique<OsContext>(&osInterface, 0u);
4142
EXPECT_NE(nullptr, osContext->get());
4243
EXPECT_TRUE(osContext->get()->isInitialized());
4344
EXPECT_EQ(osContext->get()->getWddm(), wddm);
45+
EXPECT_EQ(1u, wddm->registerTrimCallbackResult.called);
4446
}
4547

4648
TEST(OsContextTest, whenCreateOsContextWithoutOsInterfaceThenOsContextImplIsNotAvailable) {

unit_tests/os_interface/windows/wddm_residency_controller_tests.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ struct WddmResidencyControllerWithGdiTest : ::testing::Test {
6363

6464
residencyController = std::make_unique<MockWddmResidencyController>(*wddm, osContextId);
6565
wddm->getWddmInterface()->createMonitoredFence(*residencyController);
66+
residencyController->registerCallback();
6667
}
6768

6869
std::unique_ptr<WddmMock> wddm;
@@ -142,16 +143,37 @@ struct WddmResidencyControllerWithGdiAndMemoryManagerTest : ::testing::Test {
142143
WddmResidencyController *residencyController = nullptr;
143144
};
144145

145-
TEST(WddmResidencyController, givenWddmResidencyControllerWhenItIsConstructedThenRegisterTrimCallback) {
146+
TEST(WddmResidencyController, givenWddmResidencyControllerWhenItIsConstructedThenDoNotRegisterTrimCallback) {
146147
ExecutionEnvironment executionEnvironment;
147148
auto gdi = new MockGdi();
148149
auto wddm = std::unique_ptr<WddmMock>{static_cast<WddmMock *>(Wddm::createWddm())};
149150
wddm->gdi.reset(gdi);
150151
wddm->init();
151152

152153
std::memset(&gdi->getRegisterTrimNotificationArg(), 0, sizeof(D3DKMT_REGISTERTRIMNOTIFICATION));
154+
MockWddmResidencyController residencyController{*wddm, 0u};
155+
156+
EXPECT_EQ(0u, wddm->registerTrimCallbackResult.called);
157+
EXPECT_EQ(nullptr, residencyController.trimCallbackHandle);
158+
159+
EXPECT_EQ(nullptr, gdi->getRegisterTrimNotificationArg().Callback);
160+
EXPECT_EQ(nullptr, gdi->getRegisterTrimNotificationArg().Context);
161+
EXPECT_EQ(0u, gdi->getRegisterTrimNotificationArg().hDevice);
162+
}
163+
164+
TEST(WddmResidencyController, givenWddmResidencyControllerWhenRegisterCallbackThenCallbackIsSetUpProperly) {
165+
ExecutionEnvironment executionEnvironment;
166+
auto gdi = new MockGdi();
167+
auto wddm = std::unique_ptr<WddmMock>{static_cast<WddmMock *>(Wddm::createWddm())};
168+
wddm->gdi.reset(gdi);
169+
wddm->init();
170+
171+
std::memset(&gdi->getRegisterTrimNotificationArg(), 0, sizeof(D3DKMT_REGISTERTRIMNOTIFICATION));
172+
153173
WddmResidencyController residencyController{*wddm, 0u};
174+
residencyController.registerCallback();
154175

176+
EXPECT_EQ(1u, wddm->registerTrimCallbackResult.called);
155177
EXPECT_EQ(reinterpret_cast<PFND3DKMT_TRIMNOTIFICATIONCALLBACK>(WddmMemoryManager::trimCallback), gdi->getRegisterTrimNotificationArg().Callback);
156178
EXPECT_EQ(reinterpret_cast<void *>(&residencyController), gdi->getRegisterTrimNotificationArg().Context);
157179
EXPECT_EQ(wddm->getDevice(), gdi->getRegisterTrimNotificationArg().hDevice);

0 commit comments

Comments
 (0)