Implement cl_khr_mipmap_image [1/n]

- Add mipmap image handling for clEnqueueReadImage, clEnqueueWriteImage
- Fix mipmap image handling for clCreateImage

Change-Id: I42938a330b55c7e69a16c26dce3ab5d66f8a8938
This commit is contained in:
Woloszyn, Wojciech
2018-03-12 16:32:08 +01:00
committed by Wojciech Woloszyn
parent 214b407353
commit 0ad81024b7
24 changed files with 356 additions and 45 deletions

View File

@@ -69,4 +69,8 @@ struct EnqueueReadImageTest : public CommandEnqueueFixture,
Image *srcImage;
MockContext *context;
};
}
struct EnqueueReadImageMipMapTest : public EnqueueReadImageTest,
public ::testing::WithParamInterface<uint32_t> {
};
} // namespace OCLRT

View File

@@ -23,6 +23,7 @@
#include "runtime/gen_common/reg_configs.h"
#include "unit_tests/command_queue/enqueue_read_image_fixture.h"
#include "test.h"
#include "unit_tests/mocks/mock_builtin_dispatch_info_builder.h"
using namespace OCLRT;
@@ -589,6 +590,92 @@ HWTEST_F(EnqueueReadImageTest, GivenNonZeroCopyImage2DAndImageShareTheSameStorag
EXPECT_EQ(pCmdQ->taskLevel, 2u);
}
typedef EnqueueReadImageMipMapTest MipMapReadImageTest;
HWTEST_P(MipMapReadImageTest, GivenImageWithMipLevelNonZeroWhenReadImageIsCalledThenProperMipLevelIsSet) {
auto image_type = (cl_mem_object_type)GetParam();
auto &origBuilder = BuiltIns::getInstance().getBuiltinDispatchInfoBuilder(
EBuiltInOps::CopyImage3dToBuffer,
pCmdQ->getContext(),
pCmdQ->getDevice());
// substitute original builder with mock builder
auto oldBuilder = BuiltIns::getInstance().setBuiltinDispatchInfoBuilder(
EBuiltInOps::CopyImage3dToBuffer,
pCmdQ->getContext(),
pCmdQ->getDevice(),
std::unique_ptr<OCLRT::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder(BuiltIns::getInstance(), &origBuilder)));
cl_int retVal = CL_SUCCESS;
cl_image_desc imageDesc = {};
uint32_t expectedMipLevel = 3;
imageDesc.image_type = image_type;
imageDesc.num_mip_levels = 10;
imageDesc.image_width = 4;
imageDesc.image_height = 1;
imageDesc.image_depth = 1;
size_t origin[] = {0, 0, 0, 0};
size_t region[] = {imageDesc.image_width, 1, 1};
std::unique_ptr<Image> image;
switch (image_type) {
case CL_MEM_OBJECT_IMAGE1D:
origin[1] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image1dDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE1D_ARRAY:
imageDesc.image_array_size = 2;
origin[2] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image1dArrayDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE2D:
origin[2] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image2dDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE2D_ARRAY:
imageDesc.image_array_size = 2;
origin[3] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image2dArrayDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE3D:
origin[3] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image3dDefaults>::create(context, &imageDesc));
break;
}
EXPECT_NE(nullptr, image.get());
std::unique_ptr<uint32_t[]> ptr = std::unique_ptr<uint32_t[]>(new uint32_t[3]);
retVal = pCmdQ->enqueueReadImage(image.get(),
CL_FALSE,
origin,
region,
0,
0,
ptr.get(),
0,
nullptr,
nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
auto &mockBuilder = static_cast<MockBuiltinDispatchInfoBuilder &>(BuiltIns::getInstance().getBuiltinDispatchInfoBuilder(EBuiltInOps::CopyImage3dToBuffer,
pCmdQ->getContext(),
pCmdQ->getDevice()));
auto params = mockBuilder.getBuiltinOpParams();
EXPECT_EQ(expectedMipLevel, params->srcMipLevel);
// restore original builder and retrieve mock builder
auto newBuilder = BuiltIns::getInstance().setBuiltinDispatchInfoBuilder(
EBuiltInOps::CopyImage3dToBuffer,
pCmdQ->getContext(),
pCmdQ->getDevice(),
std::move(oldBuilder));
EXPECT_NE(nullptr, newBuilder);
}
INSTANTIATE_TEST_CASE_P(MipMapReadImageTest_GivenImageWithMipLevelNonZeroWhenWriteImageIsCalledThenProperMipLevelIsSet,
MipMapReadImageTest, ::testing::Values(CL_MEM_OBJECT_IMAGE1D, CL_MEM_OBJECT_IMAGE1D_ARRAY, CL_MEM_OBJECT_IMAGE2D, CL_MEM_OBJECT_IMAGE2D_ARRAY, CL_MEM_OBJECT_IMAGE3D));
using NegativeFailAllocationTest = Test<NegativeFailAllocationCommandEnqueueBaseFixture>;
HWTEST_F(NegativeFailAllocationTest, givenEnqueueWriteImageWhenHostPtrAllocationCreationFailsThenReturnOutOfResource) {

View File

@@ -69,4 +69,8 @@ struct EnqueueWriteImageTest : public CommandEnqueueFixture,
Image *dstImage;
MockContext *context;
};
}
struct EnqueueWriteImageMipMapTest : public EnqueueWriteImageTest,
public ::testing::WithParamInterface<uint32_t> {
};
} // namespace OCLRT

