Fix zeroCopy property for images
- zeroCopy means no need for data transfer when cpu transfer is chosen during map/unmap operations - tests cleanup Change-Id: Id312267e51d593781c6fe536b6e96f42f32e5c02
This commit is contained in:
parent
9ac3529c6b
commit
aaf2f94887
|
@ -250,7 +250,9 @@ Image *Image::create(Context *context,
|
|||
}
|
||||
} else {
|
||||
memory = memoryManager->allocateGraphicsMemoryForImage(imgInfo, gmm);
|
||||
zeroCopy = true;
|
||||
if (memory && MemoryPool::isSystemMemoryPool(memory->getMemoryPool())) {
|
||||
zeroCopy = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
transferNeeded |= !!(flags & CL_MEM_COPY_HOST_PTR);
|
||||
|
|
|
@ -209,7 +209,16 @@ void OsAgnosticMemoryManager::cleanOsHandles(OsHandleStorage &handleStorage) {
|
|||
}
|
||||
}
|
||||
GraphicsAllocation *OsAgnosticMemoryManager::allocateGraphicsMemoryForImage(ImageInfo &imgInfo, Gmm *gmm) {
|
||||
auto alloc = allocateGraphicsMemory(imgInfo.size);
|
||||
GraphicsAllocation *alloc = nullptr;
|
||||
if (!GmmHelper::allowTiling(*imgInfo.imgDesc) && imgInfo.mipCount == 0) {
|
||||
alloc = allocateGraphicsMemory(imgInfo.size);
|
||||
} else {
|
||||
auto ptr = allocateSystemMemory(alignUp(imgInfo.size, MemoryConstants::pageSize), MemoryConstants::pageSize);
|
||||
if (ptr != nullptr) {
|
||||
alloc = new MemoryAllocation(true, ptr, reinterpret_cast<uint64_t>(ptr), imgInfo.size, counter, MemoryPool::SystemCpuInaccessible);
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
if (alloc) {
|
||||
alloc->gmm = gmm;
|
||||
}
|
||||
|
|
|
@ -298,61 +298,6 @@ HWTEST_F(EnqueueReadImageTest, GivenImage1DAndImageShareTheSameStorageWithHostPt
|
|||
EXPECT_EQ(pCmdOOQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage2DAndImageShareTheSameStorageWithHostPtrWhenReadReadImageIsCalledThenImageIsNotRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image2dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdQ->enqueueReadImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage3DAndImageShareTheSameStorageWithHostPtrWhenReadReadImageIsCalledThenImageIsNotRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image3dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
std::unique_ptr<CommandQueue> pCmdOOQ(createCommandQueue(pDevice, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE));
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, imageDesc.image_depth};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdOOQ->enqueueReadImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdOOQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage1DArrayAndImageShareTheSameStorageWithHostPtrWhenReadReadImageIsCalledThenImageIsNotRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image1dArrayHelper<>::create(context));
|
||||
|
@ -382,143 +327,21 @@ HWTEST_F(EnqueueReadImageTest, GivenImage1DArrayAndImageShareTheSameStorageWithH
|
|||
EXPECT_EQ(pCmdQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage2DArrayAndImageShareTheSameStorageWithHostPtrWhenReadReadImageIsCalledThenImageIsNotRead) {
|
||||
HWTEST_F(EnqueueReadImageTest, GivenSharedContextZeroCopy2DImageWhenEnqueueReadImageWithMappedPointerIsCalledThenImageIsNotRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image2dArrayHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
std::unique_ptr<CommandQueue> pCmdOOQ(createCommandQueue(pDevice, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE));
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, imageDesc.image_array_size};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdOOQ->enqueueReadImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
context->isSharedContext = true;
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
std::unique_ptr<Image> dstImage(ImageHelper<ImageUseHostPtr<Image2dDefaults>>::create(context));
|
||||
EXPECT_TRUE(dstImage->isMemObjZeroCopy());
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdOOQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage2DAndImageShareTheSameStorageWithHostPtrAndEventsWhenReadReadImageIsCalledThenImageIsNotRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image2dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
auto imageDesc = dstImage->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
void *ptr = dstImage->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
uint32_t taskLevelCmdQ = 17;
|
||||
pCmdQ->taskLevel = taskLevelCmdQ;
|
||||
|
||||
uint32_t taskLevelEvent1 = 8;
|
||||
uint32_t taskLevelEvent2 = 19;
|
||||
Event event1(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent1, 4);
|
||||
Event event2(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent2, 10);
|
||||
|
||||
cl_event eventWaitList[] =
|
||||
{
|
||||
&event1,
|
||||
&event2};
|
||||
cl_uint numEventsInWaitList = sizeof(eventWaitList) / sizeof(eventWaitList[0]);
|
||||
cl_event event = nullptr;
|
||||
|
||||
retVal = pCmdQ->enqueueReadImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
&event);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, event);
|
||||
|
||||
auto pEvent = (Event *)event;
|
||||
EXPECT_EQ(19u, pEvent->taskLevel);
|
||||
EXPECT_EQ(19u, pCmdQ->taskLevel);
|
||||
EXPECT_EQ(CL_COMMAND_READ_IMAGE, (const int)pEvent->getCommandType());
|
||||
|
||||
pEvent->release();
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage3DAndImageShareTheSameStorageWithHostPtrAndEventsWhenReadReadImageIsCalledThenImageIsNotRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image3dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
std::unique_ptr<CommandQueue> pCmdOOQ(createCommandQueue(pDevice, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE));
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, imageDesc.image_depth};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
|
||||
uint32_t taskLevelCmdQ = 17;
|
||||
pCmdOOQ->taskLevel = taskLevelCmdQ;
|
||||
|
||||
uint32_t taskLevelEvent1 = 8;
|
||||
uint32_t taskLevelEvent2 = 19;
|
||||
Event event1(pCmdOOQ.get(), CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent1, 4);
|
||||
Event event2(pCmdOOQ.get(), CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent2, 10);
|
||||
|
||||
cl_event eventWaitList[] =
|
||||
{
|
||||
&event1,
|
||||
&event2};
|
||||
cl_uint numEventsInWaitList = sizeof(eventWaitList) / sizeof(eventWaitList[0]);
|
||||
cl_event event = nullptr;
|
||||
|
||||
retVal = pCmdOOQ->enqueueReadImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
&event);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, event);
|
||||
|
||||
auto pEvent = (Event *)event;
|
||||
EXPECT_EQ(19u, pEvent->taskLevel);
|
||||
EXPECT_EQ(19u, pCmdOOQ->taskLevel);
|
||||
EXPECT_EQ(CL_COMMAND_READ_IMAGE, (const int)pEvent->getCommandType());
|
||||
|
||||
pEvent->release();
|
||||
}
|
||||
HWTEST_F(EnqueueReadImageTest, GivenNonZeroCopyImage2DAndImageShareTheSameStorageWithHostPtrWhenReadReadImageIsCalledThenImageIsRead) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(ImageHelper<ImageUseHostPtr<Image2dDefaults>>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdQ->enqueueReadImage(dstImage2.get(),
|
||||
size_t rowPitch = dstImage->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage->getHostPtrSlicePitch();
|
||||
retVal = pCmdQ->enqueueReadImage(dstImage.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
|
@ -532,7 +355,42 @@ HWTEST_F(EnqueueReadImageTest, GivenNonZeroCopyImage2DAndImageShareTheSameStorag
|
|||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdQ->taskLevel, 2u);
|
||||
EXPECT_EQ(pCmdQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, GivenImage1DThatIsZeroCopyWhenReadImageWithTheSamePointerAndOutputEventIsPassedThenEventHasCorrectCommandTypeSet) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage(Image1dHelper<>::create(context));
|
||||
auto imageDesc = dstImage->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage->getCpuAddressForMemoryTransfer();
|
||||
size_t rowPitch = dstImage->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage->getHostPtrSlicePitch();
|
||||
|
||||
cl_uint numEventsInWaitList = 0;
|
||||
cl_event event = nullptr;
|
||||
|
||||
retVal = pCmdQ->enqueueReadImage(dstImage.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
numEventsInWaitList,
|
||||
nullptr,
|
||||
&event);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, event);
|
||||
|
||||
auto pEvent = static_cast<Event *>(event);
|
||||
EXPECT_EQ(static_cast<cl_command_type>(CL_COMMAND_READ_IMAGE), pEvent->getCommandType());
|
||||
|
||||
pEvent->release();
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueReadImageTest, givenCommandQueueWhenEnqueueReadImageIsCalledThenItCallsNotifyFunction) {
|
||||
|
|
|
@ -281,61 +281,6 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage1DAndImageShareTheSameStorageWithHostP
|
|||
EXPECT_EQ(pCmdOOQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage2DAndImageShareTheSameStorageWithHostPtrWhenReadWriteImageIsCalledThenImageIsNotWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image2dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdQ->enqueueWriteImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage3DAndImageShareTheSameStorageWithHostPtrWhenReadWriteImageIsCalledThenImageIsNotWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image3dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
std::unique_ptr<CommandQueue> pCmdOOQ(createCommandQueue(pDevice, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE));
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, imageDesc.image_depth};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdOOQ->enqueueWriteImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdOOQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage1DArrayAndImageShareTheSameStorageWithHostPtrWhenReadWriteImageIsCalledThenImageIsNotWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image1dArrayHelper<>::create(context));
|
||||
|
@ -365,59 +310,51 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage1DArrayAndImageShareTheSameStorageWith
|
|||
EXPECT_EQ(pCmdQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage2DArrayAndImageShareTheSameStorageWithHostPtrWhenReadWriteImageIsCalledThenImageIsNotWritten) {
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenSharedContextZeroCopy2DImageWhenEnqueueWriteImageWithMappedPointerIsCalledThenImageIsNotWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image2dArrayHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
std::unique_ptr<CommandQueue> pCmdOOQ(createCommandQueue(pDevice, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE));
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, imageDesc.image_array_size};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdOOQ->enqueueWriteImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
context->isSharedContext = true;
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
std::unique_ptr<Image> dstImage(ImageHelper<ImageUseHostPtr<Image2dDefaults>>::create(context));
|
||||
EXPECT_TRUE(dstImage->isMemObjZeroCopy());
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdOOQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage2DAndImageShareTheSameStorageWithHostPtrAndEventsWhenReadWriteImageIsCalledThenImageIsNotWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image2dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
auto imageDesc = dstImage->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
void *ptr = dstImage->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
uint32_t taskLevelCmdQ = 17;
|
||||
pCmdQ->taskLevel = taskLevelCmdQ;
|
||||
size_t rowPitch = dstImage->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage->getHostPtrSlicePitch();
|
||||
retVal = pCmdQ->enqueueReadImage(dstImage.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
uint32_t taskLevelEvent1 = 8;
|
||||
uint32_t taskLevelEvent2 = 19;
|
||||
Event event1(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent1, 4);
|
||||
Event event2(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent2, 10);
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
cl_event eventWaitList[] =
|
||||
{
|
||||
&event1,
|
||||
&event2};
|
||||
cl_uint numEventsInWaitList = sizeof(eventWaitList) / sizeof(eventWaitList[0]);
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdQ->taskLevel, 0u);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage1DThatIsZeroCopyWhenWriteImageWithTheSamePointerAndOutputEventIsPassedThenEventHasCorrectCommandTypeSet) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> srcImage(Image1dHelper<>::create(context));
|
||||
auto imageDesc = srcImage->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = srcImage->getCpuAddressForMemoryTransfer();
|
||||
size_t rowPitch = srcImage->getHostPtrRowPitch();
|
||||
size_t slicePitch = srcImage->getHostPtrSlicePitch();
|
||||
|
||||
cl_uint numEventsInWaitList = 0;
|
||||
cl_event event = nullptr;
|
||||
|
||||
retVal = pCmdQ->enqueueWriteImage(dstImage2.get(),
|
||||
retVal = pCmdQ->enqueueWriteImage(srcImage.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
|
@ -425,7 +362,7 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage2DAndImageShareTheSameStorageWithHostP
|
|||
slicePitch,
|
||||
ptr,
|
||||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
nullptr,
|
||||
&event);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
@ -433,92 +370,12 @@ HWTEST_F(EnqueueWriteImageTest, GivenImage2DAndImageShareTheSameStorageWithHostP
|
|||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, event);
|
||||
|
||||
auto pEvent = (Event *)event;
|
||||
EXPECT_EQ(19u, pEvent->taskLevel);
|
||||
EXPECT_EQ(19u, pCmdQ->taskLevel);
|
||||
EXPECT_EQ(CL_COMMAND_WRITE_IMAGE, (const int)pEvent->getCommandType());
|
||||
auto pEvent = static_cast<Event *>(event);
|
||||
EXPECT_EQ(static_cast<cl_command_type>(CL_COMMAND_WRITE_IMAGE), pEvent->getCommandType());
|
||||
|
||||
pEvent->release();
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenImage3DAndImageShareTheSameStorageWithHostPtrAndEventsWhenReadWriteImageIsCalledThenImageIsNotWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(Image3dHelper<>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
std::unique_ptr<CommandQueue> pCmdOOQ(createCommandQueue(pDevice, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE));
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, imageDesc.image_depth};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
|
||||
uint32_t taskLevelCmdQ = 17;
|
||||
pCmdOOQ->taskLevel = taskLevelCmdQ;
|
||||
|
||||
uint32_t taskLevelEvent1 = 8;
|
||||
uint32_t taskLevelEvent2 = 19;
|
||||
Event event1(pCmdOOQ.get(), CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent1, 4);
|
||||
Event event2(pCmdOOQ.get(), CL_COMMAND_NDRANGE_KERNEL, taskLevelEvent2, 10);
|
||||
|
||||
cl_event eventWaitList[] =
|
||||
{
|
||||
&event1,
|
||||
&event2};
|
||||
cl_uint numEventsInWaitList = sizeof(eventWaitList) / sizeof(eventWaitList[0]);
|
||||
cl_event event = nullptr;
|
||||
|
||||
retVal = pCmdOOQ->enqueueWriteImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
numEventsInWaitList,
|
||||
eventWaitList,
|
||||
&event);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, event);
|
||||
|
||||
auto pEvent = (Event *)event;
|
||||
EXPECT_EQ(19u, pEvent->taskLevel);
|
||||
EXPECT_EQ(19u, pCmdOOQ->taskLevel);
|
||||
EXPECT_EQ(CL_COMMAND_WRITE_IMAGE, (const int)pEvent->getCommandType());
|
||||
|
||||
pEvent->release();
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueWriteImageTest, GivenNonZeroCopyImage2DAndImageShareTheSameStorageWithHostPtrWhenReadWriteImageIsCalledThenImageIsWritten) {
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Image> dstImage2(ImageHelper<ImageUseHostPtr<Image2dDefaults>>::create(context));
|
||||
auto imageDesc = dstImage2->getImageDesc();
|
||||
size_t origin[] = {0, 0, 0};
|
||||
size_t region[] = {imageDesc.image_width, imageDesc.image_height, 1};
|
||||
void *ptr = dstImage2->getCpuAddressForMemoryTransfer();
|
||||
|
||||
size_t rowPitch = dstImage2->getHostPtrRowPitch();
|
||||
size_t slicePitch = dstImage2->getHostPtrSlicePitch();
|
||||
retVal = pCmdQ->enqueueWriteImage(dstImage2.get(),
|
||||
CL_FALSE,
|
||||
origin,
|
||||
region,
|
||||
rowPitch,
|
||||
slicePitch,
|
||||
ptr,
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
EXPECT_EQ(pCmdQ->taskLevel, 2u);
|
||||
}
|
||||
|
||||
typedef EnqueueWriteImageMipMapTest MipMapWriteImageTest;
|
||||
|
||||
HWTEST_P(MipMapWriteImageTest, GivenImageWithMipLevelNonZeroWhenReadImageIsCalledThenProperMipLevelIsSet) {
|
||||
|
|
|
@ -1699,18 +1699,20 @@ class OsAgnosticMemoryManagerForImagesWithNoHostPtr : public OsAgnosticMemoryMan
|
|||
return imageAllocation;
|
||||
};
|
||||
void freeGraphicsMemoryImpl(GraphicsAllocation *imageAllocation) override {
|
||||
imageAllocation->setCpuPtrAndGpuAddress(lockResourceParam.retCpuPtr, imageAllocation->getGpuAddress());
|
||||
imageAllocation->setCpuPtrAndGpuAddress(cpuPtr, imageAllocation->getGpuAddress());
|
||||
OsAgnosticMemoryManager::freeGraphicsMemoryImpl(imageAllocation);
|
||||
};
|
||||
void *lockResource(GraphicsAllocation *imageAllocation) override {
|
||||
lockResourceParam.wasCalled = true;
|
||||
lockResourceParam.inImageAllocation = imageAllocation;
|
||||
lockResourceParam.retCpuPtr = cpuPtr;
|
||||
lockCpuPtr = alignedMalloc(imageAllocation->getUnderlyingBufferSize(), MemoryConstants::pageSize);
|
||||
lockResourceParam.retCpuPtr = lockCpuPtr;
|
||||
return lockResourceParam.retCpuPtr;
|
||||
};
|
||||
void unlockResource(GraphicsAllocation *imageAllocation) override {
|
||||
unlockResourceParam.wasCalled = true;
|
||||
unlockResourceParam.inImageAllocation = imageAllocation;
|
||||
alignedFree(lockCpuPtr);
|
||||
};
|
||||
|
||||
struct LockResourceParam {
|
||||
|
@ -1725,6 +1727,7 @@ class OsAgnosticMemoryManagerForImagesWithNoHostPtr : public OsAgnosticMemoryMan
|
|||
|
||||
protected:
|
||||
void *cpuPtr = nullptr;
|
||||
void *lockCpuPtr = nullptr;
|
||||
};
|
||||
|
||||
HWTEST_F(AubCommandStreamReceiverTests, givenAubCommandStreamReceiverWhenWriteMemoryIsCalledOnImageWithNoHostPtrThenResourceShouldBeLockedToGetCpuAddress) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
@ -103,10 +103,7 @@ HWTEST_P(CreateImage2DType, validTypes) {
|
|||
}
|
||||
|
||||
EXPECT_EQ(image->getCubeFaceIndex(), static_cast<uint32_t>(__GMM_NO_CUBE_MAP));
|
||||
|
||||
ASSERT_EQ(true, image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
EXPECT_FALSE(image->isMemObjZeroCopy());
|
||||
|
||||
typedef typename FamilyType::RENDER_SURFACE_STATE SURFACE_STATE;
|
||||
auto imageHw = static_cast<ImageHw<FamilyType> *>(image);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
@ -89,10 +89,7 @@ HWTEST_F(CreateImage3DTest, validTypes) {
|
|||
EXPECT_NE(0u, imgDesc.image_row_pitch);
|
||||
|
||||
EXPECT_EQ(image->getCubeFaceIndex(), static_cast<uint32_t>(__GMM_NO_CUBE_MAP));
|
||||
|
||||
ASSERT_EQ(true, image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
EXPECT_FALSE(image->isMemObjZeroCopy());
|
||||
|
||||
typedef typename FamilyType::RENDER_SURFACE_STATE SURFACE_STATE;
|
||||
auto imageHw = static_cast<ImageHw<FamilyType> *>(image);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
@ -96,9 +96,15 @@ HWTEST_P(CreateImageArraySize, arrayTypes) {
|
|||
|
||||
ASSERT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, image);
|
||||
ASSERT_EQ(true, image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
|
||||
if (types == CL_MEM_OBJECT_IMAGE1D_ARRAY) {
|
||||
EXPECT_TRUE(image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
|
||||
} else if (types == CL_MEM_OBJECT_IMAGE2D_ARRAY) {
|
||||
EXPECT_FALSE(image->isMemObjZeroCopy());
|
||||
}
|
||||
ASSERT_EQ(10u, image->getImageDesc().image_array_size);
|
||||
|
||||
delete image;
|
||||
|
@ -129,9 +135,13 @@ HWTEST_P(CreateImageNonArraySize, NonArrayTypes) {
|
|||
|
||||
ASSERT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, image);
|
||||
ASSERT_EQ(true, image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
if (types == CL_MEM_OBJECT_IMAGE2D || types == CL_MEM_OBJECT_IMAGE3D) {
|
||||
EXPECT_FALSE(image->isMemObjZeroCopy());
|
||||
} else {
|
||||
EXPECT_TRUE(image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
}
|
||||
ASSERT_EQ(0u, image->getImageDesc().image_array_size);
|
||||
|
||||
delete image;
|
||||
|
@ -257,4 +267,4 @@ static cl_mem_object_type AllImageTypesWithBadOne[] = {
|
|||
INSTANTIATE_TEST_CASE_P(
|
||||
ImageArraySizeTest_Create,
|
||||
CreateImageOffset,
|
||||
testing::ValuesIn(AllImageTypesWithBadOne));
|
||||
testing::ValuesIn(AllImageTypesWithBadOne));
|
||||
|
|
|
@ -352,6 +352,7 @@ TEST(TestCreateImage, UseSharedContextToCreateImage) {
|
|||
|
||||
EXPECT_EQ((width + 1) * elementSize, image->getHostPtrRowPitch());
|
||||
EXPECT_EQ(0u, image->getHostPtrSlicePitch());
|
||||
EXPECT_TRUE(image->isMemObjZeroCopy());
|
||||
|
||||
delete image;
|
||||
|
||||
|
@ -424,9 +425,6 @@ TEST_P(CreateImageNoHostPtr, validFlags) {
|
|||
|
||||
ASSERT_EQ(CL_SUCCESS, retVal);
|
||||
ASSERT_NE(nullptr, image);
|
||||
ASSERT_EQ(true, image->isMemObjZeroCopy());
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
|
||||
delete image;
|
||||
}
|
||||
|
@ -535,7 +533,7 @@ TEST_P(CreateImageHostPtr, getAddress) {
|
|||
image = createImage(retVal);
|
||||
ASSERT_NE(nullptr, image);
|
||||
|
||||
auto address = image->getCpuAddress();
|
||||
auto address = image->getBasePtrForMap();
|
||||
EXPECT_NE(nullptr, address);
|
||||
|
||||
if (!(flags & CL_MEM_USE_HOST_PTR)) {
|
||||
|
@ -557,18 +555,13 @@ TEST_P(CreateImageHostPtr, getAddress) {
|
|||
|
||||
bool copyRequired = (alignedRequiredSize > alignedPtrSize) | (requiredRowPitch != rowPitch) | (slicePitch != requiredSlicePitch);
|
||||
|
||||
EXPECT_EQ(pHostPtr, address);
|
||||
EXPECT_EQ(pHostPtr, image->getHostPtr());
|
||||
|
||||
if (copyRequired) {
|
||||
// Buffer should use host ptr
|
||||
EXPECT_NE(pHostPtr, address);
|
||||
EXPECT_EQ(pHostPtr, image->getHostPtr());
|
||||
EXPECT_FALSE(image->isMemObjZeroCopy());
|
||||
} else {
|
||||
// Buffer should use host ptr
|
||||
EXPECT_EQ(pHostPtr, address);
|
||||
EXPECT_TRUE(image->isMemObjZeroCopy());
|
||||
}
|
||||
} else {
|
||||
// Buffer should have a different ptr
|
||||
EXPECT_NE(pHostPtr, address);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
*/
|
||||
|
||||
#include "unit_tests/fixtures/image_fixture.h"
|
||||
#include "unit_tests/helpers/debug_manager_state_restore.h"
|
||||
#include "unit_tests/mocks/mock_device.h"
|
||||
#include "unit_tests/mocks/mock_context.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
@ -72,7 +73,10 @@ class ImageHostPtrTransferTests : public testing::Test {
|
|||
size_t hostPtrSlicePitch, hostPtrRowPitch, imageSlicePitch, imageRowPitch, pixelSize;
|
||||
};
|
||||
|
||||
TEST_F(ImageHostPtrTransferTests, given3dImageWhenTransferToHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
TEST_F(ImageHostPtrTransferTests, given3dImageWithoutTilingWhenTransferToHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.ForceLinearImages.set(true);
|
||||
|
||||
createImageAndSetTestParams<Image3dDefaults>();
|
||||
EXPECT_NE(hostPtrSlicePitch, imageSlicePitch);
|
||||
EXPECT_NE(hostPtrRowPitch, imageRowPitch);
|
||||
|
@ -93,7 +97,10 @@ TEST_F(ImageHostPtrTransferTests, given3dImageWhenTransferToHostPtrCalledThenCop
|
|||
EXPECT_TRUE(memcmp(image->getHostPtr(), expectedHostPtr.get(), hostPtrSlicePitch * imgDesc->image_depth) == 0);
|
||||
}
|
||||
|
||||
TEST_F(ImageHostPtrTransferTests, given3dImageWhenTransferFromHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
TEST_F(ImageHostPtrTransferTests, given3dImageWithoutTilingWhenTransferFromHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.ForceLinearImages.set(true);
|
||||
|
||||
createImageAndSetTestParams<Image3dDefaults>();
|
||||
EXPECT_NE(hostPtrSlicePitch, imageSlicePitch);
|
||||
EXPECT_NE(hostPtrRowPitch, imageRowPitch);
|
||||
|
@ -114,7 +121,10 @@ TEST_F(ImageHostPtrTransferTests, given3dImageWhenTransferFromHostPtrCalledThenC
|
|||
EXPECT_TRUE(memcmp(image->getCpuAddress(), expectedImageData.get(), imageSlicePitch * imgDesc->image_depth) == 0);
|
||||
}
|
||||
|
||||
TEST_F(ImageHostPtrTransferTests, given2dArrayImageWhenTransferToHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
TEST_F(ImageHostPtrTransferTests, given2dArrayImageWithoutTilingWhenTransferToHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.ForceLinearImages.set(true);
|
||||
|
||||
createImageAndSetTestParams<Image2dArrayDefaults>();
|
||||
EXPECT_NE(hostPtrSlicePitch, imageSlicePitch);
|
||||
EXPECT_NE(hostPtrRowPitch, imageRowPitch);
|
||||
|
@ -135,7 +145,10 @@ TEST_F(ImageHostPtrTransferTests, given2dArrayImageWhenTransferToHostPtrCalledTh
|
|||
EXPECT_TRUE(memcmp(image->getHostPtr(), expectedHostPtr.get(), hostPtrSlicePitch * imgDesc->image_array_size) == 0);
|
||||
}
|
||||
|
||||
TEST_F(ImageHostPtrTransferTests, given2dArrayImageWhenTransferFromHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
TEST_F(ImageHostPtrTransferTests, given2dArrayImageWithoutTilingWhenTransferFromHostPtrCalledThenCopyRequestedRegionAndOriginOnly) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.ForceLinearImages.set(true);
|
||||
|
||||
createImageAndSetTestParams<Image2dArrayDefaults>();
|
||||
EXPECT_NE(hostPtrSlicePitch, imageSlicePitch);
|
||||
EXPECT_NE(hostPtrRowPitch, imageRowPitch);
|
||||
|
|
Loading…
Reference in New Issue