diff --git a/opencl/source/program/printf_handler.cpp b/opencl/source/program/printf_handler.cpp index ff218d5046..767272583e 100644 --- a/opencl/source/program/printf_handler.cpp +++ b/opencl/source/program/printf_handler.cpp @@ -37,9 +37,10 @@ PrintfHandler *PrintfHandler::create(const MultiDispatchInfo &multiDispatchInfo, return new PrintfHandler(device); } auto mainKernel = multiDispatchInfo.peekMainKernel(); - if ((mainKernel != nullptr) && - mainKernel->checkIfIsParentKernelAndBlocksUsesPrintf()) { - return new PrintfHandler(device); + if (mainKernel != nullptr) { + if (mainKernel->checkIfIsParentKernelAndBlocksUsesPrintf() || mainKernel->getImplicitArgs()) { + return new PrintfHandler(device); + } } return nullptr; } diff --git a/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp index 82df41d5c0..347c8fd010 100644 --- a/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp @@ -948,7 +948,9 @@ HWCMDTEST_F(IGFX_GEN8_CORE, EnqueueAuxKernelTests, givenParentKernelWhenAuxTrans cl_queue_properties queueProperties = {}; auto mockDevQueue = std::make_unique>(context, pClDevice, queueProperties); context->setDefaultDeviceQueue(mockDevQueue.get()); - std::unique_ptr parentKernel(MockParentKernel::create(*context, false, false, false, false, false)); + + MockParentKernel::CreateParams createParams{}; + std::unique_ptr parentKernel(MockParentKernel::create(*context, createParams)); parentKernel->initialize(); parentKernel->auxTranslationRequired = false; @@ -967,7 +969,8 @@ HWCMDTEST_F(IGFX_GEN8_CORE, EnqueueAuxKernelTests, givenParentKernelButNoDeviceQ MyCmdQ cmdQ(context, pClDevice); size_t gws[3] = {1, 0, 0}; - std::unique_ptr parentKernel(MockParentKernel::create(*context, false, false, false, false, false)); + MockParentKernel::CreateParams createParams{}; + std::unique_ptr parentKernel(MockParentKernel::create(*context, createParams)); parentKernel->initialize(); auto status = cmdQ.enqueueKernel(parentKernel.get(), 1, nullptr, gws, nullptr, 0, nullptr, nullptr); diff --git a/opencl/test/unit_test/execution_model/enqueue_execution_model_kernel_tests.cpp b/opencl/test/unit_test/execution_model/enqueue_execution_model_kernel_tests.cpp index 041633b7ad..9ffa61d765 100644 --- a/opencl/test/unit_test/execution_model/enqueue_execution_model_kernel_tests.cpp +++ b/opencl/test/unit_test/execution_model/enqueue_execution_model_kernel_tests.cpp @@ -593,7 +593,8 @@ HWCMDTEST_F(IGFX_GEN8_CORE, ParentKernelEnqueueFixture, givenCsrInBatchingModeWh size_t gws[3] = {1, 1, 1}; MockContext context(pClDevice); - std::unique_ptr kernelToRun(MockParentKernel::create(context, false, false, false, false, false)); + MockParentKernel::CreateParams createParams{}; + std::unique_ptr kernelToRun(MockParentKernel::create(context, createParams)); pCmdQ->enqueueKernel(kernelToRun.get(), 1, offset, gws, gws, 0, nullptr, nullptr); diff --git a/opencl/test/unit_test/kernel/kernel_reflection_surface_tests.cpp b/opencl/test/unit_test/kernel/kernel_reflection_surface_tests.cpp index 67a26f2fab..9a1e97afa1 100644 --- a/opencl/test/unit_test/kernel/kernel_reflection_surface_tests.cpp +++ b/opencl/test/unit_test/kernel/kernel_reflection_surface_tests.cpp @@ -1671,14 +1671,17 @@ TEST_F(ReflectionSurfaceTestForPrintfHandler, GivenPrintfHandlerWhenPatchingRefl REQUIRE_DEVICE_ENQUEUE_OR_SKIP(device); MockContext context(device); cl_queue_properties properties[3] = {0}; - MockParentKernel *parentKernel = MockParentKernel::create(context); + MockParentKernel::CreateParams createParams{}; + createParams.addPrintfForBlock = true; + createParams.addPrintfForParent = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); DeviceQueue devQueue(&context, device, properties[0]); parentKernel->createReflectionSurface(); context.setDefaultDeviceQueue(&devQueue); - MockMultiDispatchInfo multiDispatchInfo(device, parentKernel); + MockMultiDispatchInfo multiDispatchInfo(device, parentKernel.get()); PrintfHandler *printfHandler = PrintfHandler::create(multiDispatchInfo, *device); printfHandler->prepareDispatch(multiDispatchInfo); @@ -1690,21 +1693,23 @@ TEST_F(ReflectionSurfaceTestForPrintfHandler, GivenPrintfHandlerWhenPatchingRefl EXPECT_EQ(printfSurfaceArg.pointerSize, MockKernel::ReflectionSurfaceHelperPublic::printfBuffer.size); delete printfHandler; - delete parentKernel; } TEST_F(ReflectionSurfaceTestForPrintfHandler, GivenNoPrintfSurfaceWhenPatchingReflectionSurfaceThenPrintBufferIsNotPatched) { REQUIRE_DEVICE_ENQUEUE_OR_SKIP(device); MockContext context(device); cl_queue_properties properties[3] = {0}; - MockParentKernel *parentKernel = MockParentKernel::create(context); + MockParentKernel::CreateParams createParams{}; + createParams.addPrintfForBlock = true; + createParams.addPrintfForParent = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); DeviceQueue devQueue(&context, device, properties[0]); parentKernel->createReflectionSurface(); context.setDefaultDeviceQueue(&devQueue); - MockMultiDispatchInfo multiDispatchInfo(device, parentKernel); + MockMultiDispatchInfo multiDispatchInfo(device, parentKernel.get()); PrintfHandler *printfHandler = PrintfHandler::create(multiDispatchInfo, *device); parentKernel->patchReflectionSurface(&devQueue, printfHandler); @@ -1715,7 +1720,6 @@ TEST_F(ReflectionSurfaceTestForPrintfHandler, GivenNoPrintfSurfaceWhenPatchingRe EXPECT_EQ(printfSurfaceArg.pointerSize, MockKernel::ReflectionSurfaceHelperPublic::printfBuffer.size); delete printfHandler; - delete parentKernel; } class ReflectionSurfaceConstantValuesPatchingTest : public ClDeviceFixture, @@ -1732,7 +1736,9 @@ class ReflectionSurfaceConstantValuesPatchingTest : public ClDeviceFixture, TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithGlobalMemoryWhenReflectionSurfaceIsPatchedWithConstantValuesThenProgramGlobalMemoryAddressIsPatched) { MockContext context(pClDevice); - MockParentKernel *parentKernel = MockParentKernel::create(context, false, true, false); + MockParentKernel::CreateParams createParams{}; + createParams.addChildGlobalMemory = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); // graphicsMemory is released by Program GraphicsAllocation *globalMemory = pDevice->getMemoryManager()->allocateGraphicsMemoryWithProperties(MockAllocationProperties{pDevice->getRootDeviceIndex(), MemoryConstants::pageSize}); @@ -1759,14 +1765,14 @@ TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithGlobalMemoryWh uint64_t *pCurbe = (uint64_t *)ptrOffset(reflectionSurface->getUnderlyingBuffer(), constBufferOffset + blockPatchOffset); EXPECT_EQ(globalMemory->getGpuAddressToPatch(), *pCurbe); - - delete parentKernel; } TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithGlobalMemoryAndProgramWithoutGlobalMemortWhenReflectionSurfaceIsPatchedWithConstantValuesThenZeroAddressIsPatched) { MockContext context(pClDevice); - MockParentKernel *parentKernel = MockParentKernel::create(context, false, true, false); + MockParentKernel::CreateParams createParams{}; + createParams.addChildGlobalMemory = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); if (parentKernel->mockProgram->getGlobalSurface(pClDevice->getRootDeviceIndex())) { pDevice->getMemoryManager()->freeGraphicsMemory(parentKernel->mockProgram->getGlobalSurface(pClDevice->getRootDeviceIndex())); @@ -1792,14 +1798,14 @@ TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithGlobalMemoryAn uint64_t *pCurbe = (uint64_t *)ptrOffset(reflectionSurface->getUnderlyingBuffer(), constBufferOffset + blockPatchOffset); EXPECT_EQ(0u, *pCurbe); - - delete parentKernel; } TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithConstantMemoryWhenReflectionSurfaceIsPatchedWithConstantValuesThenProgramConstantMemoryAddressIsPatched) { MockContext context(pClDevice); - MockParentKernel *parentKernel = MockParentKernel::create(context, false, false, true); + MockParentKernel::CreateParams createParams{}; + createParams.addChildConstantMemory = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); // graphicsMemory is released by Program GraphicsAllocation *constantMemory = pDevice->getMemoryManager()->allocateGraphicsMemoryWithProperties(MockAllocationProperties{pDevice->getRootDeviceIndex(), MemoryConstants::pageSize}); @@ -1835,14 +1841,14 @@ TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithConstantMemory //memory after is not written EXPECT_THAT(zeroMemory.get(), MemCompare(pCurbeToPatch + 1, std::min(4096u, 8192u - constBufferOffset - blockPatchOffset - (uint32_t)sizeof(uint64_t)))); - - delete parentKernel; } TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithConstantMemoryAndProgramWithoutConstantMemortWhenReflectionSurfaceIsPatchedWithConstantValuesThenZeroAddressIsPatched) { MockContext context(pClDevice); - MockParentKernel *parentKernel = MockParentKernel::create(context, false, false, true); + MockParentKernel::CreateParams createParams{}; + createParams.addChildConstantMemory = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); if (parentKernel->mockProgram->getConstantSurface(pClDevice->getRootDeviceIndex())) { pDevice->getMemoryManager()->freeGraphicsMemory(parentKernel->mockProgram->getConstantSurface(pClDevice->getRootDeviceIndex())); @@ -1879,8 +1885,6 @@ TEST_F(ReflectionSurfaceConstantValuesPatchingTest, GivenBlockWithConstantMemory //memory after is not written EXPECT_THAT(zeroMemory.get(), MemCompare(pCurbeToPatch + 1, std::min(4096u, 8192u - constBufferOffset - blockPatchOffset - (uint32_t)sizeof(uint64_t)))); - - delete parentKernel; } using KernelReflectionMultiDeviceTest = MultiRootDeviceFixture; diff --git a/opencl/test/unit_test/kernel/parent_kernel_tests.cpp b/opencl/test/unit_test/kernel/parent_kernel_tests.cpp index ac2919ba65..72c185a128 100644 --- a/opencl/test/unit_test/kernel/parent_kernel_tests.cpp +++ b/opencl/test/unit_test/kernel/parent_kernel_tests.cpp @@ -62,7 +62,9 @@ TEST(ParentKernelTest, WhenArgsAddedThenObjectCountsAreIncremented) { TEST(ParentKernelTest, WhenPatchingBlocksSimdSizeThenPatchIsAppliedCorrectly) { MockClDevice device{new MockDevice}; MockContext context(&device); - std::unique_ptr parentKernel(MockParentKernel::create(context, true)); + MockParentKernel::CreateParams createParams{}; + createParams.addChildSimdSize = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); MockProgram *program = (MockProgram *)parentKernel->mockProgram; parentKernel->patchBlocksSimdSize(); @@ -91,7 +93,9 @@ TEST(ParentKernelTest, GivenNormalKernelWhenCheckingForDeviceEnqueueThenFalseIsR TEST(ParentKernelTest, WhenInitializingParentKernelThenBlocksSimdSizeIsPatched) { MockClDevice device{new MockDevice}; MockContext context(&device); - std::unique_ptr parentKernel(MockParentKernel::create(context, true)); + MockParentKernel::CreateParams createParams{}; + createParams.addChildSimdSize = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); MockProgram *program = (MockProgram *)parentKernel->mockProgram; parentKernel->initialize(); @@ -105,7 +109,9 @@ TEST(ParentKernelTest, WhenInitializingParentKernelThenBlocksSimdSizeIsPatched) TEST(ParentKernelTest, WhenInitializingParentKernelThenPrivateMemoryForBlocksIsAllocated) { MockClDevice device{new MockDevice}; MockContext context(&device); - std::unique_ptr parentKernel(MockParentKernel::create(context, true)); + MockParentKernel::CreateParams createParams{}; + createParams.addChildSimdSize = true; + std::unique_ptr parentKernel(MockParentKernel::create(context, createParams)); MockProgram *program = (MockProgram *)parentKernel->mockProgram; auto infoBlock = new MockKernelInfo(); diff --git a/opencl/test/unit_test/mocks/mock_kernel.h b/opencl/test/unit_test/mocks/mock_kernel.h index 84f34700f3..865026a9a5 100644 --- a/opencl/test/unit_test/mocks/mock_kernel.h +++ b/opencl/test/unit_test/mocks/mock_kernel.h @@ -414,13 +414,24 @@ class MockKernelWithInternals { class MockParentKernel : public Kernel { public: + struct CreateParams { + bool addChildSimdSize = false; + bool addChildGlobalMemory = false; + bool addChildConstantMemory = false; + bool addPrintfForParent = false; + bool addPrintfForBlock = false; + }; using Kernel::auxTranslationRequired; using Kernel::kernelInfo; using Kernel::patchBlocksCurbeWithConstantValues; + using Kernel::pImplicitArgs; using Kernel::pSshLocal; using Kernel::sshLocalSize; - - static MockParentKernel *create(Context &context, bool addChildSimdSize = false, bool addChildGlobalMemory = false, bool addChildConstantMemory = false, bool addPrintfForParent = true, bool addPrintfForBlock = true) { + static MockParentKernel *create(Context &context) { + CreateParams createParams{}; + return create(context, createParams); + } + static MockParentKernel *create(Context &context, const CreateParams &createParams) { auto clDevice = context.getDevice(0); auto info = new MockKernelInfo(); @@ -441,7 +452,7 @@ class MockParentKernel : public Kernel { info->setDeviceSideEnqueueEventPoolSurface(8, crossThreadOffset); crossThreadOffset += 8; - if (addPrintfForParent) { + if (createParams.addPrintfForParent) { info->setPrintfSurface(8, crossThreadOffset); crossThreadOffset += 8; } @@ -450,7 +461,7 @@ class MockParentKernel : public Kernel { deviceVector.push_back(clDevice); MockProgram *mockProgram = new MockProgram(&context, false, deviceVector); - if (addChildSimdSize) { + if (createParams.addChildSimdSize) { info->childrenKernelsIdOffset.push_back({0, crossThreadOffset}); } @@ -473,17 +484,17 @@ class MockParentKernel : public Kernel { infoBlock->setDeviceSideEnqueueEventPoolSurface(8, crossThreadOffset); crossThreadOffsetBlock += 8; - if (addPrintfForBlock) { + if (createParams.addPrintfForBlock) { infoBlock->setPrintfSurface(8, crossThreadOffsetBlock); crossThreadOffsetBlock += 8; } - if (addChildGlobalMemory) { + if (createParams.addChildGlobalMemory) { infoBlock->setGlobalVariablesSurface(8, crossThreadOffsetBlock); crossThreadOffsetBlock += 8; } - if (addChildConstantMemory) { + if (createParams.addChildConstantMemory) { infoBlock->setGlobalConstantsSurface(8, crossThreadOffsetBlock); crossThreadOffsetBlock += 8; } diff --git a/opencl/test/unit_test/program/printf_handler_tests.cpp b/opencl/test/unit_test/program/printf_handler_tests.cpp index 077eb86ef8..ebab569403 100644 --- a/opencl/test/unit_test/program/printf_handler_tests.cpp +++ b/opencl/test/unit_test/program/printf_handler_tests.cpp @@ -205,11 +205,34 @@ HWTEST_F(PrintfHandlerTests, givenPrintfHandlerWhenEnqueueIsBlockedThenDontUsePr EXPECT_FALSE(cmdQ.isQueueBlocked()); } -TEST_F(PrintfHandlerTests, givenParentKernelWihoutPrintfAndBlockKernelWithPrintfWhenPrintfHandlerCreateCalledThenResaultIsAnObject) { +TEST_F(PrintfHandlerTests, givenParentKernelWithoutPrintfAndBlockKernelWithPrintfWhenPrintfHandlerCreateCalledThenResultIsAnObject) { auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); MockContext context(device.get()); - std::unique_ptr parentKernelWithoutPrintf(MockParentKernel::create(context, false, false, false, false)); + MockParentKernel::CreateParams createParams{}; + createParams.addPrintfForParent = false; + createParams.addPrintfForBlock = true; + std::unique_ptr parentKernelWithoutPrintf(MockParentKernel::create(context, createParams)); + + MockMultiDispatchInfo multiDispatchInfo(device.get(), parentKernelWithoutPrintf.get()); + + std::unique_ptr printfHandler(PrintfHandler::create(multiDispatchInfo, *device)); + + ASSERT_NE(nullptr, printfHandler.get()); +} + +TEST_F(PrintfHandlerTests, givenKernelWithImplicitArgsButWithoutPrintfWhenPrintfHandlerCreateCalledThenResultIsAnObject) { + + auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + MockContext context(device.get()); + MockParentKernel::CreateParams createParams{}; + createParams.addPrintfForParent = false; + createParams.addPrintfForBlock = false; + std::unique_ptr parentKernelWithoutPrintf(MockParentKernel::create(context, createParams)); + + parentKernelWithoutPrintf->pImplicitArgs = std::make_unique(); + + *parentKernelWithoutPrintf->pImplicitArgs = {}; MockMultiDispatchInfo multiDispatchInfo(device.get(), parentKernelWithoutPrintf.get()); @@ -222,7 +245,10 @@ TEST_F(PrintfHandlerTests, givenParentKernelAndBlockKernelWithoutPrintfWhenPrint auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); MockContext context(device.get()); - std::unique_ptr blockKernelWithoutPrintf(MockParentKernel::create(context, false, false, false, false, false)); + MockParentKernel::CreateParams createParams{}; + createParams.addPrintfForBlock = false; + createParams.addPrintfForParent = false; + std::unique_ptr blockKernelWithoutPrintf(MockParentKernel::create(context, createParams)); MockMultiDispatchInfo multiDispatchInfo(device.get(), blockKernelWithoutPrintf.get()); @@ -234,7 +260,10 @@ TEST_F(PrintfHandlerTests, givenParentKernelWithPrintfAndBlockKernelWithoutPrint auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); MockContext context(device.get()); - std::unique_ptr parentKernelWithPrintfBlockKernelWithoutPrintf(MockParentKernel::create(context, false, false, false, true, false)); + MockParentKernel::CreateParams createParams{}; + createParams.addPrintfForBlock = false; + createParams.addPrintfForParent = true; + std::unique_ptr parentKernelWithPrintfBlockKernelWithoutPrintf(MockParentKernel::create(context, createParams)); MockMultiDispatchInfo multiDispatchInfo(device.get(), parentKernelWithPrintfBlockKernelWithoutPrintf.get());