Skip to content

Commit 9be74b5

Browse files
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 <[email protected]>
1 parent b04fc11 commit 9be74b5

File tree

4 files changed

+84
-2
lines changed

4 files changed

+84
-2
lines changed

runtime/command_queue/enqueue_read_image.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ cl_int CommandQueueHw<GfxFamily>::enqueueReadImage(
9898
dc.dstOffset.x = dstPtrOffset;
9999
dc.srcOffset = origin;
100100
dc.size = region;
101-
dc.srcRowPitch = inputRowPitch;
101+
dc.srcRowPitch = (srcImage->getImageDesc().image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) ? inputSlicePitch : inputRowPitch;
102102
dc.srcSlicePitch = inputSlicePitch;
103103
if (srcImage->getImageDesc().num_mip_levels > 0) {
104104
dc.srcMipLevel = findMipLevel(srcImage->getImageDesc().image_type, origin);

runtime/command_queue/enqueue_write_image.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ cl_int CommandQueueHw<GfxFamily>::enqueueWriteImage(
8989
dc.dstMemObj = dstImage;
9090
dc.dstOffset = origin;
9191
dc.size = region;
92-
dc.dstRowPitch = inputRowPitch;
92+
dc.dstRowPitch = ((dstImage->getImageDesc().image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) && (inputSlicePitch > inputRowPitch)) ? inputSlicePitch : inputRowPitch;
9393
dc.dstSlicePitch = inputSlicePitch;
9494
if (dstImage->getImageDesc().num_mip_levels > 0) {
9595
dc.dstMipLevel = findMipLevel(dstImage->getImageDesc().image_type, origin);

unit_tests/command_queue/enqueue_read_image_tests.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,46 @@ HWTEST_F(EnqueueReadImageTest, GivenImage1DarrayWhenReadImageIsCalledThenHostPtr
238238
delete srcImage;
239239
}
240240

241+
HWTEST_F(EnqueueReadImageTest, GivenImage1DarrayWhenReadImageIsCalledThenRowPitchIsSetToSlicePitch) {
242+
auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns();
243+
EBuiltInOps copyBuiltIn = EBuiltInOps::CopyImage3dToBuffer;
244+
auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder(
245+
copyBuiltIn,
246+
pCmdQ->getContext(),
247+
pCmdQ->getDevice());
248+
249+
// substitute original builder with mock builder
250+
auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder(
251+
copyBuiltIn,
252+
pCmdQ->getContext(),
253+
pCmdQ->getDevice(),
254+
std::unique_ptr<NEO::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder(builtIns, &origBuilder)));
255+
256+
auto srcImage = Image1dArrayHelper<>::create(context);
257+
auto imageDesc = srcImage->getImageDesc();
258+
size_t origin[] = {0, 0, 0};
259+
size_t region[] = {imageDesc.image_width, imageDesc.image_array_size, 1};
260+
size_t rowPitch = 64;
261+
size_t slicePitch = 128;
262+
263+
EnqueueReadImageHelper<>::enqueueReadImage(pCmdQ, srcImage, CL_TRUE, origin, region, rowPitch, slicePitch);
264+
265+
auto &mockBuilder = static_cast<MockBuiltinDispatchInfoBuilder &>(builtIns.getBuiltinDispatchInfoBuilder(copyBuiltIn,
266+
pCmdQ->getContext(),
267+
pCmdQ->getDevice()));
268+
auto params = mockBuilder.getBuiltinOpParams();
269+
EXPECT_EQ(params->srcRowPitch, slicePitch);
270+
271+
// restore original builder and retrieve mock builder
272+
auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder(
273+
copyBuiltIn,
274+
pCmdQ->getContext(),
275+
pCmdQ->getDevice(),
276+
std::move(oldBuilder));
277+
EXPECT_NE(nullptr, newBuilder);
278+
delete srcImage;
279+
}
280+
241281
HWTEST_F(EnqueueReadImageTest, GivenImage2DarrayWhenReadImageIsCalledThenHostPtrSizeIsCalculatedProperly) {
242282
auto srcImage = Image2dArrayHelper<>::create(context);
243283
auto imageDesc = srcImage->getImageDesc();

unit_tests/command_queue/enqueue_write_image_tests.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,48 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage1DarrayWhenReadWriteImageIsCalledThenH
216216
delete dstImage2;
217217
}
218218

219+
HWTEST_F(EnqueueWriteImageTest, GivenImage1DarrayWhenWriteImageIsCalledThenRowPitchIsSetToSlicePitch) {
220+
auto &builtIns = *pCmdQ->getDevice().getExecutionEnvironment()->getBuiltIns();
221+
EBuiltInOps copyBuiltIn = EBuiltInOps::CopyBufferToImage3d;
222+
auto &origBuilder = builtIns.getBuiltinDispatchInfoBuilder(
223+
copyBuiltIn,
224+
pCmdQ->getContext(),
225+
pCmdQ->getDevice());
226+
227+
// substitute original builder with mock builder
228+
auto oldBuilder = builtIns.setBuiltinDispatchInfoBuilder(
229+
copyBuiltIn,
230+
pCmdQ->getContext(),
231+
pCmdQ->getDevice(),
232+
std::unique_ptr<NEO::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder(builtIns, &origBuilder)));
233+
234+
std::unique_ptr<Image> image;
235+
auto destImage = Image1dArrayHelper<>::create(context);
236+
auto imageDesc = destImage->getImageDesc();
237+
size_t origin[] = {0, 0, 0};
238+
size_t region[] = {imageDesc.image_width, imageDesc.image_array_size, 1};
239+
size_t rowPitch = 64;
240+
size_t slicePitch = 128;
241+
242+
EnqueueWriteImageHelper<>::enqueueWriteImage(pCmdQ, destImage, CL_FALSE, origin, region, rowPitch, slicePitch);
243+
244+
auto &mockBuilder = static_cast<MockBuiltinDispatchInfoBuilder &>(builtIns.getBuiltinDispatchInfoBuilder(copyBuiltIn,
245+
pCmdQ->getContext(),
246+
pCmdQ->getDevice()));
247+
auto params = mockBuilder.getBuiltinOpParams();
248+
EXPECT_EQ(params->dstRowPitch, slicePitch);
249+
250+
// restore original builder and retrieve mock builder
251+
auto newBuilder = builtIns.setBuiltinDispatchInfoBuilder(
252+
copyBuiltIn,
253+
pCmdQ->getContext(),
254+
pCmdQ->getDevice(),
255+
std::move(oldBuilder));
256+
EXPECT_NE(nullptr, newBuilder);
257+
258+
delete destImage;
259+
}
260+
219261
HWTEST_F(EnqueueWriteImageTest, GivenImage2DarrayWhenReadWriteImageIsCalledThenHostPtrSizeIsCalculatedProperly) {
220262
auto dstImage2 = Image2dArrayHelper<>::create(context);
221263
auto imageDesc = dstImage2->getImageDesc();

0 commit comments

Comments
 (0)