From cc617c0f78e4b02209161aa33af70c423b1b9e52 Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Fri, 19 Jul 2019 09:48:52 +0200 Subject: [PATCH] Do implicit flush for blit enqueues Change-Id: I872f39a0ea3410b09693b2018c0b86a9a127e5a2 Signed-off-by: Dunajski, Bartosz Related-To: NEO-3020 --- runtime/command_queue/command_queue_hw.h | 1 + runtime/command_queue/enqueue_common.h | 3 +++ .../enqueue_command_without_kernel_tests.cpp | 25 +++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/runtime/command_queue/command_queue_hw.h b/runtime/command_queue/command_queue_hw.h index 9d5dab7a2f..7b77b675e0 100644 --- a/runtime/command_queue/command_queue_hw.h +++ b/runtime/command_queue/command_queue_hw.h @@ -348,6 +348,7 @@ class CommandQueueHw : public CommandQueue { LinearStream &commandStream, size_t commandStreamStart, bool &blocking, + bool blitEnqueue, TimestampPacketContainer *previousTimestampPacketNodes, EventsRequest &eventsRequest, EventBuilder &eventBuilder, diff --git a/runtime/command_queue/enqueue_common.h b/runtime/command_queue/enqueue_common.h index dec0f33d1f..4078f874e7 100644 --- a/runtime/command_queue/enqueue_common.h +++ b/runtime/command_queue/enqueue_common.h @@ -312,6 +312,7 @@ void CommandQueueHw::enqueueHandler(Surface **surfacesForResidency, commandStream, commandStreamStart, blocking, + blitEnqueue, &previousTimestampPacketNodes, eventsRequest, eventBuilder, @@ -836,6 +837,7 @@ CompletionStamp CommandQueueHw::enqueueCommandWithoutKernel( LinearStream &commandStream, size_t commandStreamStart, bool &blocking, + bool blitEnqueue, TimestampPacketContainer *previousTimestampPacketNodes, EventsRequest &eventsRequest, EventBuilder &eventBuilder, @@ -856,6 +858,7 @@ CompletionStamp CommandQueueHw::enqueueCommandWithoutKernel( dispatchFlags.blocking = blocking; dispatchFlags.multiEngineQueue = multiEngineQueue; dispatchFlags.preemptionMode = device->getPreemptionMode(); + dispatchFlags.implicitFlush = blitEnqueue; if (getGpgpuCommandStreamReceiver().peekTimestampPacketWriteEnabled()) { dispatchFlags.csrDependencies.fillFromEventsRequestAndMakeResident(eventsRequest, getGpgpuCommandStreamReceiver(), CsrDependencies::DependenciesType::OutOfCsr); } diff --git a/unit_tests/command_queue/enqueue_command_without_kernel_tests.cpp b/unit_tests/command_queue/enqueue_command_without_kernel_tests.cpp index b5cf126599..c16bf89f30 100644 --- a/unit_tests/command_queue/enqueue_command_without_kernel_tests.cpp +++ b/unit_tests/command_queue/enqueue_command_without_kernel_tests.cpp @@ -42,7 +42,7 @@ HWTEST_F(EnqueueHandlerTest, GivenCommandStreamWithoutKernelWhenCommandEnqueuedT Surface *surfaces[] = {surface.get()}; auto blocking = true; TimestampPacketContainer previousTimestampPacketNodes; - mockCmdQ->enqueueCommandWithoutKernel(surfaces, 1, mockCmdQ->getCS(0), 0, blocking, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0); + mockCmdQ->enqueueCommandWithoutKernel(surfaces, 1, mockCmdQ->getCS(0), 0, blocking, false, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0); EXPECT_EQ(allocation->getTaskCount(mockCmdQ->getGpgpuCommandStreamReceiver().getOsContext().getContextId()), 1u); } @@ -60,14 +60,35 @@ HWTEST_F(EnqueueHandlerTest, whenEnqueueCommandWithoutKernelThenPassCorrectDispa TimestampPacketContainer previousTimestampPacketNodes; EventsRequest eventsRequest(0, nullptr, nullptr); EventBuilder eventBuilder; - mockCmdQ->enqueueCommandWithoutKernel(nullptr, 0, mockCmdQ->getCS(0), 0, blocking, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0); + mockCmdQ->enqueueCommandWithoutKernel(nullptr, 0, mockCmdQ->getCS(0), 0, blocking, false, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0); EXPECT_EQ(blocking, mockCsr->passedDispatchFlags.blocking); + EXPECT_FALSE(mockCsr->passedDispatchFlags.implicitFlush); EXPECT_EQ(mockCmdQ->isMultiEngineQueue(), mockCsr->passedDispatchFlags.multiEngineQueue); EXPECT_EQ(pDevice->getPreemptionMode(), mockCsr->passedDispatchFlags.preemptionMode); mockCmdQ->gpgpuEngine->commandStreamReceiver = oldCsr; } +HWTEST_F(EnqueueHandlerTest, givenBlitEnqueueWhenDispatchingCommandsWithoutKernelThenDoImplicitflush) { + auto executionEnvironment = pDevice->getExecutionEnvironment(); + auto mockCsr = std::make_unique>(*executionEnvironment); + auto mockCmdQ = std::make_unique>(context, pDevice, nullptr); + mockCsr->setupContext(*mockCmdQ->gpgpuEngine->osContext); + mockCsr->initializeTagAllocation(); + auto oldCsr = mockCmdQ->gpgpuEngine->commandStreamReceiver; + mockCmdQ->gpgpuEngine->commandStreamReceiver = mockCsr.get(); + mockCsr->createPreemptionAllocation(); + + auto blocking = true; + TimestampPacketContainer previousTimestampPacketNodes; + EventsRequest eventsRequest(0, nullptr, nullptr); + EventBuilder eventBuilder; + mockCmdQ->enqueueCommandWithoutKernel(nullptr, 0, mockCmdQ->getCS(0), 0, blocking, true, &previousTimestampPacketNodes, eventsRequest, eventBuilder, 0); + + EXPECT_TRUE(mockCsr->passedDispatchFlags.implicitFlush); + mockCmdQ->gpgpuEngine->commandStreamReceiver = oldCsr; +} + HWTEST_F(EnqueueHandlerTest, GivenCommandStreamWithoutKernelAndZeroSurfacesWhenEnqueuedHandlerThenUsedSizeEqualZero) { std::unique_ptr> mockCmdQ(new MockCommandQueueWithCacheFlush(context, pDevice, 0));