From a2398e193b617be74363ccc9b76d71efdc7b3913 Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Mon, 17 Jun 2019 14:32:54 +0200 Subject: [PATCH] Pass Blocking enqueue flag to Blit CSR Change-Id: I2dcdd27eef338d3aca60a273bce15e5382673a93 Signed-off-by: Dunajski, Bartosz Related-To: NEO-3020 --- runtime/command_queue/command_queue.cpp | 4 +-- runtime/command_queue/command_queue.h | 2 +- runtime/command_queue/enqueue_read_buffer.h | 2 +- runtime/command_queue/enqueue_write_buffer.h | 2 +- unit_tests/mem_obj/buffer_tests.cpp | 31 ++++++++++++++++++++ 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/runtime/command_queue/command_queue.cpp b/runtime/command_queue/command_queue.cpp index a050c5cd2c..7f374b8aeb 100644 --- a/runtime/command_queue/command_queue.cpp +++ b/runtime/command_queue/command_queue.cpp @@ -584,7 +584,7 @@ bool CommandQueue::bufferCpuCopyAllowed(Buffer *buffer, cl_command_type commandT buffer->isReadWriteOnCpuAllowed(blocking, numEventsInWaitList, ptr, size); } -cl_int CommandQueue::enqueueReadWriteBufferWithBlitTransfer(cl_command_type commandType, Buffer *buffer, +cl_int CommandQueue::enqueueReadWriteBufferWithBlitTransfer(cl_command_type commandType, Buffer *buffer, bool blocking, size_t offset, size_t size, void *ptr, cl_uint numEventsInWaitList, const cl_event *eventWaitList, cl_event *event) { auto blitCommandStreamReceiver = context->getCommandStreamReceiverForBlitOperation(*buffer); @@ -600,7 +600,7 @@ cl_int CommandQueue::enqueueReadWriteBufferWithBlitTransfer(cl_command_type comm auto copyDirection = (CL_COMMAND_WRITE_BUFFER == commandType) ? BlitterConstants::BlitWithHostPtrDirection::FromHostPtr : BlitterConstants::BlitWithHostPtrDirection::ToHostPtr; - blitCommandStreamReceiver->blitWithHostPtr(*buffer, ptr, true, offset, size, copyDirection, csrDependencies, *timestampPacketContainer); + blitCommandStreamReceiver->blitWithHostPtr(*buffer, ptr, blocking, offset, size, copyDirection, csrDependencies, *timestampPacketContainer); return CL_SUCCESS; } diff --git a/runtime/command_queue/command_queue.h b/runtime/command_queue/command_queue.h index 0fa9c8c58c..76823be796 100644 --- a/runtime/command_queue/command_queue.h +++ b/runtime/command_queue/command_queue.h @@ -439,7 +439,7 @@ class CommandQueue : public BaseObject<_cl_command_queue> { void *enqueueMapMemObject(TransferProperties &transferProperties, EventsRequest &eventsRequest, cl_int &errcodeRet); cl_int enqueueUnmapMemObject(TransferProperties &transferProperties, EventsRequest &eventsRequest); - cl_int enqueueReadWriteBufferWithBlitTransfer(cl_command_type commandType, Buffer *buffer, + cl_int enqueueReadWriteBufferWithBlitTransfer(cl_command_type commandType, Buffer *buffer, bool blocking, size_t offset, size_t size, void *ptr, cl_uint numEventsInWaitList, const cl_event *eventWaitList, cl_event *event); diff --git a/runtime/command_queue/enqueue_read_buffer.h b/runtime/command_queue/enqueue_read_buffer.h index d320d9622a..4874f7f7c2 100644 --- a/runtime/command_queue/enqueue_read_buffer.h +++ b/runtime/command_queue/enqueue_read_buffer.h @@ -55,7 +55,7 @@ cl_int CommandQueueHw::enqueueReadBuffer( return enqueueMarkerForReadWriteOperation(buffer, ptr, CL_COMMAND_READ_BUFFER, blockingRead, numEventsInWaitList, eventWaitList, event); } else if (blitOperationsSupported) { - return enqueueReadWriteBufferWithBlitTransfer(CL_COMMAND_READ_BUFFER, buffer, offset, size, ptr, + return enqueueReadWriteBufferWithBlitTransfer(CL_COMMAND_READ_BUFFER, buffer, !!blockingRead, offset, size, ptr, numEventsInWaitList, eventWaitList, event); } diff --git a/runtime/command_queue/enqueue_write_buffer.h b/runtime/command_queue/enqueue_write_buffer.h index 33817d0132..48e8e628f7 100644 --- a/runtime/command_queue/enqueue_write_buffer.h +++ b/runtime/command_queue/enqueue_write_buffer.h @@ -50,7 +50,7 @@ cl_int CommandQueueHw::enqueueWriteBuffer( return enqueueMarkerForReadWriteOperation(buffer, const_cast(ptr), CL_COMMAND_WRITE_BUFFER, blockingWrite, numEventsInWaitList, eventWaitList, event); } else if (blitOperationsSupported) { - return enqueueReadWriteBufferWithBlitTransfer(CL_COMMAND_WRITE_BUFFER, buffer, offset, size, const_cast(ptr), + return enqueueReadWriteBufferWithBlitTransfer(CL_COMMAND_WRITE_BUFFER, buffer, !!blockingWrite, offset, size, const_cast(ptr), numEventsInWaitList, eventWaitList, event); } diff --git a/unit_tests/mem_obj/buffer_tests.cpp b/unit_tests/mem_obj/buffer_tests.cpp index a207175e15..ccd7441de9 100644 --- a/unit_tests/mem_obj/buffer_tests.cpp +++ b/unit_tests/mem_obj/buffer_tests.cpp @@ -805,6 +805,37 @@ HWTEST_F(BcsBufferTests, givenOutputTimestampPacketWhenBlitCalledThenProgramMiFl EXPECT_TRUE(blitCmdFound); } +HWTEST_F(BcsBufferTests, givenBlockingEnqueueWhenUsingBcsThenCallWait) { + class MyMockCsr : public UltCommandStreamReceiver { + public: + using UltCommandStreamReceiver::UltCommandStreamReceiver; + + void waitForTaskCountWithKmdNotifyFallback(uint32_t taskCountToWait, FlushStamp flushStampToWait, + bool useQuickKmdSleep, bool forcePowerSavingMode) override { + waitForTaskCountWithKmdNotifyFallbackCalled++; + } + + uint32_t waitForTaskCountWithKmdNotifyFallbackCalled = 0; + }; + + auto myMockCsr = new MyMockCsr(*device->getExecutionEnvironment()); + myMockCsr->initializeTagAllocation(); + myMockCsr->setupContext(*bcsMockContext->bcsOsContext); + bcsMockContext->bcsCsr.reset(myMockCsr); + + auto cmdQ = clUniquePtr(new MockCommandQueueHw(bcsMockContext.get(), device.get(), nullptr)); + cl_int retVal = CL_SUCCESS; + + auto buffer = clUniquePtr(Buffer::create(bcsMockContext.get(), CL_MEM_READ_WRITE, 1, nullptr, retVal)); + buffer->forceDisallowCPUCopy = true; + void *hostPtr = reinterpret_cast(0x12340000); + + cmdQ->enqueueWriteBuffer(buffer.get(), false, 0, 1, hostPtr, nullptr, 0, nullptr, nullptr); + EXPECT_EQ(0u, myMockCsr->waitForTaskCountWithKmdNotifyFallbackCalled); + cmdQ->enqueueWriteBuffer(buffer.get(), true, 0, 1, hostPtr, nullptr, 0, nullptr, nullptr); + EXPECT_EQ(1u, myMockCsr->waitForTaskCountWithKmdNotifyFallbackCalled); +} + TEST_F(RenderCompressedBuffersCopyHostMemoryTests, givenNonRenderCompressedBufferWhenCopyFromHostPtrIsRequiredThenDontCallWriteBuffer) { hwInfo->capabilityTable.ftrRenderCompressedBuffers = false;