Skip to content

Commit 8c8bb23

Browse files
fix: update completion fence for previous ring during switch
Related-To: NEO-9330 Signed-off-by: Maciej Plewka <[email protected]>
1 parent eee0718 commit 8c8bb23

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

shared/source/direct_submission/windows/wddm_direct_submission.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class WddmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
3636
void handleStopRingBuffer() override;
3737
uint64_t updateTagValue(bool requireMonitorFence) override;
3838
bool dispatchMonitorFenceRequired(bool requireMonitorFence) override;
39-
uint64_t updateTagValueImpl();
39+
MOCKABLE_VIRTUAL uint64_t updateTagValueImpl(uint32_t completionBufferIndex);
4040
void getTagAddressValue(TagData &tagData) override;
4141
bool isCompleted(uint32_t ringBufferIndex) override;
4242
MOCKABLE_VIRTUAL void updateMonitorFenceValueForResidencyList(ResidencyContainer *allocationsForResidency);

shared/source/direct_submission/windows/wddm_direct_submission.inl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ inline void WddmDirectSubmission<GfxFamily, Dispatcher>::flushMonitorFence() {
7575
this->unblockGpu();
7676
this->currentQueueWorkCount++;
7777

78-
this->updateTagValueImpl();
78+
this->updateTagValueImpl(this->currentRingBuffer);
7979
}
8080

8181
template <typename GfxFamily, typename Dispatcher>
@@ -124,15 +124,15 @@ bool WddmDirectSubmission<GfxFamily, Dispatcher>::handleResidency() {
124124
template <typename GfxFamily, typename Dispatcher>
125125
void WddmDirectSubmission<GfxFamily, Dispatcher>::handleStopRingBuffer() {
126126
if (this->disableMonitorFence) {
127-
updateTagValueImpl();
127+
updateTagValueImpl(this->currentRingBuffer);
128128
}
129129
}
130130

131131
template <typename GfxFamily, typename Dispatcher>
132132
void WddmDirectSubmission<GfxFamily, Dispatcher>::handleSwitchRingBuffers(ResidencyContainer *allocationsForResidency) {
133133
if (this->disableMonitorFence) {
134134
auto lock = osContextWin->getResidencyController().acquireLock();
135-
updateTagValueImpl();
135+
updateTagValueImpl(this->previousRingBuffer);
136136
updateMonitorFenceValueForResidencyList(allocationsForResidency);
137137
}
138138
}
@@ -150,7 +150,7 @@ uint64_t WddmDirectSubmission<GfxFamily, Dispatcher>::updateTagValue(bool requir
150150
}
151151

152152
if (requireMonitorFence) {
153-
return this->updateTagValueImpl();
153+
return this->updateTagValueImpl(this->currentRingBuffer);
154154
}
155155
MonitoredFence &currentFence = osContextWin->getResidencyController().getMonitoredFence();
156156
return currentFence.currentFenceValue;
@@ -162,12 +162,12 @@ bool WddmDirectSubmission<GfxFamily, Dispatcher>::dispatchMonitorFenceRequired(b
162162
}
163163

164164
template <typename GfxFamily, typename Dispatcher>
165-
uint64_t WddmDirectSubmission<GfxFamily, Dispatcher>::updateTagValueImpl() {
165+
uint64_t WddmDirectSubmission<GfxFamily, Dispatcher>::updateTagValueImpl(uint32_t completionBufferIndex) {
166166
MonitoredFence &currentFence = osContextWin->getResidencyController().getMonitoredFence();
167167

168168
currentFence.lastSubmittedFence = currentFence.currentFenceValue;
169169
currentFence.currentFenceValue++;
170-
this->ringBuffers[this->currentRingBuffer].completionFence = currentFence.lastSubmittedFence;
170+
this->ringBuffers[completionBufferIndex].completionFence = currentFence.lastSubmittedFence;
171171

172172
return currentFence.lastSubmittedFence;
173173
}

shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,4 +1049,14 @@ HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionWhenSwitchingRingBuffers
10491049
EXPECT_FALSE(tryLock);
10501050
wddmDirectSubmission.lockInTesting = false;
10511051
th.join();
1052+
}
1053+
1054+
HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionWhenSwitchingRingBuffersThenPrevRingIndexPassedForCompletionUpdate) {
1055+
using Dispatcher = RenderDispatcher<FamilyType>;
1056+
1057+
MockWddmDirectSubmission<FamilyType, Dispatcher> wddmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
1058+
wddmDirectSubmission.currentRingBuffer = 0;
1059+
wddmDirectSubmission.previousRingBuffer = 1;
1060+
wddmDirectSubmission.handleSwitchRingBuffers(nullptr);
1061+
EXPECT_EQ(wddmDirectSubmission.ringBufferForCompletionFence, wddmDirectSubmission.previousRingBuffer);
10521062
}

shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct MockWddmDirectSubmission : public WddmDirectSubmission<GfxFamily, Dispatc
4040
using BaseClass::lastSubmittedThrottle;
4141
using BaseClass::miMemFenceRequired;
4242
using BaseClass::osContextWin;
43+
using BaseClass::previousRingBuffer;
4344
using BaseClass::ringBuffers;
4445
using BaseClass::ringCommandStream;
4546
using BaseClass::ringFence;
@@ -58,7 +59,11 @@ struct MockWddmDirectSubmission : public WddmDirectSubmission<GfxFamily, Dispatc
5859
updateMonitorFenceValueForResidencyListCalled++;
5960
BaseClass::updateMonitorFenceValueForResidencyList(allocationsForResidency);
6061
}
61-
62+
uint64_t updateTagValueImpl(uint32_t completionBufferIndex) override {
63+
ringBufferForCompletionFence = completionBufferIndex;
64+
return BaseClass::updateTagValueImpl(completionBufferIndex);
65+
}
6266
uint32_t updateMonitorFenceValueForResidencyListCalled = 0u;
67+
uint32_t ringBufferForCompletionFence = 0u;
6368
};
6469
} // namespace NEO

0 commit comments

Comments
 (0)