diff --git a/opencl/source/mem_obj/buffer.cpp b/opencl/source/mem_obj/buffer.cpp index 3b4ba5d38b..6dd9d464f0 100644 --- a/opencl/source/mem_obj/buffer.cpp +++ b/opencl/source/mem_obj/buffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -234,6 +234,7 @@ bool inline copyHostPointer(Buffer *buffer, auto blitMemoryToAllocationResult = BlitOperationResult::unsupported; if (productHelper.isBlitterFullySupported(hwInfo) && (isLocalMemory || isGpuCopyRequiredForDcFlushMitigation)) { + device.stopDirectSubmissionForCopyEngine(); blitMemoryToAllocationResult = BlitHelperFunctions::blitMemoryToAllocation(device, memory, buffer->getOffset(), hostPtr, {size, 1, 1}); } diff --git a/opencl/source/mem_obj/image.cpp b/opencl/source/mem_obj/image.cpp index 00262c0c4e..f16d224663 100644 --- a/opencl/source/mem_obj/image.cpp +++ b/opencl/source/mem_obj/image.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -341,6 +341,7 @@ Image *Image::create(Context *context, } else { auto cmdQ = context->getSpecialQueue(defaultRootDeviceIndex); + defaultDevice->stopDirectSubmissionForCopyEngine(); if (isNV12Image(&image->getImageFormat())) { errcodeRet = image->writeNV12Planes(hostPtr, hostPtrRowPitch, defaultRootDeviceIndex); } else { diff --git a/opencl/test/unit_test/command_queue/command_queue_hw_2_tests.cpp b/opencl/test/unit_test/command_queue/command_queue_hw_2_tests.cpp index 1f05c375c8..71814a80e0 100644 --- a/opencl/test/unit_test/command_queue/command_queue_hw_2_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_hw_2_tests.cpp @@ -6,12 +6,14 @@ */ #include "shared/source/helpers/compiler_product_helper.h" +#include "shared/source/helpers/local_memory_access_modes.h" #include "shared/source/helpers/timestamp_packet.h" #include "shared/test/common/cmd_parse/hw_parse.h" #include "shared/test/common/helpers/engine_descriptor_helper.h" #include "shared/test/common/helpers/unit_test_helper.h" #include "shared/test/common/mocks/mock_builtins.h" #include "shared/test/common/mocks/mock_csr.h" +#include "shared/test/common/mocks/mock_direct_submission_hw.h" #include "shared/test/common/mocks/mock_memory_manager.h" #include "shared/test/common/utilities/base_object_utils.h" @@ -1534,4 +1536,37 @@ HWTEST_F(CommandQueueHwTest, GivenBuiltinKernelWhenBuiltinDispatchInfoBuilderIsP EXPECT_EQ(builder.paramsToUse.elws.x, dispatchInfo->getEnqueuedWorkgroupSize().x); EXPECT_EQ(builder.paramsToUse.offset.x, dispatchInfo->getOffset().x); EXPECT_EQ(builder.paramsToUse.kernel, dispatchInfo->getKernel()); +} + +HWTEST_F(IoqCommandQueueHwBlitTest, givenImageWithHostPtrWhenCreateImageThenStopRegularBcs) { + REQUIRE_IMAGES_OR_SKIP(defaultHwInfo); + auto &engine = pDevice->getEngine(aub_stream::EngineType::ENGINE_BCS, EngineUsage::regular); + auto mockCsr = reinterpret_cast *>(engine.commandStreamReceiver); + mockCsr->blitterDirectSubmissionAvailable = true; + mockCsr->blitterDirectSubmission = std::make_unique>>(*mockCsr); + auto directSubmission = reinterpret_cast> *>(mockCsr->blitterDirectSubmission.get()); + directSubmission->initialize(true, false); + + EXPECT_TRUE(directSubmission->ringStart); + std::unique_ptr image(ImageHelper>::create(context)); + EXPECT_FALSE(directSubmission->ringStart); +} + +HWTEST_F(IoqCommandQueueHwBlitTest, givenBufferWithHostPtrWhenCreateBufferThenStopRegularBcs) { + DebugManagerStateRestore restorer{}; + debugManager.flags.ForceLocalMemoryAccessMode.set(static_cast(LocalMemoryAccessMode::cpuAccessDisallowed)); + + auto memoryManager = static_cast(pDevice->getMemoryManager()); + memoryManager->localMemorySupported[pDevice->getRootDeviceIndex()] = true; + + auto &engine = pDevice->getEngine(aub_stream::EngineType::ENGINE_BCS, EngineUsage::regular); + auto mockCsr = reinterpret_cast *>(engine.commandStreamReceiver); + mockCsr->blitterDirectSubmissionAvailable = true; + mockCsr->blitterDirectSubmission = std::make_unique>>(*mockCsr); + auto directSubmission = reinterpret_cast> *>(mockCsr->blitterDirectSubmission.get()); + directSubmission->initialize(true, false); + + EXPECT_TRUE(directSubmission->ringStart); + auto buffer = std::unique_ptr(BufferHelper>::create(context)); + EXPECT_FALSE(directSubmission->ringStart); } \ No newline at end of file