diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index abcf9f58bc..2d233f29ae 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -2892,19 +2892,22 @@ cl_int CL_API_CALL clEnqueueReadImage(cl_command_queue commandQueue, TRACING_EXIT(ClEnqueueReadImage, &retVal); return retVal; } - - retVal = pCommandQueue->enqueueReadImage( - pImage, - blockingRead, - origin, - region, - rowPitch, - slicePitch, - ptr, - nullptr, - numEventsInWaitList, - eventWaitList, - event); + if (pCommandQueue->isValidForStagingTransferImage(pImage, ptr, numEventsInWaitList > 0)) { + retVal = pCommandQueue->enqueueStagingReadImage(pImage, blockingRead, origin, region, rowPitch, slicePitch, ptr, event); + } else { + retVal = pCommandQueue->enqueueReadImage( + pImage, + blockingRead, + origin, + region, + rowPitch, + slicePitch, + ptr, + nullptr, + numEventsInWaitList, + eventWaitList, + event); + } } DBG_LOG_INPUTS("event", getClFileLogger().getEvents(reinterpret_cast(event), 1u)); TRACING_EXIT(ClEnqueueReadImage, &retVal); diff --git a/opencl/test/unit_test/api/cl_enqueue_read_image_tests.inl b/opencl/test/unit_test/api/cl_enqueue_read_image_tests.inl index 083e6f7e40..36e0625b62 100644 --- a/opencl/test/unit_test/api/cl_enqueue_read_image_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_read_image_tests.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2023 Intel Corporation + * Copyright (C) 2018-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -205,4 +205,33 @@ TEST_F(ClEnqueueReadImageYuv, GivenInvalidRegionWhenReadingYuvImageThenInvalidVa retVal = clReleaseMemObject(image); EXPECT_EQ(CL_SUCCESS, retVal); } + +TEST_F(ClEnqueueReadImageTests, givenStagingEnabledWhenEnqueueReadImageCalledThenReadSuccesfullAndStagingBufferAllocated) { + DebugManagerStateRestore restorer; + debugManager.flags.EnableCopyWithStagingBuffers.set(1); + imageFormat.image_channel_order = CL_RGBA; + auto image = Image::validateAndCreateImage(pContext, nullptr, CL_MEM_READ_WRITE, 0, &imageFormat, &imageDesc, nullptr, retVal); + ASSERT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, image); + const size_t origin[] = {2, 2, 0}; + const size_t region[] = {2, 2, 1}; + char nonUsmPtr[1024]; + auto retVal = clEnqueueReadImage( + pCommandQueue, + image, + false, + origin, + region, + 0, + 0, + nonUsmPtr, + 0, + nullptr, + nullptr); + auto unifiedMemoryManager = pContext->getSVMAllocsManager(); + EXPECT_EQ(1u, unifiedMemoryManager->getNumAllocs()); + EXPECT_EQ(CL_SUCCESS, retVal); + retVal = clReleaseMemObject(image); + EXPECT_EQ(CL_SUCCESS, retVal); +} } // namespace ULT