diff --git a/opencl/source/command_queue/enqueue_copy_image_to_buffer.h b/opencl/source/command_queue/enqueue_copy_image_to_buffer.h index e0c90566ce..230dad5b50 100644 --- a/opencl/source/command_queue/enqueue_copy_image_to_buffer.h +++ b/opencl/source/command_queue/enqueue_copy_image_to_buffer.h @@ -6,6 +6,8 @@ */ #pragma once +#include "shared/source/helpers/compiler_product_helper.h" + #include "opencl/source/command_queue/command_queue_hw.h" #include "opencl/source/helpers/mipmap.h" #include "opencl/source/mem_obj/buffer.h" @@ -25,9 +27,12 @@ cl_int CommandQueueHw::enqueueCopyImageToBuffer( const cl_event *eventWaitList, cl_event *event) { - const bool useStateless = forceStateless(dstBuffer->getSize()); + bool isStateless = device->getCompilerProductHelper().isForceToStatelessRequired(); + if (dstBuffer->getSize() >= 4ull * MemoryConstants::gigaByte) { + isStateless = true; + } const bool useHeapless = false; - auto builtInType = EBuiltInOps::adjustBuiltinType(useStateless, useHeapless); + auto builtInType = EBuiltInOps::adjustBuiltinType(isStateless, useHeapless); auto &builder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(builtInType, this->getClDevice()); diff --git a/opencl/test/unit_test/command_queue/enqueue_copy_image_to_buffer_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_copy_image_to_buffer_tests.cpp index 451c550f69..c639e5a9fb 100644 --- a/opencl/test/unit_test/command_queue/enqueue_copy_image_to_buffer_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_copy_image_to_buffer_tests.cpp @@ -7,6 +7,7 @@ #include "shared/source/gen_common/reg_configs_common.h" #include "shared/source/helpers/basic_math.h" +#include "shared/source/helpers/compiler_product_helper.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/unit_test_helper.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" @@ -207,14 +208,17 @@ HWTEST_P(MipMapCopyImageToBufferTest, GivenImageWithMipLevelNonZeroWhenCopyImage auto imageType = (cl_mem_object_type)GetParam(); auto builtIns = new MockBuiltins(); MockRootDeviceEnvironment::resetBuiltins(pCmdQ->getDevice().getExecutionEnvironment()->rootDeviceEnvironments[pCmdQ->getDevice().getRootDeviceIndex()].get(), builtIns); + + const EBuiltInOps::Type builtInType = pCmdQ->getDevice().getCompilerProductHelper().isForceToStatelessRequired() ? EBuiltInOps::copyImage3dToBufferStateless : EBuiltInOps::copyImage3dToBuffer; + auto &origBuilder = BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder( - EBuiltInOps::copyImage3dToBuffer, + builtInType, pCmdQ->getClDevice()); // substitute original builder with mock builder auto oldBuilder = pClExecutionEnvironment->setBuiltinDispatchInfoBuilder( rootDeviceIndex, - EBuiltInOps::copyImage3dToBuffer, + builtInType, std::unique_ptr(new MockBuiltinDispatchInfoBuilder(*builtIns, pCmdQ->getClDevice(), &origBuilder))); cl_int retVal = CL_SUCCESS; @@ -265,7 +269,7 @@ HWTEST_P(MipMapCopyImageToBufferTest, GivenImageWithMipLevelNonZeroWhenCopyImage EXPECT_EQ(CL_SUCCESS, retVal); - auto &mockBuilder = static_cast(BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(EBuiltInOps::copyImage3dToBuffer, + auto &mockBuilder = static_cast(BuiltInDispatchBuilderOp::getBuiltinDispatchInfoBuilder(builtInType, pCmdQ->getClDevice())); auto params = mockBuilder.getBuiltinOpParams(); @@ -274,7 +278,7 @@ HWTEST_P(MipMapCopyImageToBufferTest, GivenImageWithMipLevelNonZeroWhenCopyImage // restore original builder and retrieve mock builder auto newBuilder = pClExecutionEnvironment->setBuiltinDispatchInfoBuilder( rootDeviceIndex, - EBuiltInOps::copyImage3dToBuffer, + builtInType, std::move(oldBuilder)); EXPECT_NE(nullptr, newBuilder); } @@ -350,7 +354,7 @@ HWTEST_F(EnqueueCopyImageToBufferHwStatelessTest, givenGpuHangAndBlockingCallAnd using EnqueueCopyImageToBufferStatefulTest = EnqueueCopyImageToBufferHw; -HWTEST_F(EnqueueCopyImageToBufferStatefulTest, givenBufferWhenCopyingImageToBufferStatefulThenSuccessIsReturned) { +HWTEST2_F(EnqueueCopyImageToBufferStatefulTest, givenBufferWhenCopyingImageToBufferStatefulThenSuccessIsReturned, IsStatefulBufferPreferredForProduct) { auto cmdQ = std::make_unique>(context.get(), device.get()); if (cmdQ->getHeaplessModeEnabled()) { GTEST_SKIP();