Image / Buffer refactor.
- do not use redescribe flag for image/buffer from other image/buffer. - use redescribe flag only when image is redescribed via redescribe interface - remove image specific functions from mem object - remove redundant fields - add new implementation of isImageFromBuffer/isImageFromImage basing on associated mem object. - pass associated mem object to redescrbed images. - remove redundant setters Change-Id: I267637a48fbc2afdad9a9f5e5e9ccd6bd0c09972
This commit is contained in:
parent
c17d0d11d0
commit
b99cf6c3ff
|
@ -935,8 +935,8 @@ inline void Kernel::makeArgsResident(CommandStreamReceiver &commandStreamReceive
|
|||
} else if (Kernel::isMemObj(kernelArguments[argIndex].type)) {
|
||||
auto clMem = const_cast<cl_mem>(static_cast<const _cl_mem *>(kernelArguments[argIndex].object));
|
||||
auto memObj = castToObjectOrAbort<MemObj>(clMem);
|
||||
DEBUG_BREAK_IF(memObj == nullptr);
|
||||
if (memObj->isImageFromImage()) {
|
||||
auto image = castToObject<Image>(clMem);
|
||||
if (image && image->isImageFromImage()) {
|
||||
commandStreamReceiver.setSamplerCacheFlushRequired(CommandStreamReceiver::SamplerCacheFlushState::samplerCacheFlushBefore);
|
||||
}
|
||||
commandStreamReceiver.makeResident(*memObj->getGraphicsAllocation());
|
||||
|
|
|
@ -352,7 +352,7 @@ Buffer *Buffer::createSubBuffer(cl_mem_flags flags,
|
|||
ptrOffset(this->memoryStorage, region->origin),
|
||||
this->hostPtr ? ptrOffset(this->hostPtr, region->origin) : nullptr,
|
||||
this->graphicsAllocation,
|
||||
this->isZeroCopy, this->isHostPtrSVM, true);
|
||||
this->isZeroCopy, this->isHostPtrSVM, false);
|
||||
|
||||
if (this->context->isProvidingPerformanceHints()) {
|
||||
this->context->providePerformanceHint(CL_CONTEXT_DIAGNOSTICS_LEVEL_GOOD_INTEL, SUBBUFFER_SHARES_MEMORY, static_cast<cl_mem>(this));
|
||||
|
|
|
@ -114,7 +114,6 @@ Image *Image::create(Context *context,
|
|||
MemoryManager *memoryManager = context->getMemoryManager();
|
||||
Buffer *parentBuffer = castToObject<Buffer>(imageDesc->mem_object);
|
||||
Image *parentImage = castToObject<Image>(imageDesc->mem_object);
|
||||
bool isImageFromBuffer = false;
|
||||
|
||||
do {
|
||||
size_t imageWidth = imageDesc->image_width;
|
||||
|
@ -181,10 +180,7 @@ Image *Image::create(Context *context,
|
|||
|
||||
bool zeroCopy = false;
|
||||
bool transferNeeded = false;
|
||||
bool imageRedescribed = 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
|
||||
zeroCopy = true;
|
||||
|
@ -289,7 +285,7 @@ Image *Image::create(Context *context,
|
|||
}
|
||||
|
||||
image = createImageHw(context, flags, imgInfo.size, hostPtrToSet, surfaceFormat->OCLImageFormat,
|
||||
imageDescriptor, zeroCopy, memory, imageRedescribed, isTilingAllowed, 0, 0, surfaceFormat);
|
||||
imageDescriptor, zeroCopy, memory, false, isTilingAllowed, 0, 0, surfaceFormat);
|
||||
|
||||
if (imageDesc->image_type != CL_MEM_OBJECT_IMAGE1D_ARRAY && imageDesc->image_type != CL_MEM_OBJECT_IMAGE2D_ARRAY) {
|
||||
image->imageDesc.image_array_size = 0;
|
||||
|
@ -297,9 +293,7 @@ Image *Image::create(Context *context,
|
|||
if ((imageDesc->image_type == CL_MEM_OBJECT_IMAGE1D_BUFFER) || ((imageDesc->image_type == CL_MEM_OBJECT_IMAGE2D) && (imageDesc->mem_object != nullptr))) {
|
||||
image->associatedMemObject = castToObject<MemObj>(imageDesc->mem_object);
|
||||
}
|
||||
if (parentImage) {
|
||||
image->isImageFromImageCreated = true;
|
||||
}
|
||||
|
||||
// Driver needs to store rowPitch passed by the app in order to synchronize the host_ptr later on map call
|
||||
image->setHostPtrRowPitch(imageDesc->image_row_pitch ? imageDesc->image_row_pitch : hostPtrRowPitch);
|
||||
image->setHostPtrSlicePitch(hostPtrSlicePitch);
|
||||
|
@ -310,7 +304,6 @@ 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<cl_uint>(imageDesc->image_depth));
|
||||
image->setParentSharingHandler(parentImage->getSharingHandler());
|
||||
|
@ -838,7 +831,7 @@ Image *Image::redescribeFillImage() {
|
|||
&this->surfaceOffsets);
|
||||
image->setQPitch(this->getQPitch());
|
||||
image->setCubeFaceIndex(this->getCubeFaceIndex());
|
||||
image->setIsImageFromBuffer(this->isImageFromBuffer());
|
||||
image->associatedMemObject = this->associatedMemObject;
|
||||
return image;
|
||||
}
|
||||
|
||||
|
@ -886,7 +879,7 @@ Image *Image::redescribe() {
|
|||
&this->surfaceOffsets);
|
||||
image->setQPitch(this->getQPitch());
|
||||
image->setCubeFaceIndex(this->getCubeFaceIndex());
|
||||
image->setIsImageFromBuffer(this->isImageFromBuffer());
|
||||
image->associatedMemObject = this->associatedMemObject;
|
||||
return image;
|
||||
}
|
||||
|
||||
|
|
|
@ -177,6 +177,9 @@ class Image : public MemObj {
|
|||
bool hasSameDescriptor(const cl_image_desc &imageDesc) const;
|
||||
bool hasValidParentImageFormat(const cl_image_format &imageFormat) const;
|
||||
|
||||
bool isImageFromBuffer() const { return castToObject<Buffer>(static_cast<cl_mem>(associatedMemObject)) ? true : false; }
|
||||
bool isImageFromImage() const { return castToObject<Image>(static_cast<cl_mem>(associatedMemObject)) ? true : false; }
|
||||
|
||||
protected:
|
||||
Image(Context *context,
|
||||
cl_mem_flags flags,
|
||||
|
|
|
@ -55,11 +55,11 @@ MemObj::~MemObj() {
|
|||
needWait = true;
|
||||
}
|
||||
|
||||
if (memoryManager) {
|
||||
if (memoryManager && !isObjectRedescribed) {
|
||||
if (peekSharingHandler()) {
|
||||
peekSharingHandler()->releaseReusedGraphicsAllocation();
|
||||
}
|
||||
if (graphicsAllocation && !associatedMemObject && !isObjectRedescribed && !isHostPtrSVM && graphicsAllocation->peekReuseCount() == 0) {
|
||||
if (graphicsAllocation && !associatedMemObject && !isHostPtrSVM && graphicsAllocation->peekReuseCount() == 0) {
|
||||
memoryManager->removeAllocationFromHostPtrManager(graphicsAllocation);
|
||||
bool doAsyncDestrucions = DebugManager.flags.EnableAsyncDestroyAllocations.get();
|
||||
if (!doAsyncDestrucions) {
|
||||
|
|
|
@ -85,10 +85,6 @@ 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() const { return isImageFromBufferCreated; }
|
||||
|
||||
void *getCpuAddressForMapping();
|
||||
void *getCpuAddressForMemoryTransfer();
|
||||
|
||||
|
@ -130,8 +126,6 @@ class MemObj : public BaseObject<_cl_mem> {
|
|||
bool isZeroCopy;
|
||||
bool isHostPtrSVM;
|
||||
bool isObjectRedescribed;
|
||||
bool isImageFromImageCreated = false;
|
||||
bool isImageFromBufferCreated = false;
|
||||
MemoryManager *memoryManager = nullptr;
|
||||
GraphicsAllocation *graphicsAllocation;
|
||||
GraphicsAllocation *mcsAllocation = nullptr;
|
||||
|
|
|
@ -209,6 +209,7 @@ HWTEST_F(EnqueueMapImageTest, givenTiledImageWhenMapImageIsCalledThenStorageIsSe
|
|||
region, nullptr, nullptr, 0,
|
||||
nullptr, nullptr, retVal);
|
||||
EXPECT_TRUE(mockImage.ownershipTaken);
|
||||
mockImage.releaseAllocatedMapPtr();
|
||||
}
|
||||
|
||||
TEST_F(EnqueueMapImageTest, checkPointer) {
|
||||
|
|
|
@ -1,23 +1,8 @@
|
|||
/*
|
||||
* 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"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "hw_cmds.h"
|
||||
|
@ -122,6 +107,8 @@ HWTEST_P(CreateImage1DType, validTypes) {
|
|||
EXPECT_EQ(image->getCubeFaceIndex(), static_cast<uint32_t>(__GMM_NO_CUBE_MAP));
|
||||
|
||||
ASSERT_EQ(true, image->isMemObjZeroCopy());
|
||||
EXPECT_FALSE(image->isImageFromImage());
|
||||
|
||||
auto address = image->getCpuAddress();
|
||||
EXPECT_NE(nullptr, address);
|
||||
|
||||
|
@ -129,8 +116,11 @@ HWTEST_P(CreateImage1DType, validTypes) {
|
|||
Buffer *inputBuffer = castToObject<Buffer>(imageDesc.buffer);
|
||||
EXPECT_NE(nullptr, inputBuffer->getCpuAddress());
|
||||
EXPECT_EQ(inputBuffer->getCpuAddress(), image->getCpuAddress());
|
||||
EXPECT_TRUE(image->getIsObjectRedescribed());
|
||||
EXPECT_FALSE(image->getIsObjectRedescribed());
|
||||
EXPECT_GE(2, inputBuffer->getRefInternalCount());
|
||||
EXPECT_TRUE(image->isImageFromBuffer());
|
||||
} else {
|
||||
EXPECT_FALSE(image->isImageFromBuffer());
|
||||
}
|
||||
|
||||
typedef typename FamilyType::RENDER_SURFACE_STATE SURFACE_STATE;
|
||||
|
|
|
@ -241,6 +241,15 @@ TEST_F(Image2dFromBufferTest, InterceptBuffersHostPtr) {
|
|||
delete imageFromBuffer;
|
||||
}
|
||||
|
||||
TEST_F(Image2dFromBufferTest, givenImageFromBufferWhenItIsRedescribedThenItReturnsProperImageFromBufferValue) {
|
||||
std::unique_ptr<Image> imageFromBuffer(createImage());
|
||||
EXPECT_TRUE(imageFromBuffer->isImageFromBuffer());
|
||||
std::unique_ptr<Image> redescribedImage(imageFromBuffer->redescribe());
|
||||
EXPECT_TRUE(redescribedImage->isImageFromBuffer());
|
||||
std::unique_ptr<Image> redescribedfillImage(imageFromBuffer->redescribeFillImage());
|
||||
EXPECT_TRUE(redescribedfillImage->isImageFromBuffer());
|
||||
}
|
||||
|
||||
TEST_F(Image2dFromBufferTest, givenMemoryManagerNotSupportingVirtualPaddingWhenImageIsCreatedThenPaddingIsNotApplied) {
|
||||
auto memoryManager = context.getMemoryManager();
|
||||
memoryManager->setVirtualPaddingSupport(false);
|
||||
|
|
|
@ -573,17 +573,11 @@ TEST_P(CreateImageHostPtr, getAddress) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST_P(CreateImageHostPtr, getSize) {
|
||||
TEST_P(CreateImageHostPtr, givenImageWhenItIsCreateItHasProperSizeAndGraphicsAllocation) {
|
||||
image = createImage(retVal);
|
||||
ASSERT_NE(nullptr, image);
|
||||
|
||||
EXPECT_NE(0u, image->getSize());
|
||||
}
|
||||
|
||||
TEST_P(CreateImageHostPtr, graphicsAllocationPresent) {
|
||||
image = createImage(retVal);
|
||||
ASSERT_NE(nullptr, image);
|
||||
|
||||
EXPECT_NE(nullptr, image->getGraphicsAllocation());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue