From 1bc5f7b14295065f365891124bee19443de54a0c Mon Sep 17 00:00:00 2001 From: "Mrozek, Michal" Date: Wed, 26 Jun 2019 07:56:56 +0200 Subject: [PATCH] Ensure that events without commands have proper flush stamps. Change-Id: I937efef7f87fa7df9e9b1a903269e3637eca73ad Signed-off-by: Mrozek, Michal --- runtime/command_queue/enqueue_common.h | 7 +++--- .../command_queue/enqueue_marker_tests.cpp | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/runtime/command_queue/enqueue_common.h b/runtime/command_queue/enqueue_common.h index 5e45be1755..d43c6bcd15 100644 --- a/runtime/command_queue/enqueue_common.h +++ b/runtime/command_queue/enqueue_common.h @@ -274,10 +274,6 @@ void CommandQueueHw::enqueueHandler(Surface **surfacesForResidency, slmUsed, printfHandler.get()); - if (eventBuilder.getEvent()) { - eventBuilder.getEvent()->flushStamp->replaceStampObject(this->flushStamp->getStampReference()); - } - if (parentKernel) { getCommandStreamReceiver().setMediaVFEStateDirty(true); @@ -329,6 +325,9 @@ void CommandQueueHw::enqueueHandler(Surface **surfacesForResidency, eventBuilder.getEvent()->setStartTimeStamp(); } } + if (eventBuilder.getEvent()) { + eventBuilder.getEvent()->flushStamp->replaceStampObject(this->flushStamp->getStampReference()); + } } updateFromCompletionStamp(completionStamp); diff --git a/unit_tests/command_queue/enqueue_marker_tests.cpp b/unit_tests/command_queue/enqueue_marker_tests.cpp index 1a0e4242f9..23f8a7c36e 100644 --- a/unit_tests/command_queue/enqueue_marker_tests.cpp +++ b/unit_tests/command_queue/enqueue_marker_tests.cpp @@ -10,6 +10,7 @@ #include "test.h" #include "unit_tests/command_queue/command_enqueue_fixture.h" #include "unit_tests/gen_common/gen_cmd_parse.h" +#include "unit_tests/mocks/mock_kernel.h" using namespace NEO; @@ -218,3 +219,27 @@ TEST_F(MarkerTest, givenMultipleEventsAndCompletedUserEventWhenTheyArePassedToMa EXPECT_EQ(16u, pCmdQ->taskCount); EXPECT_EQ(16u, pEvent->peekTaskCount()); } + +HWTEST_F(MarkerTest, givenMarkerCallFollowingNdrangeCallInBatchedModeWhenWaitForEventsIsCalledThenFlushStampIsProperlyUpdated) { + MockKernelWithInternals mockKernel(*this->pDevice, this->context); + + auto &ultCommandStreamReceiver = this->pDevice->getUltCommandStreamReceiver(); + + ultCommandStreamReceiver.overrideDispatchPolicy(DispatchMode::BatchedDispatch); + + cl_event eventFromNdr = nullptr; + size_t gws[] = {1}; + pCmdQ->enqueueKernel(mockKernel.mockKernel, 1, nullptr, gws, nullptr, 0, nullptr, &eventFromNdr); + cl_event eventFromMarker = nullptr; + pCmdQ->enqueueMarkerWithWaitList(1u, &eventFromNdr, &eventFromMarker); + + ultCommandStreamReceiver.flushStamp->setStamp(1u); + + clEnqueueWaitForEvents(pCmdQ, 1u, &eventFromMarker); + + auto neoEvent = castToObject(eventFromMarker); + EXPECT_EQ(1u, neoEvent->flushStamp->peekStamp()); + + clReleaseEvent(eventFromMarker); + clReleaseEvent(eventFromNdr); +}