diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index 2f0ab2615b..3b60f3212d 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -615,16 +615,23 @@ cl_int CommandQueue::enqueueReleaseSharedObjects(cl_uint numObjects, const cl_me return CL_INVALID_VALUE; } + bool isImageReleased = false; for (unsigned int object = 0; object < numObjects; object++) { auto memObject = castToObject(memObjects[object]); if (memObject == nullptr || memObject->peekSharingHandler() == nullptr) { return CL_INVALID_MEM_OBJECT; } + isImageReleased |= memObject->getMultiGraphicsAllocation().getAllocationType() == AllocationType::sharedImage; memObject->peekSharingHandler()->release(memObject, getDevice().getRootDeviceIndex()); DEBUG_BREAK_IF(memObject->acquireCount <= 0); memObject->acquireCount--; } + + if (isImageReleased && this->getGpgpuCommandStreamReceiver().isDirectSubmissionEnabled()) { + this->getGpgpuCommandStreamReceiver().sendRenderStateCacheFlush(); + } + auto status = enqueueMarkerWithWaitList( numEventsInWaitList, eventWaitList, diff --git a/opencl/test/unit_test/command_queue/command_queue_tests.cpp b/opencl/test/unit_test/command_queue/command_queue_tests.cpp index e7e08615ab..b89ec4601e 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests.cpp @@ -1329,13 +1329,15 @@ class MockSharingHandler : public SharingHandler { } }; -TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) { +using CommandQueueTests = ::testing::Test; +HWTEST_F(CommandQueueTests, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerThenReturnSuccess) { MockContext context; MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); MockSharingHandler *mockSharingHandler = new MockSharingHandler; auto image = std::unique_ptr(ImageHelper::create(&context)); image->setSharingHandler(mockSharingHandler); + image->getGraphicsAllocation(0u)->setAllocationType(AllocationType::sharedImage); cl_mem memObject = image.get(); cl_uint numObjects = 1; @@ -1344,8 +1346,39 @@ TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandler cl_int result = cmdQ.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0); EXPECT_EQ(result, CL_SUCCESS); + auto ultCsr = static_cast *>(&cmdQ.getGpgpuCommandStreamReceiver()); + EXPECT_FALSE(ultCsr->renderStateCacheFlushed); + result = cmdQ.enqueueReleaseSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0); EXPECT_EQ(result, CL_SUCCESS); + EXPECT_FALSE(ultCsr->renderStateCacheFlushed); +} + +HWTEST_F(CommandQueueTests, givenDirectSubmissionAndSharedImageWhenReleasingSharedObjectThenFlushRenderStateCache) { + MockContext context; + MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); + MockSharingHandler *mockSharingHandler = new MockSharingHandler; + + auto image = std::unique_ptr(ImageHelper::create(&context)); + image->setSharingHandler(mockSharingHandler); + image->getGraphicsAllocation(0u)->setAllocationType(AllocationType::sharedImage); + + cl_mem memObject = image.get(); + cl_uint numObjects = 1; + cl_mem *memObjects = &memObject; + + cl_int result = cmdQ.enqueueAcquireSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0); + EXPECT_EQ(result, CL_SUCCESS); + + auto ultCsr = static_cast *>(&cmdQ.getGpgpuCommandStreamReceiver()); + ultCsr->directSubmissionAvailable = true; + ultCsr->callBaseSendRenderStateCacheFlush = false; + ultCsr->flushReturnValue = SubmissionStatus::success; + EXPECT_FALSE(ultCsr->renderStateCacheFlushed); + + result = cmdQ.enqueueReleaseSharedObjects(numObjects, memObjects, 0, nullptr, nullptr, 0); + EXPECT_EQ(result, CL_SUCCESS); + EXPECT_TRUE(ultCsr->renderStateCacheFlushed); } TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandlerWithEventThenReturnSuccess) { @@ -1378,7 +1411,7 @@ TEST(CommandQueue, givenEnqueuesForSharedObjectsWithImageWhenUsingSharingHandler TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenReturnProperError) { MockContext context; - MockCommandQueue cmdQ(&context, nullptr, 0, false); + MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); cl_uint numObjects = 1; cl_mem *memObjects = nullptr; @@ -1418,7 +1451,7 @@ TEST(CommandQueue, givenEnqueueAcquireSharedObjectsWhenIncorrectArgumentsThenRet TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSuccess) { MockContext context; - MockCommandQueue cmdQ(&context, nullptr, 0, false); + MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); cl_uint numObjects = 0; cl_mem *memObjects = nullptr; @@ -1429,7 +1462,7 @@ TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenNoObjectsThenReturnSucces TEST(CommandQueue, givenEnqueueReleaseSharedObjectsWhenIncorrectArgumentsThenReturnProperError) { MockContext context; - MockCommandQueue cmdQ(&context, nullptr, 0, false); + MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); cl_uint numObjects = 1; cl_mem *memObjects = nullptr; @@ -1560,7 +1593,7 @@ TEST(CommandQueuePropertiesTests, whenGetEngineIsCalledThenQueueEngineIsReturned TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessReturned) { MockContext context; - MockCommandQueue cmdQ(&context, nullptr, 0, false); + MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); cl_int result = cmdQ.enqueueResourceBarrier( nullptr, @@ -1572,7 +1605,7 @@ TEST(CommandQueue, GivenCommandQueueWhenEnqueueResourceBarrierCalledThenSuccessR TEST(CommandQueue, GivenCommandQueueWhenCheckingIfIsCacheFlushCommandCalledThenFalseReturned) { MockContext context; - MockCommandQueue cmdQ(&context, nullptr, 0, false); + MockCommandQueue cmdQ(&context, context.getDevice(0), 0, false); bool isCommandCacheFlush = cmdQ.isCacheFlushCommand(0u); EXPECT_FALSE(isCommandCacheFlush); diff --git a/shared/test/common/libult/ult_command_stream_receiver.h b/shared/test/common/libult/ult_command_stream_receiver.h index 8677c46a8f..28f37f2798 100644 --- a/shared/test/common/libult/ult_command_stream_receiver.h +++ b/shared/test/common/libult/ult_command_stream_receiver.h @@ -448,6 +448,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw, publ } SubmissionStatus sendRenderStateCacheFlush() override { + this->renderStateCacheFlushed = true; if (callBaseSendRenderStateCacheFlush) { return BaseClass::sendRenderStateCacheFlush(); } @@ -508,6 +509,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw, publ CommandStreamReceiverType commandStreamReceiverType = CommandStreamReceiverType::hardware; std::atomic downloadAllocationsCalledCount = 0; + bool renderStateCacheFlushed = false; bool cpuCopyForHostPtrSurfaceAllowed = false; bool createPageTableManagerCalled = false; bool recordFlusheBatchBuffer = false;