From 498f62d7a078f2da4ecc95f738cad0460374a951 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Tue, 4 Nov 2025 12:18:20 +0000 Subject: [PATCH] fix: Reset direct submission when reinitialize context Resolves: HSD-15018564496 Related-To: NEO-16651 Signed-off-by: Lukasz Jobczyk --- level_zero/core/source/cmdqueue/cmdqueue.cpp | 2 ++ .../source/command_stream/command_stream_receiver.h | 1 + .../command_stream/command_stream_receiver_hw.h | 1 + .../command_stream_receiver_hw_base.inl | 7 +++++++ .../windows/device_command_stream_tests.cpp | 11 +++++++++++ 5 files changed, 22 insertions(+) diff --git a/level_zero/core/source/cmdqueue/cmdqueue.cpp b/level_zero/core/source/cmdqueue/cmdqueue.cpp index a90d55c2dc..9098d32af5 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue.cpp +++ b/level_zero/core/source/cmdqueue/cmdqueue.cpp @@ -255,6 +255,8 @@ CommandQueue *CommandQueue::create(uint32_t productFamily, Device *device, NEO:: auto &osContext = csr->getOsContext(); DriverHandleImp *driverHandleImp = static_cast(device->getDriverHandle()); if (driverHandleImp->powerHint && driverHandleImp->powerHint != osContext.getUmdPowerHintValue()) { + auto lock = csr->obtainUniqueOwnership(); + csr->resetDirectSubmission(); osContext.setUmdPowerHintValue(driverHandleImp->powerHint); osContext.reInitializeContext(); } diff --git a/shared/source/command_stream/command_stream_receiver.h b/shared/source/command_stream/command_stream_receiver.h index a99f575d2a..6509c80029 100644 --- a/shared/source/command_stream/command_stream_receiver.h +++ b/shared/source/command_stream/command_stream_receiver.h @@ -380,6 +380,7 @@ class CommandStreamReceiver : NEO::NonCopyableAndNonMovableClass { } virtual void stopDirectSubmission(bool blocking, bool needsLock) {} + virtual void resetDirectSubmission(){}; virtual QueueThrottle getLastDirectSubmissionThrottle() = 0; diff --git a/shared/source/command_stream/command_stream_receiver_hw.h b/shared/source/command_stream/command_stream_receiver_hw.h index 82ecdca12c..78723db447 100644 --- a/shared/source/command_stream/command_stream_receiver_hw.h +++ b/shared/source/command_stream/command_stream_receiver_hw.h @@ -159,6 +159,7 @@ class CommandStreamReceiverHw : public CommandStreamReceiver { uint32_t getDirectSubmissionRelaxedOrderingQueueDepth() const override; void stopDirectSubmission(bool blocking, bool needsLock) override; + void resetDirectSubmission() override; QueueThrottle getLastDirectSubmissionThrottle() override; diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index 52eee23165..9644791d62 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -1430,6 +1430,13 @@ inline void CommandStreamReceiverHw::stopDirectSubmission(bool blocki } } +template +inline void CommandStreamReceiverHw::resetDirectSubmission() { + this->unregisterDirectSubmissionFromController(); + this->blitterDirectSubmission.reset(); + this->directSubmission.reset(); +} + template inline QueueThrottle CommandStreamReceiverHw::getLastDirectSubmissionThrottle() { if (this->isAnyDirectSubmissionEnabled()) { diff --git a/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp b/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp index 156d62ed82..0cac7a050d 100644 --- a/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp @@ -996,6 +996,17 @@ struct MockWddmDrmDirectSubmissionDispatchCommandBuffer : public MockWddmDirectS uint32_t lastNotifyKmdParamValue = false; }; +HWTEST_TEMPLATED_F(WddmCommandStreamMockGdiTest, givenCsrWhenResetDirectSubmissionThenObjectDeleted) { + using Dispatcher = RenderDispatcher; + using MockSubmission = MockWddmDrmDirectSubmissionDispatchCommandBuffer; + auto mockCsr = static_cast *>(csr); + mockCsr->directSubmission = std::make_unique(*device->getDefaultEngine().commandStreamReceiver); + + mockCsr->resetDirectSubmission(); + + EXPECT_EQ(mockCsr->directSubmission.get(), nullptr); +} + HWTEST_TEMPLATED_F(WddmCommandStreamMockGdiTest, givenCsrWhenFlushMonitorFenceThenFlushMonitorFenceOnDirectSubmission) { using Dispatcher = RenderDispatcher; using MockSubmission = MockWddmDrmDirectSubmissionDispatchCommandBuffer;