diff --git a/shared/source/direct_submission/windows/wddm_direct_submission.inl b/shared/source/direct_submission/windows/wddm_direct_submission.inl index 4a993b0c3b..b7a7cb3db1 100644 --- a/shared/source/direct_submission/windows/wddm_direct_submission.inl +++ b/shared/source/direct_submission/windows/wddm_direct_submission.inl @@ -35,6 +35,12 @@ WddmDirectSubmission::WddmDirectSubmission(const DirectSu perfLogResidencyVariadicLog(wddm->getResidencyLogger(), "Starting Wddm ULLS. Placement ring buffer: %d semaphore %d\n", DebugManager.flags.DirectSubmissionBufferPlacement.get(), DebugManager.flags.DirectSubmissionSemaphorePlacement.get()); + + this->completionFenceAllocation = inputParams.completionFenceAllocation; + UNRECOVERABLE_IF(!this->completionFenceAllocation); + if (this->miMemFenceRequired) { + this->gpuVaForAdditionalSynchronizationWA = this->completionFenceAllocation->getGpuAddress() + 8u; + } } template diff --git a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp index e6f5b1ab7c..cc5a87b87c 100644 --- a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp +++ b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp @@ -723,6 +723,7 @@ HWTEST_F(CommandStreamReceiverTest, whenDirectSubmissionDisabledThenExpectNoFeat PreemptionMode::ThreadGroup, pDevice->getDeviceBitfield()))); osContext->setDefaultContext(true); csr.setupContext(*osContext); + csr.initializeTagAllocation(); bool ret = csr.initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr.isDirectSubmissionEnabled()); @@ -849,6 +850,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionControllerEnabledWhenIni hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); @@ -878,6 +880,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionControllerDisabledWhenIn hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -902,6 +905,7 @@ HWTEST_F(InitDirectSubmissionTest, givenSetCsrFlagSetWhenInitDirectSubmissionThe hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -922,6 +926,7 @@ HWTEST_F(InitDirectSubmissionTest, whenDirectSubmissionEnabledOnRcsThenExpectFea hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -955,6 +960,7 @@ HWTEST_F(InitDirectSubmissionTest, whenCallInitDirectSubmissionAgainThenItIsNotR hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); auto directSubmission = csr->directSubmission.get(); EXPECT_TRUE(ret); @@ -981,6 +987,7 @@ HWTEST_F(InitDirectSubmissionTest, whenCallInitDirectSubmissionThenObtainLock) { hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); csr->initDirectSubmission(); EXPECT_EQ(1u, csr->recursiveLockCounter); @@ -998,6 +1005,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionEnabledWhenPlatformNotSu hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1018,6 +1026,7 @@ HWTEST_F(InitDirectSubmissionTest, whenDirectSubmissionEnabledOnBcsThenExpectFea hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1039,6 +1048,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionEnabledWhenPlatformNotSu hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1061,6 +1071,7 @@ HWTEST_F(InitDirectSubmissionTest, givenLowPriorityContextWhenDirectSubmissionDi hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1080,6 +1091,7 @@ HWTEST_F(InitDirectSubmissionTest, givenLowPriorityContextWhenDirectSubmissionEn hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useLowPriority = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -1101,6 +1113,7 @@ HWTEST_F(InitDirectSubmissionTest, givenInternalContextWhenDirectSubmissionDisab hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1121,6 +1134,7 @@ HWTEST_F(InitDirectSubmissionTest, givenInternalContextWhenDirectSubmissionEnabl hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -1142,6 +1156,7 @@ HWTEST_F(InitDirectSubmissionTest, givenRootDeviceContextWhenDirectSubmissionDis hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1162,6 +1177,7 @@ HWTEST_F(InitDirectSubmissionTest, givenRootDeviceContextWhenDirectSubmissionEna hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -1183,6 +1199,7 @@ HWTEST_F(InitDirectSubmissionTest, givenNonDefaultContextWhenDirectSubmissionDis hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); @@ -1204,6 +1221,7 @@ HWTEST_F(InitDirectSubmissionTest, givenNonDefaultContextContextWhenDirectSubmis hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_TRUE(csr->isDirectSubmissionEnabled()); @@ -1229,6 +1247,7 @@ HWTEST_F(InitDirectSubmissionTest, GivenBlitterOverrideEnabledWhenBlitterIsNonDe hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].submitOnInit = false; csr->setupContext(*osContext); + csr->initializeTagAllocation(); bool ret = csr->initDirectSubmission(); EXPECT_TRUE(ret); EXPECT_FALSE(csr->isDirectSubmissionEnabled()); diff --git a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp index 9b76c1f3ac..07213de7f8 100644 --- a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp @@ -63,7 +63,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenDirectIsInitializedAndStartedThe EXPECT_NE(nullptr, wddmDirectSubmission->semaphores); auto &gfxCoreHelper = device->getGfxCoreHelper(); - size_t expectedAllocationsCnt = 3; + size_t expectedAllocationsCnt = 4; if (gfxCoreHelper.isRelaxedOrderingSupported()) { expectedAllocationsCnt += 2; } @@ -100,7 +100,7 @@ HWTEST_F(WddmDirectSubmissionNoPreemptionTest, givenWddmWhenDirectIsInitializedA EXPECT_NE(nullptr, wddmDirectSubmission->semaphores); auto &gfxCoreHelper = device->getGfxCoreHelper(); - size_t expectedAllocationsCnt = 3; + size_t expectedAllocationsCnt = 4; if (gfxCoreHelper.isRelaxedOrderingSupported()) { expectedAllocationsCnt += 2; } @@ -143,7 +143,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenAllocateOsResourcesThenExpectRin bool ret = wddmDirectSubmission.allocateResources(); EXPECT_TRUE(ret); auto &gfxCoreHelper = device->getGfxCoreHelper(); - size_t expectedAllocationsCnt = 3; + size_t expectedAllocationsCnt = 4; if (gfxCoreHelper.isRelaxedOrderingSupported()) { expectedAllocationsCnt += 2; } @@ -187,7 +187,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenAllocateOsResourcesResidencyFail bool ret = wddmDirectSubmission.allocateResources(); EXPECT_FALSE(ret); auto &gfxCoreHelper = device->getGfxCoreHelper(); - size_t expectedAllocationsCnt = 3; + size_t expectedAllocationsCnt = 4; if (gfxCoreHelper.isRelaxedOrderingSupported()) { expectedAllocationsCnt += 2; } @@ -528,3 +528,14 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmResidencyEnabledWhenSubmitToGpuThenS EXPECT_EQ(5u, NEO::IoFunctions::mockVfptrinfCalled); EXPECT_EQ(0u, NEO::IoFunctions::mockFcloseCalled); } + +HWTEST_F(WddmDirectSubmissionTest, givenMiMemFenceRequiredThenGpuVaForAdditionalSynchronizationWAIsSet) { + MockWddmDirectSubmission> wddmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + + ASSERT_NE(nullptr, wddmDirectSubmission.completionFenceAllocation); + if (wddmDirectSubmission.miMemFenceRequired) { + EXPECT_EQ(wddmDirectSubmission.completionFenceAllocation->getGpuAddress() + 8u, wddmDirectSubmission.gpuVaForAdditionalSynchronizationWA); + } else { + EXPECT_EQ(0u, wddmDirectSubmission.gpuVaForAdditionalSynchronizationWA); + } +} diff --git a/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h b/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h index 646734a4c3..1b9e65f0fa 100644 --- a/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h +++ b/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h @@ -17,6 +17,7 @@ struct MockWddmDirectSubmission : public WddmDirectSubmission