From 9be74b5f3e18bacf84ff82c35581dec15b3cbc3c Mon Sep 17 00:00:00 2001 From: "Koska, Andrzej" Date: Fri, 7 Jun 2019 14:02:25 +0200 Subject: [PATCH] Replace imageRowPitch with imageSlicePitch Related-To: NEO-2665 Replace imageRowPitch with imageSlicePitch for read/write CL_MEM_OBJECT_IMAGE1D_ARRAY Change-Id: I0d5931629571f538f242e112c502e2f798ffd896 Signed-off-by: Koska, Andrzej --- runtime/command_queue/enqueue_read_image.h | 2 +- runtime/command_queue/enqueue_write_image.h | 2 +- .../enqueue_read_image_tests.cpp | 40 ++++++++++++++++++ .../enqueue_write_image_tests.cpp | 42 +++++++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/runtime/command_queue/enqueue_read_image.h b/runtime/command_queue/enqueue_read_image.h index 0c05b2836f..ef561049d2 100644 --- a/runtime/command_queue/enqueue_read_image.h +++ b/runtime/command_queue/enqueue_read_image.h @@ -98,7 +98,7 @@ cl_int CommandQueueHw::enqueueReadImage( dc.dstOffset.x = dstPtrOffset; dc.srcOffset = origin; dc.size = region; - dc.srcRowPitch = inputRowPitch; + dc.srcRowPitch = (srcImage->getImageDesc().image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) ? inputSlicePitch : inputRowPitch; dc.srcSlicePitch = inputSlicePitch; if (srcImage->getImageDesc().num_mip_levels > 0) { dc.srcMipLevel = findMipLevel(srcImage->getImageDesc().image_type, origin); diff --git a/runtime/command_queue/enqueue_write_image.h b/runtime/command_queue/enqueue_write_image.h index d9d303455a..8de04faf6e 100644 --- a/runtime/command_queue/enqueue_write_image.h +++ b/runtime/command_queue/enqueue_write_image.h @@ -89,7 +89,7 @@ cl_int CommandQueueHw::enqueueWriteImage( dc.dstMemObj = dstImage; dc.dstOffset = origin; dc.size = region; - dc.dstRowPitch = inputRowPitch; + dc.dstRowPitch = ((dstImage->getImageDesc().image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) && (inputSlicePitch > inputRowPitch)) ? inputSlicePitch : inputRowPitch; dc.dstSlicePitch = inputSlicePitch; if (dstImage->getImageDesc().num_mip_levels > 0) { dc.dstMipLevel = findMipLevel(dstImage->getImageDesc().image_type, origin); diff --git a/unit_tests/command_queue/enqueue_read_image_tests.cpp b/unit_tests/command_queue/enqueue_read_image_tests.cpp index d0fc209f90..688b815421 100644 --- a/unit_tests/command_queue/enqueue_read_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_read_image_tests.cpp @@ -238,6 +238,46 @@ HWTEST_F(EnqueueReadImageTest, GivenImage1DarrayWhenReadImageIsCalledThenHostPtr delete srcImage; } +HWTEST_F(EnqueueReadImageTest, GivenImage1DarrayWhenReadImageIsCalledThenRowPitchIsSetToSlicePitch) { + auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns(); + EBuiltInOps copyBuiltIn = EBuiltInOps::CopyImage3dToBuffer; + auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder( + copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice()); + + // substitute original builder with mock builder + auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder( + copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice(), + std::unique_ptr(new MockBuiltinDispatchInfoBuilder(builtIns, &origBuilder))); + + auto srcImage = Image1dArrayHelper<>::create(context); + auto imageDesc = srcImage->getImageDesc(); + size_t origin[] = {0, 0, 0}; + size_t region[] = {imageDesc.image_width, imageDesc.image_array_size, 1}; + size_t rowPitch = 64; + size_t slicePitch = 128; + + EnqueueReadImageHelper<>::enqueueReadImage(pCmdQ, srcImage, CL_TRUE, origin, region, rowPitch, slicePitch); + + auto &mockBuilder = static_cast(builtIns.getBuiltinDispatchInfoBuilder(copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice())); + auto params = mockBuilder.getBuiltinOpParams(); + EXPECT_EQ(params->srcRowPitch, slicePitch); + + // restore original builder and retrieve mock builder + auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder( + copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice(), + std::move(oldBuilder)); + EXPECT_NE(nullptr, newBuilder); + delete srcImage; +} + HWTEST_F(EnqueueReadImageTest, GivenImage2DarrayWhenReadImageIsCalledThenHostPtrSizeIsCalculatedProperly) { auto srcImage = Image2dArrayHelper<>::create(context); auto imageDesc = srcImage->getImageDesc(); diff --git a/unit_tests/command_queue/enqueue_write_image_tests.cpp b/unit_tests/command_queue/enqueue_write_image_tests.cpp index b009fa35a0..7d3b865926 100644 --- a/unit_tests/command_queue/enqueue_write_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_write_image_tests.cpp @@ -216,6 +216,48 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage1DarrayWhenReadWriteImageIsCalledThenH delete dstImage2; } +HWTEST_F(EnqueueWriteImageTest, GivenImage1DarrayWhenWriteImageIsCalledThenRowPitchIsSetToSlicePitch) { + auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns(); + EBuiltInOps copyBuiltIn = EBuiltInOps::CopyBufferToImage3d; + auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder( + copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice()); + + // substitute original builder with mock builder + auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder( + copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice(), + std::unique_ptr(new MockBuiltinDispatchInfoBuilder(builtIns, &origBuilder))); + + std::unique_ptr image; + auto destImage = Image1dArrayHelper<>::create(context); + auto imageDesc = destImage->getImageDesc(); + size_t origin[] = {0, 0, 0}; + size_t region[] = {imageDesc.image_width, imageDesc.image_array_size, 1}; + size_t rowPitch = 64; + size_t slicePitch = 128; + + EnqueueWriteImageHelper<>::enqueueWriteImage(pCmdQ, destImage, CL_FALSE, origin, region, rowPitch, slicePitch); + + auto &mockBuilder = static_cast(builtIns.getBuiltinDispatchInfoBuilder(copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice())); + auto params = mockBuilder.getBuiltinOpParams(); + EXPECT_EQ(params->dstRowPitch, slicePitch); + + // restore original builder and retrieve mock builder + auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder( + copyBuiltIn, + pCmdQ->getContext(), + pCmdQ->getDevice(), + std::move(oldBuilder)); + EXPECT_NE(nullptr, newBuilder); + + delete destImage; +} + HWTEST_F(EnqueueWriteImageTest, GivenImage2DarrayWhenReadWriteImageIsCalledThenHostPtrSizeIsCalculatedProperly) { auto dstImage2 = Image2dArrayHelper<>::create(context); auto imageDesc = dstImage2->getImageDesc();