Skip to content

Commit 64175d8

Browse files
feature: Add ULLS support for WDDM 2.3
Resolves: NEO-4843 Signed-off-by: Lukasz Jobczyk <[email protected]>
1 parent 1003594 commit 64175d8

File tree

8 files changed

+60
-12
lines changed

8 files changed

+60
-12
lines changed

shared/source/direct_submission/windows/wddm_direct_submission.inl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,7 @@ void WddmDirectSubmission<GfxFamily, Dispatcher>::ensureRingCompletion() {
8686

8787
template <typename GfxFamily, typename Dispatcher>
8888
bool WddmDirectSubmission<GfxFamily, Dispatcher>::allocateOsResources() {
89-
// for now only WDDM2.0
90-
UNRECOVERABLE_IF(wddm->getWddmVersion() != WddmVersion::wddm20);
91-
92-
bool ret = wddm->getWddmInterface()->createMonitoredFence(ringFence);
89+
bool ret = wddm->getWddmInterface()->createMonitoredFenceForDirectSubmission(ringFence, *this->osContextWin);
9390
ringFence.currentFenceValue = 1;
9491
perfLogResidencyVariadicLog(wddm->getResidencyLogger(), "ULLS resource allocation finished with: %d\n", ret);
9592
return ret;

shared/source/os_interface/windows/os_context_win.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ bool OsContextWin::isDirectSubmissionSupported() const {
108108
OsContextWin::~OsContextWin() {
109109
if (contextInitialized && (false == this->wddm.skipResourceCleanup())) {
110110
wddm.getWddmInterface()->destroyHwQueue(hardwareQueue.handle);
111-
wddm.getWddmInterface()->destroyMonitorFence(residencyController.getMonitoredFence());
111+
if (residencyController.getMonitoredFence().fenceHandle != hardwareQueue.progressFenceHandle) {
112+
wddm.getWddmInterface()->destroyMonitorFence(residencyController.getMonitoredFence().fenceHandle);
113+
}
112114
wddm.destroyContext(wddmContextHandle);
113115
}
114116
}

shared/source/os_interface/windows/wddm/wddm_interface.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2023 Intel Corporation
2+
* Copyright (C) 2018-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -161,3 +161,21 @@ bool WddmInterface23::submit(uint64_t commandBuffer, size_t size, void *commandH
161161
UNRECOVERABLE_IF(status != STATUS_SUCCESS);
162162
return status == STATUS_SUCCESS;
163163
}
164+
165+
bool NEO::WddmInterface23::createMonitoredFenceForDirectSubmission(MonitoredFence &monitorFence, OsContextWin &osContext) {
166+
MonitoredFence monitorFenceForResidency{};
167+
auto ret = WddmInterface::createMonitoredFence(monitorFenceForResidency);
168+
auto &residencyController = osContext.getResidencyController();
169+
residencyController.resetMonitoredFenceParams(monitorFenceForResidency.fenceHandle,
170+
const_cast<uint64_t *>(monitorFenceForResidency.cpuAddress),
171+
monitorFenceForResidency.gpuAddress);
172+
173+
auto hwQueue = osContext.getHwQueue();
174+
monitorFence.cpuAddress = reinterpret_cast<uint64_t *>(hwQueue.progressFenceCpuVA);
175+
monitorFence.currentFenceValue = 1u;
176+
monitorFence.lastSubmittedFence = 0u;
177+
monitorFence.gpuAddress = hwQueue.progressFenceGpuVA;
178+
monitorFence.fenceHandle = hwQueue.progressFenceHandle;
179+
180+
return ret;
181+
}

shared/source/os_interface/windows/wddm/wddm_interface.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2022 Intel Corporation
2+
* Copyright (C) 2018-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -27,10 +27,11 @@ class WddmInterface {
2727
virtual void destroyHwQueue(D3DKMT_HANDLE hwQueue) = 0;
2828
virtual bool createMonitoredFence(OsContextWin &osContext) = 0;
2929
MOCKABLE_VIRTUAL bool createMonitoredFence(MonitoredFence &monitorFence);
30-
void destroyMonitorFence(D3DKMT_HANDLE fenceHandle);
30+
MOCKABLE_VIRTUAL void destroyMonitorFence(D3DKMT_HANDLE fenceHandle);
3131
virtual void destroyMonitorFence(MonitoredFence &monitorFence) = 0;
3232
virtual bool hwQueuesSupported() = 0;
3333
virtual bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) = 0;
34+
virtual bool createMonitoredFenceForDirectSubmission(MonitoredFence &monitorFence, OsContextWin &osContext) = 0;
3435
Wddm &wddm;
3536
};
3637

@@ -43,6 +44,9 @@ class WddmInterface20 : public WddmInterface {
4344
void destroyMonitorFence(MonitoredFence &monitorFence) override;
4445
bool hwQueuesSupported() override;
4546
bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) override;
47+
bool createMonitoredFenceForDirectSubmission(MonitoredFence &monitorFence, OsContextWin &osContext) override {
48+
return WddmInterface::createMonitoredFence(monitorFence);
49+
};
4650
};
4751

4852
class WddmInterface23 : public WddmInterface {
@@ -54,5 +58,6 @@ class WddmInterface23 : public WddmInterface {
5458
void destroyMonitorFence(MonitoredFence &monitorFence) override;
5559
bool hwQueuesSupported() override;
5660
bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) override;
61+
bool createMonitoredFenceForDirectSubmission(MonitoredFence &monitorFence, OsContextWin &osContext) override;
5762
};
5863
} // namespace NEO

