diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index bac7d0587f..2f747c98ba 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -485,6 +485,7 @@ DECLARE_DEBUG_VARIABLE(bool, DirectSubmissionPrintBuffers, false, "Print address DECLARE_DEBUG_VARIABLE(int32_t, WaitForPagingFenceInController, -1, "Instead of waiting for paging fence on user thread, program additional semaphore which will be signaled by direct submission controller when paging fence reaches required value -1: default, 0 - disable, 1 - enable.") DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionControllerIdleDetection, -1, "Terminate direct submission only if CSR is idle. -1: default, 0 - disable, 1 - enable.") DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionControllerContextGroupIdleDetection, -1, "Terminate direct submission only if all CSRs in group are idle. -1: default, 0 - disable, 1 - enable.") +DECLARE_DEBUG_VARIABLE(int32_t, DirectSubmissionInitialSemaphoreValue, -1, "-1: default, >0: initial semaphore counter value") /*FEATURE FLAGS*/ DECLARE_DEBUG_VARIABLE(bool, RegisterPageFaultHandlerOnMigration, false, "Register handler on migration to GPU when current is not from pagefault manager") DECLARE_DEBUG_VARIABLE(bool, EnableNV12, true, "Enables NV12 extension") diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index 15d3f63ca3..fcecb3c34e 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -195,6 +195,8 @@ class DirectSubmissionHw { virtual bool isCompleted(uint32_t ringBufferIndex) = 0; void updateRelaxedOrderingQueueSize(uint32_t newSize); + uint32_t getInitialSemaphoreValue() const; + void handleSemaphoreDataOverflow(); virtual void makeGlobalFenceAlwaysResident(){}; struct RingBufferUse { diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index e65517f17d..670ae01326 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -87,6 +87,8 @@ DirectSubmissionHw::DirectSubmissionHw(const DirectSubmis if (Dispatcher::isCopy() && relaxedOrderingEnabled) { relaxedOrderingEnabled = (debugManager.flags.DirectSubmissionRelaxedOrderingForBcs.get() != 0); } + + currentQueueWorkCount = getInitialSemaphoreValue(); } template @@ -520,8 +522,27 @@ void DirectSubmissionHw::dispatchUllsState() { } } +template +uint32_t DirectSubmissionHw::getInitialSemaphoreValue() const { + return debugManager.flags.DirectSubmissionInitialSemaphoreValue.getIfNotDefault(1); +} + +template +void DirectSubmissionHw::handleSemaphoreDataOverflow() { + stopRingBuffer(true); + currentQueueWorkCount = 0; + unblockGpu(); // set gpu allocation to 0 + + currentQueueWorkCount = getInitialSemaphoreValue(); +} + template bool DirectSubmissionHw::dispatchCommandBuffer(BatchBuffer &batchBuffer, FlushStampTracker &flushStamp) { + // Handle overflow earlier (uint32_max - 3), in case of additional ring starts/stops + if ((currentQueueWorkCount + 1) >= (std::numeric_limits::max() - 3)) { + handleSemaphoreDataOverflow(); + } + this->handleRingRestartForUllsLightResidency(batchBuffer.allocationsForResidency); lastSubmittedThrottle = batchBuffer.throttle; diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 3e11086c49..3007a63469 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -676,4 +676,5 @@ ForceTotalWMTPDataSize = -1 CopyLockedMemoryBeforeWrite = 0 SplitBcsPerEngineMaxSize = -1 EnableUsmPoolResidencyTracking = -1 +DirectSubmissionInitialSemaphoreValue = -1 # Please don't edit below this line