2018-02-18 05:26:28 +08:00
|
|
|
/*
|
2019-02-27 18:39:32 +08:00
|
|
|
* Copyright (C) 2018-2019 Intel Corporation
|
2018-02-18 05:26:28 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2018-02-18 05:26:28 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "runtime/command_queue/command_queue_hw.h"
|
2018-10-29 17:38:53 +08:00
|
|
|
#include "runtime/event/user_event.h"
|
2019-02-27 18:39:32 +08:00
|
|
|
#include "runtime/gmm_helper/gmm_helper.h"
|
|
|
|
#include "test.h"
|
2018-02-18 05:26:28 +08:00
|
|
|
#include "unit_tests/fixtures/device_fixture.h"
|
|
|
|
#include "unit_tests/fixtures/image_fixture.h"
|
2019-09-10 13:42:00 +08:00
|
|
|
#include "unit_tests/helpers/unit_test_helper.h"
|
2019-08-26 15:27:30 +08:00
|
|
|
#include "unit_tests/helpers/variable_backup.h"
|
2018-02-18 05:26:28 +08:00
|
|
|
#include "unit_tests/mocks/mock_context.h"
|
|
|
|
|
2019-08-26 15:27:30 +08:00
|
|
|
namespace NEO {
|
|
|
|
extern ImageFuncs imageFactory[IGFX_MAX_CORE];
|
2018-02-18 05:26:28 +08:00
|
|
|
|
|
|
|
struct MultipleMapImageTest : public DeviceFixture, public ::testing::Test {
|
|
|
|
template <typename T>
|
|
|
|
struct MockImage : public ImageHw<T> {
|
|
|
|
using Image::mapOperationsHandler;
|
2019-08-26 15:27:30 +08:00
|
|
|
using ImageHw<T>::isZeroCopy;
|
|
|
|
using ImageHw<T>::ImageHw;
|
|
|
|
|
|
|
|
static Image *createMockImage(Context *context,
|
2019-10-09 23:29:00 +08:00
|
|
|
const MemoryPropertiesFlags &memoryProperties,
|
2019-09-24 22:05:17 +08:00
|
|
|
uint64_t flags,
|
|
|
|
uint64_t flagsIntel,
|
2019-08-26 15:27:30 +08:00
|
|
|
size_t size,
|
|
|
|
void *hostPtr,
|
|
|
|
const cl_image_format &imageFormat,
|
|
|
|
const cl_image_desc &imageDesc,
|
|
|
|
bool zeroCopy,
|
|
|
|
GraphicsAllocation *graphicsAllocation,
|
|
|
|
bool isObjectRedescribed,
|
|
|
|
uint32_t baseMipLevel,
|
|
|
|
uint32_t mipCount,
|
|
|
|
const SurfaceFormatInfo *surfaceFormatInfo,
|
|
|
|
const SurfaceOffsets *surfaceOffsets) {
|
2019-10-09 23:29:00 +08:00
|
|
|
return new MockImage<T>(context, memoryProperties, flags, flagsIntel, size, hostPtr, imageFormat, imageDesc, zeroCopy, graphicsAllocation,
|
2019-08-26 15:27:30 +08:00
|
|
|
isObjectRedescribed, baseMipLevel, mipCount, *surfaceFormatInfo, surfaceOffsets);
|
2018-02-18 05:26:28 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
void transferDataToHostPtr(MemObjSizeArray ©Size, MemObjOffsetArray ©Offset) override {
|
|
|
|
copyRegion = copySize;
|
|
|
|
copyOrigin = copyOffset;
|
|
|
|
transferToHostPtrCalled++;
|
|
|
|
};
|
|
|
|
void transferDataFromHostPtr(MemObjSizeArray ©Size, MemObjOffsetArray ©Offset) override {
|
|
|
|
copyRegion = copySize;
|
|
|
|
copyOrigin = copyOffset;
|
|
|
|
transferFromHostPtrCalled++;
|
|
|
|
};
|
|
|
|
|
|
|
|
MemObjSizeArray copyRegion = {{0, 0, 0}};
|
|
|
|
MemObjOffsetArray copyOrigin = {{0, 0, 0}};
|
|
|
|
uint32_t transferToHostPtrCalled = 0;
|
|
|
|
uint32_t transferFromHostPtrCalled = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
struct MockCmdQ : public CommandQueueHw<T> {
|
|
|
|
MockCmdQ(Context *context, Device *device) : CommandQueueHw<T>(context, device, 0) {}
|
|
|
|
|
|
|
|
cl_int enqueueReadImage(Image *srcImage, cl_bool blockingRead, const size_t *origin, const size_t *region, size_t rowPitch, size_t slicePitch, void *ptr,
|
2019-04-16 00:17:28 +08:00
|
|
|
GraphicsAllocation *mapAllocation, cl_uint numEventsInWaitList, const cl_event *eventWaitList, cl_event *event) override {
|
2018-02-18 05:26:28 +08:00
|
|
|
enqueueRegion = {{region[0], region[1], region[2]}};
|
|
|
|
enqueueOrigin = {{origin[0], origin[1], origin[2]}};
|
|
|
|
readImageCalled++;
|
|
|
|
if (failOnReadImage) {
|
|
|
|
return CL_OUT_OF_RESOURCES;
|
|
|
|
}
|
2019-04-16 00:17:28 +08:00
|
|
|
return CommandQueueHw<T>::enqueueReadImage(srcImage, blockingRead, origin, region, rowPitch, slicePitch, ptr, mapAllocation, numEventsInWaitList, eventWaitList, event);
|
2018-02-18 05:26:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
cl_int enqueueWriteImage(Image *dstImage, cl_bool blockingWrite, const size_t *origin, const size_t *region, size_t inputRowPitch,
|
2019-04-16 00:17:28 +08:00
|
|
|
size_t inputSlicePitch, const void *ptr, GraphicsAllocation *mapAllocation, cl_uint numEventsInWaitList, const cl_event *eventWaitList,
|
2018-02-18 05:26:28 +08:00
|
|
|
cl_event *event) override {
|
|
|
|
enqueueRegion = {{region[0], region[1], region[2]}};
|
|
|
|
enqueueOrigin = {{origin[0], origin[1], origin[2]}};
|
|
|
|
unmapPtr = ptr;
|
|
|
|
writeImageCalled++;
|
|
|
|
if (failOnWriteImage) {
|
|
|
|
return CL_OUT_OF_RESOURCES;
|
|
|
|
}
|
|
|
|
return CommandQueueHw<T>::enqueueWriteImage(dstImage, blockingWrite, origin, region, inputRowPitch, inputSlicePitch, ptr,
|
2019-04-16 00:17:28 +08:00
|
|
|
mapAllocation, numEventsInWaitList, eventWaitList, event);
|
2018-02-18 05:26:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
cl_int enqueueMarkerWithWaitList(cl_uint numEventsInWaitList, const cl_event *eventWaitList, cl_event *event) override {
|
|
|
|
enqueueMarkerCalled++;
|
|
|
|
return CommandQueueHw<T>::enqueueMarkerWithWaitList(numEventsInWaitList, eventWaitList, event);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t writeImageCalled = 0;
|
|
|
|
uint32_t readImageCalled = 0;
|
|
|
|
uint32_t enqueueMarkerCalled = 0;
|
|
|
|
bool failOnReadImage = false;
|
|
|
|
bool failOnWriteImage = false;
|
|
|
|
MemObjSizeArray enqueueRegion = {{0, 0, 0}};
|
|
|
|
MemObjOffsetArray enqueueOrigin = {{0, 0, 0}};
|
|
|
|
const void *unmapPtr = nullptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename Traits, typename FamilyType>
|
|
|
|
std::unique_ptr<MockImage<FamilyType>> createMockImage() {
|
2019-08-26 15:27:30 +08:00
|
|
|
auto eRenderCoreFamily = pDevice->getExecutionEnvironment()->getHardwareInfo()->platform.eRenderCoreFamily;
|
|
|
|
|
|
|
|
VariableBackup<ImageCreatFunc> backup(&imageFactory[eRenderCoreFamily].createImageFunction);
|
|
|
|
imageFactory[eRenderCoreFamily].createImageFunction = MockImage<FamilyType>::createMockImage;
|
2018-02-18 05:26:28 +08:00
|
|
|
|
|
|
|
auto surfaceFormat = Image::getSurfaceFormatFromTable(Traits::flags, &Traits::imageFormat);
|
2019-08-26 15:27:30 +08:00
|
|
|
|
|
|
|
cl_int retVal = CL_SUCCESS;
|
2019-10-23 01:51:53 +08:00
|
|
|
auto img = Image::create(context, MemoryPropertiesFlagsParser::createMemoryPropertiesFlags(Traits::flags, 0), Traits::flags, 0, surfaceFormat, &Traits::imageDesc, Traits::hostPtr, retVal);
|
2019-08-26 15:27:30 +08:00
|
|
|
auto mockImage = static_cast<MockImage<FamilyType> *>(img);
|
|
|
|
|
|
|
|
return std::unique_ptr<MockImage<FamilyType>>(mockImage);
|
2018-02-18 05:26:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename FamilyType>
|
|
|
|
std::unique_ptr<MockCmdQ<FamilyType>> createMockCmdQ() {
|
|
|
|
return std::unique_ptr<MockCmdQ<FamilyType>>(new MockCmdQ<FamilyType>(context, pDevice));
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetUp() override {
|
|
|
|
DeviceFixture::SetUp();
|
|
|
|
context = new MockContext(pDevice);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TearDown() override {
|
2018-05-28 22:16:06 +08:00
|
|
|
delete context;
|
2018-02-18 05:26:28 +08:00
|
|
|
DeviceFixture::TearDown();
|
|
|
|
}
|
|
|
|
|
|
|
|
MockContext *context = nullptr;
|
|
|
|
cl_int retVal = CL_INVALID_VALUE;
|
|
|
|
};
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenValidReadAndWriteImageWhenMappedOnGpuThenAddMappedPtrAndRemoveOnUnmap) {
|
2019-09-10 13:42:00 +08:00
|
|
|
if (!UnitTestHelper<FamilyType>::tiledImagesSupported) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2018-03-07 21:37:09 +08:00
|
|
|
auto image = createMockImage<Image3dDefaults, FamilyType>();
|
2018-02-18 05:26:28 +08:00
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
EXPECT_FALSE(image->mappingOnCpuAllowed());
|
|
|
|
|
|
|
|
MemObjOffsetArray origin = {{1, 2, 1}};
|
|
|
|
MemObjSizeArray region = {{3, 4, 1}};
|
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_WRITE, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, region);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, origin);
|
|
|
|
EXPECT_EQ(cmdQ->readImageCalled, 1u);
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, region);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, origin);
|
|
|
|
EXPECT_EQ(cmdQ->unmapPtr, mappedPtr);
|
|
|
|
EXPECT_EQ(cmdQ->writeImageCalled, 1u);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenReadOnlyMapWhenUnmappedOnGpuThenEnqueueMarker) {
|
2019-09-10 13:42:00 +08:00
|
|
|
if (!UnitTestHelper<FamilyType>::tiledImagesSupported) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2018-03-07 21:37:09 +08:00
|
|
|
auto image = createMockImage<Image3dDefaults, FamilyType>();
|
2018-02-18 05:26:28 +08:00
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
EXPECT_FALSE(image->mappingOnCpuAllowed());
|
|
|
|
|
|
|
|
MemObjOffsetArray origin = {{1, 2, 1}};
|
|
|
|
MemObjSizeArray region = {{3, 4, 1}};
|
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_READ, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, region);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, origin);
|
|
|
|
EXPECT_EQ(cmdQ->readImageCalled, 1u);
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->writeImageCalled, 0u);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueMarkerCalled, 1u);
|
|
|
|
}
|
|
|
|
|
2019-09-10 13:42:00 +08:00
|
|
|
HWTEST_F(MultipleMapImageTest, givenNotMappedPtrWhenUnmapedThenReturnError) {
|
2018-02-18 05:26:28 +08:00
|
|
|
auto image = createMockImage<Image2dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
2019-09-10 13:42:00 +08:00
|
|
|
EXPECT_EQ(!UnitTestHelper<FamilyType>::tiledImagesSupported, image->mappingOnCpuAllowed());
|
2018-02-18 05:26:28 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), image->getBasePtrForMap(), 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(CL_INVALID_VALUE, retVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenErrorFromReadImageWhenMappedOnGpuThenDontAddMappedPtr) {
|
2019-09-10 13:42:00 +08:00
|
|
|
if (!UnitTestHelper<FamilyType>::tiledImagesSupported) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2018-03-07 21:37:09 +08:00
|
|
|
auto image = createMockImage<Image3dDefaults, FamilyType>();
|
2018-02-18 05:26:28 +08:00
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
EXPECT_FALSE(image->mappingOnCpuAllowed());
|
|
|
|
cmdQ->failOnReadImage = true;
|
|
|
|
|
|
|
|
size_t origin[] = {2, 1, 1};
|
|
|
|
size_t region[] = {2, 1, 1};
|
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_READ, origin, region, nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_EQ(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenErrorFromWriteImageWhenUnmappedOnGpuThenDontRemoveMappedPtr) {
|
2019-09-10 13:42:00 +08:00
|
|
|
if (!UnitTestHelper<FamilyType>::tiledImagesSupported) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2018-03-07 21:37:09 +08:00
|
|
|
auto image = createMockImage<Image3dDefaults, FamilyType>();
|
2018-02-18 05:26:28 +08:00
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
EXPECT_FALSE(image->mappingOnCpuAllowed());
|
|
|
|
cmdQ->failOnWriteImage = true;
|
|
|
|
|
|
|
|
size_t origin[] = {2, 1, 1};
|
|
|
|
size_t region[] = {2, 1, 1};
|
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_WRITE, origin, region, nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
|
|
|
|
EXPECT_EQ(cmdQ->writeImageCalled, 1u);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenUnblockedQueueWhenMappedOnCpuThenAddMappedPtrAndRemoveOnUnmap) {
|
|
|
|
auto image = createMockImage<Image1dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
2019-08-26 15:27:30 +08:00
|
|
|
image->isZeroCopy = false;
|
2018-02-18 05:26:28 +08:00
|
|
|
EXPECT_TRUE(image->mappingOnCpuAllowed());
|
|
|
|
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjOffsetArray origin = {{1, 0, 0}};
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjSizeArray region = {{3, 1, 1}};
|
2018-02-18 05:26:28 +08:00
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_WRITE, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(1u, image->transferToHostPtrCalled);
|
|
|
|
EXPECT_EQ(image->copyRegion, region);
|
|
|
|
EXPECT_EQ(image->copyOrigin, origin);
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(1u, image->transferFromHostPtrCalled);
|
|
|
|
EXPECT_EQ(image->copyRegion, region);
|
|
|
|
EXPECT_EQ(image->copyOrigin, origin);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenUnblockedQueueWhenReadOnlyMappedOnCpuThenDontMakeCpuCopy) {
|
|
|
|
auto image = createMockImage<Image1dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
2019-08-26 15:27:30 +08:00
|
|
|
image->isZeroCopy = false;
|
|
|
|
|
2018-02-18 05:26:28 +08:00
|
|
|
EXPECT_TRUE(image->mappingOnCpuAllowed());
|
|
|
|
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjOffsetArray origin = {{1, 0, 0}};
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjSizeArray region = {{3, 1, 1}};
|
2018-02-18 05:26:28 +08:00
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_READ, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(1u, image->transferToHostPtrCalled);
|
|
|
|
EXPECT_EQ(image->copyRegion, region);
|
|
|
|
EXPECT_EQ(image->copyOrigin, origin);
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(0u, image->transferFromHostPtrCalled);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenBlockedQueueWhenMappedOnCpuThenAddMappedPtrAndRemoveOnUnmap) {
|
|
|
|
auto image = createMockImage<Image1dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
2019-08-26 15:27:30 +08:00
|
|
|
image->isZeroCopy = false;
|
|
|
|
|
2018-02-18 05:26:28 +08:00
|
|
|
EXPECT_TRUE(image->mappingOnCpuAllowed());
|
|
|
|
|
|
|
|
UserEvent mapEvent, unmapEvent;
|
|
|
|
cl_event clMapEvent = &mapEvent;
|
|
|
|
cl_event clUnmapEvent = &unmapEvent;
|
|
|
|
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjOffsetArray origin = {{1, 0, 0}};
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjSizeArray region = {{3, 1, 1}};
|
2018-02-18 05:26:28 +08:00
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_FALSE, CL_MAP_WRITE, &origin[0], ®ion[0], nullptr, nullptr, 1, &clMapEvent, nullptr, &retVal);
|
|
|
|
mapEvent.setStatus(CL_COMPLETE);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->transferToHostPtrCalled);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(image->copyRegion, region);
|
|
|
|
EXPECT_EQ(image->copyOrigin, origin);
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 1, &clUnmapEvent, nullptr);
|
|
|
|
unmapEvent.setStatus(CL_COMPLETE);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(1u, image->transferFromHostPtrCalled);
|
|
|
|
EXPECT_EQ(image->copyRegion, region);
|
|
|
|
EXPECT_EQ(image->copyOrigin, origin);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenBlockedQueueWhenMappedReadOnlyOnCpuThenDontMakeCpuCopy) {
|
|
|
|
auto image = createMockImage<Image1dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
2019-08-26 15:27:30 +08:00
|
|
|
image->isZeroCopy = false;
|
|
|
|
|
2018-02-18 05:26:28 +08:00
|
|
|
EXPECT_TRUE(image->mappingOnCpuAllowed());
|
|
|
|
|
|
|
|
UserEvent mapEvent, unmapEvent;
|
|
|
|
cl_event clMapEvent = &mapEvent;
|
|
|
|
cl_event clUnmapEvent = &unmapEvent;
|
|
|
|
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjOffsetArray origin = {{1, 0, 0}};
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjSizeArray region = {{3, 1, 1}};
|
2018-02-18 05:26:28 +08:00
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_FALSE, CL_MAP_READ, &origin[0], ®ion[0], nullptr, nullptr, 1, &clMapEvent, nullptr, &retVal);
|
|
|
|
mapEvent.setStatus(CL_COMPLETE);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(1u, image->transferToHostPtrCalled);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(image->copyRegion, region);
|
|
|
|
EXPECT_EQ(image->copyOrigin, origin);
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtr, 1, &clUnmapEvent, nullptr);
|
|
|
|
unmapEvent.setStatus(CL_COMPLETE);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(0u, image->transferFromHostPtrCalled);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenInvalidPtrWhenUnmappedOnCpuThenReturnError) {
|
|
|
|
auto image = createMockImage<Image1dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
EXPECT_TRUE(image->mappingOnCpuAllowed());
|
|
|
|
|
|
|
|
retVal = clEnqueueUnmapMemObject(cmdQ.get(), image.get(), image->getBasePtrForMap(), 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(CL_INVALID_VALUE, retVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenMultimpleMapsWhenUnmappingThenRemoveCorrectPointers) {
|
2019-09-10 13:42:00 +08:00
|
|
|
if (!UnitTestHelper<FamilyType>::tiledImagesSupported) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2018-02-18 05:26:28 +08:00
|
|
|
auto image = createMockImage<Image3dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
|
2018-08-24 21:23:45 +08:00
|
|
|
MapInfo mappedPtrs[3] = {{nullptr, 1, {{1, 1, 1}}, {{1, 1, 1}}, 0},
|
|
|
|
{nullptr, 1, {{2, 2, 2}}, {{2, 2, 2}}, 0},
|
|
|
|
{nullptr, 1, {{3, 5, 7}}, {{4, 4, 4}}, 0}};
|
2018-02-18 05:26:28 +08:00
|
|
|
|
|
|
|
for (size_t i = 0; i < 3; i++) {
|
|
|
|
mappedPtrs[i].ptr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_WRITE, &mappedPtrs[i].offset[0], &mappedPtrs[i].size[0],
|
|
|
|
nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtrs[i].ptr);
|
|
|
|
EXPECT_EQ(i + 1, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, mappedPtrs[i].size);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, mappedPtrs[i].offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
// reordered unmap
|
|
|
|
clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtrs[1].ptr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(2u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->unmapPtr, mappedPtrs[1].ptr);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, mappedPtrs[1].size);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, mappedPtrs[1].offset);
|
|
|
|
|
|
|
|
clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtrs[2].ptr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->unmapPtr, mappedPtrs[2].ptr);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, mappedPtrs[2].size);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, mappedPtrs[2].offset);
|
|
|
|
|
|
|
|
clEnqueueUnmapMemObject(cmdQ.get(), image.get(), mappedPtrs[0].ptr, 0, nullptr, nullptr);
|
|
|
|
EXPECT_EQ(0u, image->mapOperationsHandler.size());
|
|
|
|
EXPECT_EQ(cmdQ->unmapPtr, mappedPtrs[0].ptr);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueRegion, mappedPtrs[0].size);
|
|
|
|
EXPECT_EQ(cmdQ->enqueueOrigin, mappedPtrs[0].offset);
|
|
|
|
}
|
|
|
|
|
2019-09-10 13:42:00 +08:00
|
|
|
HWTEST_F(MultipleMapImageTest, givenOverlapingPtrWhenMappingForWriteThenReturnError) {
|
2018-03-07 21:37:09 +08:00
|
|
|
auto image = createMockImage<Image3dDefaults, FamilyType>();
|
2018-02-18 05:26:28 +08:00
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
2019-09-10 13:42:00 +08:00
|
|
|
EXPECT_EQ(!UnitTestHelper<FamilyType>::tiledImagesSupported, image->mappingOnCpuAllowed());
|
2018-02-18 05:26:28 +08:00
|
|
|
|
|
|
|
MemObjOffsetArray origin = {{1, 2, 1}};
|
|
|
|
MemObjSizeArray region = {{3, 4, 1}};
|
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_READ, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
|
|
|
|
origin[0]++;
|
|
|
|
void *mappedPtr2 = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_WRITE, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_EQ(nullptr, mappedPtr2);
|
|
|
|
EXPECT_EQ(CL_INVALID_OPERATION, retVal);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
}
|
|
|
|
|
|
|
|
HWTEST_F(MultipleMapImageTest, givenOverlapingPtrWhenMappingOnCpuForWriteThenReturnError) {
|
|
|
|
auto image = createMockImage<Image1dDefaults, FamilyType>();
|
|
|
|
auto cmdQ = createMockCmdQ<FamilyType>();
|
|
|
|
EXPECT_TRUE(image->mappingOnCpuAllowed());
|
|
|
|
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjOffsetArray origin = {{1, 0, 0}};
|
2018-03-07 21:37:09 +08:00
|
|
|
MemObjSizeArray region = {{3, 1, 1}};
|
2018-02-18 05:26:28 +08:00
|
|
|
void *mappedPtr = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_READ, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_NE(nullptr, mappedPtr);
|
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
|
|
|
|
origin[0]++;
|
|
|
|
void *mappedPtr2 = clEnqueueMapImage(cmdQ.get(), image.get(), CL_TRUE, CL_MAP_WRITE, &origin[0], ®ion[0], nullptr, nullptr, 0, nullptr, nullptr, &retVal);
|
|
|
|
EXPECT_EQ(nullptr, mappedPtr2);
|
|
|
|
EXPECT_EQ(CL_INVALID_OPERATION, retVal);
|
|
|
|
EXPECT_EQ(1u, image->mapOperationsHandler.size());
|
|
|
|
}
|
2019-08-26 15:27:30 +08:00
|
|
|
} // namespace NEO
|