shared/test/common/mocks/mock_wddm_interface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ class WddmMockInterface : public WddmInterface {
2020
ADDMETHOD_NOBASE_VOIDRETURN(destroyMonitorFence, (MonitoredFence & monitorFence));
2121
ADDMETHOD_NOBASE(hwQueuesSupported, bool, false, ());
2222
ADDMETHOD_NOBASE(submit, bool, true, (uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments));
23+
ADDMETHOD_NOBASE(createMonitoredFenceForDirectSubmission, bool, true, (MonitoredFence & monitorFence, OsContextWin &osContext));
2324
};
2425
} // namespace NEO

shared/test/common/mocks/mock_wddm_interface20.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2021 Intel Corporation
2+
* Copyright (C) 2019-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -20,6 +20,11 @@ class WddmMockInterface20 : public WddmInterface20 {
2020
WddmInterface20::destroyMonitorFence(monitorFence);
2121
}
2222

23+
void destroyMonitorFence(D3DKMT_HANDLE fenceHandle) override {
24+
destroyMonitorFenceCalled++;
25+
WddmInterface::destroyMonitorFence(fenceHandle);
26+
}
27+
2328
bool createMonitoredFence(MonitoredFence &monitorFence) override {
2429
createMonitoredFenceCalled++;
2530
if (createMonitoredFenceCalledFail) {
@@ -28,6 +33,10 @@ class WddmMockInterface20 : public WddmInterface20 {
2833
return WddmInterface::createMonitoredFence(monitorFence);
2934
}
3035

36+
bool createMonitoredFenceForDirectSubmission(MonitoredFence &monitorFence, OsContextWin &osContext) override {
37+
return createMonitoredFence(monitorFence);
38+
};
39+
3140
uint32_t destroyMonitorFenceCalled = 0;
3241
uint32_t createMonitoredFenceCalled = 0;
3342
bool createMonitoredFenceCalledFail = false;

shared/test/unit_test/os_interface/windows/wddm20_tests.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,14 @@ TEST_F(Wddm20WithMockGdiDllTests, GivenCpuValueDifferentThanGpuHangIndicationWhe
346346
EXPECT_FALSE(wddm->isGpuHangDetected(*osContext));
347347
}
348348

349+
TEST_F(Wddm20WithMockGdiDllTests, whencreateMonitoredFenceForDirectSubmissionThenCreateFence) {
350+
MonitoredFence fence{};
351+
wddm->getWddmInterface()->createMonitoredFenceForDirectSubmission(fence, *osContext);
352+
EXPECT_EQ(wddmMockInterface->createMonitoredFenceCalled, 1u);
353+
EXPECT_NE(osContext->getHwQueue().progressFenceHandle, fence.fenceHandle);
354+
wddm->getWddmInterface()->destroyMonitorFence(fence);
355+
}
356+
349357
TEST_F(Wddm20WithMockGdiDllTests, GivenGpuHangIndicationWhenCheckingForGpuHangThenTrueIsReturned) {
350358
auto fenceCpuAddress = osContext->getResidencyController().getMonitoredFence().cpuAddress;
351359
VariableBackup<volatile uint64_t> backupWddmMonitorFence(fenceCpuAddress);

shared/test/unit_test/os_interface/windows/wddm23_tests.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2023 Intel Corporation
2+
* Copyright (C) 2018-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -109,6 +109,14 @@ TEST_F(Wddm23Tests, whenObjectIsDestructedThenDestroyHwQueue) {
109109
EXPECT_EQ(hwQueue, getDestroyHwQueueDataFcn()->hHwQueue);
110110
}
111111

112+
TEST_F(Wddm23Tests, whencreateMonitoredFenceForDirectSubmissionThenObtainHwQueueFenceAndReplaceResidencyControllerWithNewFence) {
113+
EXPECT_EQ(osContext->getResidencyController().getMonitoredFence().fenceHandle, osContext->getHwQueue().progressFenceHandle);
114+
MonitoredFence fence{};
115+
wddm->getWddmInterface()->createMonitoredFenceForDirectSubmission(fence, *osContext);
116+
EXPECT_EQ(osContext->getHwQueue().progressFenceHandle, fence.fenceHandle);
117+
EXPECT_NE(osContext->getResidencyController().getMonitoredFence().fenceHandle, osContext->getHwQueue().progressFenceHandle);
118+
}
119+
112120
TEST_F(Wddm23Tests, givenCmdBufferWhenSubmitCalledThenSetAllRequiredFiledsAndUpdateMonitoredFence) {
113121
uint64_t cmdBufferAddress = 123;
114122
size_t cmdSize = 456;
@@ -196,9 +204,9 @@ TEST_F(Wddm23Tests, givenCurrentPendingFenceValueGreaterThanPendingFenceValueWhe
196204
EXPECT_EQ(1u, wddm->waitOnGPUResult.called);
197205
}
198206

199-
TEST_F(Wddm23Tests, givenDestructionOsContextWinWhenCallingDestroyMonitorFenceThenDoNotCallGdiDestroy) {
207+
TEST_F(Wddm23Tests, givenDestructionOsContextWinWhenCallingDestroyMonitorFenceThenDoNotCallDestroy) {
200208
osContext.reset(nullptr);
201-
EXPECT_EQ(1u, wddmMockInterface->destroyMonitorFenceCalled);
209+
EXPECT_EQ(0u, wddmMockInterface->destroyMonitorFenceCalled);
202210
EXPECT_EQ(0u, getDestroySynchronizationObjectDataFcn()->hSyncObject);
203211
}
204212

0 commit comments

Comments
 (0)