clEnqueueMapImage origin and region usage fixes

- Return error on origin > 0 or region > 1 when its not allowed
- For 1Darray, array region and origin are stored on 2nd position.
  For 2Darray, its on 3rd postion
- Fix map offset for 1Darray image
- Fix CPU data transfer for 1Darray image

Change-Id: Id35ba5f54f117e7af318ca7e6e03c1fc942ce729
This commit is contained in:
Dunajski, Bartosz
2018-03-07 14:37:09 +01:00
parent 6db6c67957
commit 23c1c4fea6
8 changed files with 199 additions and 31 deletions

View File

@@ -24,6 +24,7 @@
#include "runtime/command_queue/command_queue.h"
#include "runtime/context/context.h"
#include "runtime/helpers/surface_formats.h"
#include "unit_tests/fixtures/image_fixture.h"
using namespace OCLRT;
@@ -124,6 +125,82 @@ TEST_F(clEnqueueMapImageTests, givenAnyZeroRegionParamWhenMapImageCalledThenRetu
EXPECT_EQ(CL_SUCCESS, retVal);
}
TEST_F(clEnqueueMapImageTests, givenSecondOriginCoordinateAndNotAllowedImgTypeWhenMapCalledThenReturnError) {
size_t region[3] = {1, 1, 1};
size_t origin[3] = {0, 1, 0};
std::unique_ptr<Image> image(ImageHelper<Image1dDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
auto image1dBufferDesc = Image1dDefaults::imageDesc;
image1dBufferDesc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
image.reset(ImageHelper<Image1dDefaults>::create(pContext, &image1dBufferDesc));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
}
TEST_F(clEnqueueMapImageTests, givenThirdOriginCoordinateAndNotAllowedImgTypeWhenMapCalledThenReturnError) {
size_t region[3] = {1, 1, 1};
size_t origin[3] = {0, 0, 1};
std::unique_ptr<Image> image(ImageHelper<Image1dDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
image.reset(ImageHelper<Image2dDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
image.reset(ImageHelper<Image1dArrayDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
auto image1dBufferDesc = Image1dDefaults::imageDesc;
image1dBufferDesc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
image.reset(ImageHelper<Image1dDefaults>::create(pContext, &image1dBufferDesc));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
}
TEST_F(clEnqueueMapImageTests, givenSecondRegionCoordinateAndNotAllowedImgTypeWhenMapCalledThenReturnError) {
size_t region[3] = {1, 2, 1};
size_t origin[3] = {0, 0, 0};
std::unique_ptr<Image> image(ImageHelper<Image1dDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
auto image1dBufferDesc = Image1dDefaults::imageDesc;
image1dBufferDesc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
image.reset(ImageHelper<Image1dDefaults>::create(pContext, &image1dBufferDesc));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
}
TEST_F(clEnqueueMapImageTests, givenThirdRegionnCoordinateAndNotAllowedImgTypeWhenMapCalledThenReturnError) {
size_t region[3] = {1, 1, 2};
size_t origin[3] = {0, 0, 0};
std::unique_ptr<Image> image(ImageHelper<Image1dDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
image.reset(ImageHelper<Image2dDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
image.reset(ImageHelper<Image1dArrayDefaults>::create(pContext));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
auto image1dBufferDesc = Image1dDefaults::imageDesc;
image1dBufferDesc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
image.reset(ImageHelper<Image1dDefaults>::create(pContext, &image1dBufferDesc));
clEnqueueMapImage(pCommandQueue, image.get(), CL_TRUE, CL_MAP_READ, origin, region, 0, 0, 0, nullptr, nullptr, &retVal);
EXPECT_EQ(CL_INVALID_VALUE, retVal);
}
struct clEnqueueMapImageYUVTests : public api_fixture,
public ::testing::Test {