View File

@@ -24,6 +24,7 @@
#include "runtime/memory_manager/memory_manager.h"
#include "test.h"
#include "runtime/gen_common/reg_configs.h"
#include "unit_tests/mocks/mock_builtin_dispatch_info_builder.h"
using namespace OCLRT;
@@ -547,6 +548,7 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage3DAndImageShareTheSameStorageWithHostP
pEvent->release();
}
HWTEST_F(EnqueueWriteImageTest, GivenNonZeroCopyImage2DAndImageShareTheSameStorageWithHostPtrWhenReadWriteImageIsCalledThenImageIsWritten) {
cl_int retVal = CL_SUCCESS;
std::unique_ptr<Image> dstImage2(ImageHelper<ImageUseHostPtr<Image2dDefaults>>::create(context));
@@ -574,6 +576,92 @@ HWTEST_F(EnqueueWriteImageTest, GivenNonZeroCopyImage2DAndImageShareTheSameStora
EXPECT_EQ(pCmdQ->taskLevel, 2u);
}
typedef EnqueueWriteImageMipMapTest MipMapWriteImageTest;
HWTEST_P(MipMapWriteImageTest, GivenImageWithMipLevelNonZeroWhenReadImageIsCalledThenProperMipLevelIsSet) {
auto image_type = (cl_mem_object_type)GetParam();
auto &origBuilder = BuiltIns::getInstance().getBuiltinDispatchInfoBuilder(
EBuiltInOps::CopyBufferToImage3d,
pCmdQ->getContext(),
pCmdQ->getDevice());
// substitute original builder with mock builder
auto oldBuilder = BuiltIns::getInstance().setBuiltinDispatchInfoBuilder(
EBuiltInOps::CopyBufferToImage3d,
pCmdQ->getContext(),
pCmdQ->getDevice(),
std::unique_ptr<OCLRT::BuiltinDispatchInfoBuilder>(new MockBuiltinDispatchInfoBuilder(BuiltIns::getInstance(), &origBuilder)));
cl_int retVal = CL_SUCCESS;
cl_image_desc imageDesc = {};
uint32_t expectedMipLevel = 3;
imageDesc.image_type = image_type;
imageDesc.num_mip_levels = 10;
imageDesc.image_width = 4;
imageDesc.image_height = 1;
imageDesc.image_depth = 1;
size_t origin[] = {0, 0, 0, 0};
size_t region[] = {imageDesc.image_width, 1, 1};
std::unique_ptr<Image> image;
switch (image_type) {
case CL_MEM_OBJECT_IMAGE1D:
origin[1] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image1dDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE1D_ARRAY:
imageDesc.image_array_size = 2;
origin[2] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image1dArrayDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE2D:
origin[2] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image2dDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE2D_ARRAY:
imageDesc.image_array_size = 2;
origin[3] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image2dArrayDefaults>::create(context, &imageDesc));
break;
case CL_MEM_OBJECT_IMAGE3D:
origin[3] = expectedMipLevel;
image = std::unique_ptr<Image>(ImageHelper<Image3dDefaults>::create(context, &imageDesc));
break;
}
EXPECT_NE(nullptr, image.get());
std::unique_ptr<uint32_t[]> ptr = std::unique_ptr<uint32_t[]>(new uint32_t[3]);
retVal = pCmdQ->enqueueWriteImage(image.get(),
CL_FALSE,
origin,
region,
0,
0,
ptr.get(),
0,
nullptr,
nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
auto &mockBuilder = static_cast<MockBuiltinDispatchInfoBuilder &>(BuiltIns::getInstance().getBuiltinDispatchInfoBuilder(EBuiltInOps::CopyBufferToImage3d,
pCmdQ->getContext(),
pCmdQ->getDevice()));
auto params = mockBuilder.getBuiltinOpParams();
EXPECT_EQ(expectedMipLevel, params->dstMipLevel);
// restore original builder and retrieve mock builder
auto newBuilder = BuiltIns::getInstance().setBuiltinDispatchInfoBuilder(
EBuiltInOps::CopyBufferToImage3d,
pCmdQ->getContext(),
pCmdQ->getDevice(),
std::move(oldBuilder));
EXPECT_NE(nullptr, newBuilder);
}
INSTANTIATE_TEST_CASE_P(MipMapWriteImageTest_GivenImageWithMipLevelNonZeroWhenReadImageIsCalledThenProperMipLevelIsSet,
MipMapWriteImageTest, ::testing::Values(CL_MEM_OBJECT_IMAGE1D, CL_MEM_OBJECT_IMAGE1D_ARRAY, CL_MEM_OBJECT_IMAGE2D, CL_MEM_OBJECT_IMAGE2D_ARRAY, CL_MEM_OBJECT_IMAGE3D));
using NegativeFailAllocationTest = Test<NegativeFailAllocationCommandEnqueueBaseFixture>;
HWTEST_F(NegativeFailAllocationTest, givenEnqueueReadImageWhenHostPtrAllocationCreationFailsThenReturnOutOfResource) {