Skip to content

Commit f6bf19f

Browse files
fix: Update completion fence for all switched ring buffers
Related-To: GSD-4966 Source: 13b0fb5 Signed-off-by: Maciej Plewka <maciej.plewka@intel.com>
1 parent 543dd62 commit f6bf19f

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

shared/source/direct_submission/linux/drm_direct_submission.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,9 @@ void DrmDirectSubmission<GfxFamily, Dispatcher>::handleSwitchRingBuffers() {
230230
if (this->disableMonitorFence) {
231231
this->currentTagData.tagValue++;
232232

233-
bool updateCompletionFences = this->ringStart;
234-
if (DebugManager.flags.EnableRingSwitchTagUpdateWa.get() == 0) {
235-
updateCompletionFences = true;
233+
bool updateCompletionFences = true;
234+
if (DebugManager.flags.EnableRingSwitchTagUpdateWa.get() != -1) {
235+
updateCompletionFences = !DebugManager.flags.EnableRingSwitchTagUpdateWa.get() || this->ringStart;
236236
}
237237

238238
if (updateCompletionFences) {

shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ struct MockDrmDirectSubmission : public DrmDirectSubmission<GfxFamily, Dispatche
8080
using BaseClass::getTagAddressValue;
8181
using BaseClass::handleNewResourcesSubmission;
8282
using BaseClass::handleResidency;
83+
using BaseClass::handleSwitchRingBuffers;
8384
using BaseClass::isCompleted;
8485
using BaseClass::isNewResourceHandleNeeded;
8586
using BaseClass::miMemFenceRequired;
@@ -882,3 +883,57 @@ HWTEST_F(DrmDirectSubmissionTest, givenBlitterDispatcherAndMultiTileDeviceWhenCr
882883
bool ret = directSubmission.allocateResources();
883884
EXPECT_TRUE(ret);
884885
}
886+
HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenHandleSwitchRingBufferCalledThenPrevRingBufferHasUpdatedFenceValue) {
887+
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
888+
auto prevCompletionFenceVal = 1u;
889+
auto prevRingBufferIndex = 0u;
890+
auto newCompletionFenceValue = 10u;
891+
drmDirectSubmission.currentTagData.tagValue = newCompletionFenceValue;
892+
drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence = prevCompletionFenceVal;
893+
drmDirectSubmission.handleSwitchRingBuffers();
894+
EXPECT_EQ(drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence, newCompletionFenceValue + 1);
895+
}
896+
HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenEnableRingSwitchTagUpdateWaEnabledAndRingNotStartedThenCompletionFenceIsNotUpdated) {
897+
DebugManagerStateRestore dbgRestorer;
898+
DebugManager.flags.EnableRingSwitchTagUpdateWa.set(1);
899+
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
900+
auto prevCompletionFenceVal = 1u;
901+
auto prevRingBufferIndex = 0u;
902+
auto newCompletionFenceValue = 10u;
903+
904+
drmDirectSubmission.ringStart = false;
905+
906+
drmDirectSubmission.currentTagData.tagValue = newCompletionFenceValue;
907+
drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence = prevCompletionFenceVal;
908+
drmDirectSubmission.handleSwitchRingBuffers();
909+
EXPECT_EQ(drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence, prevCompletionFenceVal);
910+
}
911+
HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenEnableRingSwitchTagUpdateWaEnabledAndRingStartedThenCompletionFenceIsUpdated) {
912+
DebugManagerStateRestore dbgRestorer;
913+
DebugManager.flags.EnableRingSwitchTagUpdateWa.set(1);
914+
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
915+
auto prevCompletionFenceVal = 1u;
916+
auto prevRingBufferIndex = 0u;
917+
auto newCompletionFenceValue = 10u;
918+
919+
drmDirectSubmission.ringStart = true;
920+
921+
drmDirectSubmission.currentTagData.tagValue = newCompletionFenceValue;
922+
drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence = prevCompletionFenceVal;
923+
drmDirectSubmission.handleSwitchRingBuffers();
924+
EXPECT_EQ(drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence, newCompletionFenceValue + 1);
925+
drmDirectSubmission.ringStart = false;
926+
}
927+
HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenEnableRingSwitchTagUpdateWaDisabledThenCompletionFenceIsUpdated) {
928+
DebugManagerStateRestore dbgRestorer;
929+
DebugManager.flags.EnableRingSwitchTagUpdateWa.set(0);
930+
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
931+
auto prevCompletionFenceVal = 1u;
932+
auto prevRingBufferIndex = 0u;
933+
auto newCompletionFenceValue = 10u;
934+
935+
drmDirectSubmission.currentTagData.tagValue = newCompletionFenceValue;
936+
drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence = prevCompletionFenceVal;
937+
drmDirectSubmission.handleSwitchRingBuffers();
938+
EXPECT_EQ(drmDirectSubmission.ringBuffers[prevRingBufferIndex].completionFence, newCompletionFenceValue + 1);
939+
}

0 commit comments

Comments
 (0)