From 2f88abfa2a50bf31f7502b7a557746231eeb68f1 Mon Sep 17 00:00:00 2001 From: Kamil Diedrich Date: Tue, 18 Dec 2018 10:52:12 +0100 Subject: [PATCH] Add information about image from buffer extension - don't change allocation type when buffer is given - add flag isImageFromBuffer to mem_obj Change-Id: I48a0722040d8482ed3653540179d047245affa3c --- runtime/mem_obj/image.cpp | 9 ++++++++- runtime/mem_obj/mem_obj.h | 3 +++ .../mem_obj/image2d_from_buffer_tests.cpp | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/runtime/mem_obj/image.cpp b/runtime/mem_obj/image.cpp index 5ae93d2006..09b2667170 100644 --- a/runtime/mem_obj/image.cpp +++ b/runtime/mem_obj/image.cpp @@ -114,6 +114,7 @@ Image *Image::create(Context *context, MemoryManager *memoryManager = context->getMemoryManager(); Buffer *parentBuffer = castToObject(imageDesc->mem_object); Image *parentImage = castToObject(imageDesc->mem_object); + bool isImageFromBuffer = false; do { size_t imageWidth = imageDesc->image_width; @@ -183,6 +184,7 @@ Image *Image::create(Context *context, bool imageRedescribed = false; bool copyRequired = false; if (((imageDesc->image_type == CL_MEM_OBJECT_IMAGE1D_BUFFER) || (imageDesc->image_type == CL_MEM_OBJECT_IMAGE2D)) && (parentBuffer != nullptr)) { + isImageFromBuffer = true; imageRedescribed = true; memory = parentBuffer->getGraphicsAllocation(); // Image from buffer - we never allocate memory, we use what buffer provides @@ -275,7 +277,9 @@ Image *Image::create(Context *context, break; } - memory->setAllocationType(GraphicsAllocation::AllocationType::IMAGE); + if (parentBuffer == nullptr) { + memory->setAllocationType(GraphicsAllocation::AllocationType::IMAGE); + } memory->setMemObjectsAllocationWithWritableFlags(!(flags & (CL_MEM_READ_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))); DBG_LOG(LogMemoryObject, __FUNCTION__, "hostPtr:", hostPtr, "size:", memory->getUnderlyingBufferSize(), "memoryStorage:", memory->getUnderlyingBuffer(), "GPU address:", std::hex, memory->getGpuAddress()); @@ -314,6 +318,7 @@ Image *Image::create(Context *context, image->setQPitch(imgInfo.qPitch); image->setSurfaceOffsets(imgInfo.offset, imgInfo.xOffset, imgInfo.yOffset, imgInfo.yOffsetForUVPlane); image->setMipCount(imgInfo.mipCount); + image->setIsImageFromBuffer(isImageFromBuffer); if (parentImage) { image->setMediaPlaneType(static_cast(imageDesc->image_depth)); image->setParentSharingHandler(parentImage->getSharingHandler()); @@ -801,6 +806,7 @@ Image *Image::redescribeFillImage() { &this->surfaceOffsets); image->setQPitch(this->getQPitch()); image->setCubeFaceIndex(this->getCubeFaceIndex()); + image->setIsImageFromBuffer(this->isImageFromBuffer()); return image; } @@ -848,6 +854,7 @@ Image *Image::redescribe() { &this->surfaceOffsets); image->setQPitch(this->getQPitch()); image->setCubeFaceIndex(this->getCubeFaceIndex()); + image->setIsImageFromBuffer(this->isImageFromBuffer()); return image; } diff --git a/runtime/mem_obj/mem_obj.h b/runtime/mem_obj/mem_obj.h index 0b36c4d8cc..4fe18c75d8 100644 --- a/runtime/mem_obj/mem_obj.h +++ b/runtime/mem_obj/mem_obj.h @@ -86,6 +86,8 @@ class MemObj : public BaseObject<_cl_mem> { virtual bool allowTiling() const { return false; } bool isImageFromImage() const { return isImageFromImageCreated; } + void setIsImageFromBuffer(bool isImageFromBuffer) { isImageFromBufferCreated = isImageFromBuffer; } + bool isImageFromBuffer() { return isImageFromBufferCreated; } void *getCpuAddressForMapping(); void *getCpuAddressForMemoryTransfer(); @@ -129,6 +131,7 @@ class MemObj : public BaseObject<_cl_mem> { bool isHostPtrSVM; bool isObjectRedescribed; bool isImageFromImageCreated = false; + bool isImageFromBufferCreated = false; MemoryManager *memoryManager = nullptr; GraphicsAllocation *graphicsAllocation; GraphicsAllocation *mcsAllocation = nullptr; diff --git a/unit_tests/mem_obj/image2d_from_buffer_tests.cpp b/unit_tests/mem_obj/image2d_from_buffer_tests.cpp index ca1f29cec0..441713d9bf 100644 --- a/unit_tests/mem_obj/image2d_from_buffer_tests.cpp +++ b/unit_tests/mem_obj/image2d_from_buffer_tests.cpp @@ -365,3 +365,20 @@ TEST_F(Image2dFromBufferTest, givenMemoryManagerSupporting1DImageFromBufferWhenN imageDesc.mem_object = storeMem; } + +TEST_F(Image2dFromBufferTest, givenBufferWhenImageFromBufferThenIsImageFromBufferSetAndAllocationTypeIsBuffer) { + cl_int errCode = 0; + auto buffer = Buffer::create(&context, 0, 1, nullptr, errCode); + imageDesc.image_type = CL_MEM_OBJECT_IMAGE2D; + auto memObj = imageDesc.mem_object; + imageDesc.mem_object = buffer; + + std::unique_ptr imageFromBuffer(createImage()); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_TRUE(imageFromBuffer.get()->isImageFromBuffer()); + EXPECT_TRUE(GraphicsAllocation::AllocationType::BUFFER_HOST_MEMORY == imageFromBuffer.get()->getGraphicsAllocation()->getAllocationType()); + + buffer->release(); + imageDesc.mem_object = memObj; +}