mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-29 17:13:29 +08:00
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:
committed by
Wojciech Woloszyn
parent
214b407353
commit
0ad81024b7
@@ -69,4 +69,8 @@ struct EnqueueReadImageTest : public CommandEnqueueFixture,
|
||||
Image *srcImage;
|
||||
MockContext *context;
|
||||
};
|
||||
}
|
||||
|
||||
struct EnqueueReadImageMipMapTest : public EnqueueReadImageTest,
|
||||
public ::testing::WithParamInterface<uint32_t> {
|
||||
};
|
||||
} // namespace OCLRT
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -69,4 +69,8 @@ struct EnqueueWriteImageTest : public CommandEnqueueFixture,
|
||||
Image *dstImage;
|
||||
MockContext *context;
|
||||
};
|
||||
}
|
||||
|
||||
struct EnqueueWriteImageMipMapTest : public EnqueueWriteImageTest,
|
||||
public ::testing::WithParamInterface<uint32_t> {
|
||||
};
|
||||
} // namespace OCLRT
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user