diff --git a/runtime/command_queue/enqueue_common.h b/runtime/command_queue/enqueue_common.h index b6326ebbc2..10bf9c643f 100644 --- a/runtime/command_queue/enqueue_common.h +++ b/runtime/command_queue/enqueue_common.h @@ -336,6 +336,9 @@ void CommandQueueHw::enqueueHandler(Surface **surfacesForResidency, slmUsed |= scheduler.slmTotalSize > 0; parentKernel->getProgram()->getBlockKernelManager()->makeInternalAllocationsResident(commandStreamReceiver); + if (parentKernel->isAuxTranslationRequired()) { + blocking = true; + } } auto submissionRequired = isCommandWithoutKernel(commandType) ? false : true; diff --git a/unit_tests/command_queue/enqueue_kernel_tests.cpp b/unit_tests/command_queue/enqueue_kernel_tests.cpp index 9a4d6c8991..0f2a46dca1 100644 --- a/unit_tests/command_queue/enqueue_kernel_tests.cpp +++ b/unit_tests/command_queue/enqueue_kernel_tests.cpp @@ -1589,7 +1589,13 @@ struct EnqueueAuxKernelTests : public EnqueueKernelTest { dispatchAuxTranslationInputs.emplace_back(lastKernel, multiDispatchInfo.size(), buffersForAuxTranslation, auxTranslationDirection); } + void waitUntilComplete(uint32_t taskCountToWait, FlushStamp flushStampToWait, bool useQuickKmdSleep) override { + waitCalled++; + CommandQueueHw::waitUntilComplete(taskCountToWait, flushStampToWait, useQuickKmdSleep); + } + std::vector> dispatchAuxTranslationInputs; + uint32_t waitCalled = 0; }; }; @@ -1737,3 +1743,25 @@ HWCMDTEST_F(IGFX_GEN8_CORE, EnqueueAuxKernelTests, givenParentKernelWhenAuxTrans EXPECT_EQ(GraphicsAllocation::AllocationType::BUFFER, buffer2.getGraphicsAllocation()->getAllocationType()); } } + +HWCMDTEST_F(IGFX_GEN8_CORE, EnqueueAuxKernelTests, givenParentKernelWhenAuxTranslationIsRequiredThenMakeEnqueueBlocking) { + if (pDevice->getSupportedClVersion() >= 20) { + MyCmdQ cmdQ(context, pDevice); + size_t gws[3] = {1, 0, 0}; + + cl_queue_properties queueProperties = {}; + auto mockDevQueue = std::make_unique>(context, pDevice, queueProperties); + context->setDefaultDeviceQueue(mockDevQueue.get()); + std::unique_ptr parentKernel(MockParentKernel::create(*context, false, false, false, false, false)); + parentKernel->initialize(); + + parentKernel->auxTranslationRequired = false; + cmdQ.enqueueKernel(parentKernel.get(), 1, nullptr, gws, nullptr, 0, nullptr, nullptr); + EXPECT_EQ(0u, cmdQ.waitCalled); + mockDevQueue->getIgilQueue()->m_controls.m_CriticalSection = 0; + + parentKernel->auxTranslationRequired = true; + cmdQ.enqueueKernel(parentKernel.get(), 1, nullptr, gws, nullptr, 0, nullptr, nullptr); + EXPECT_EQ(1u, cmdQ.waitCalled); + } +}