SWDEV-538181 - Fix 1D buffered image copy (#441)
* SWDEV-538181 - Fix 1D buffered image copy Fix wrong logics to copy to/from 1D buffered image in PAL path. --------- Authored-by: taosang2 <tao.sang@amd.com>
This commit is contained in:
committed by
GitHub
parent
22b4ff7aae
commit
1ae36dd856
@@ -1441,26 +1441,26 @@ bool VirtualGPU::copyMemory(cl_command_type type, amd::Memory& srcMem, amd::Memo
|
||||
amd::Memory* bufferFromImageDst = nullptr;
|
||||
|
||||
// Force buffer read for IMAGE1D_BUFFER
|
||||
if ((srcMem.getType() == CL_MEM_OBJECT_IMAGE1D_BUFFER)) {
|
||||
if (srcMem.getType() == CL_MEM_OBJECT_IMAGE1D_BUFFER) {
|
||||
bufferFromImageSrc = createBufferFromImage(srcMem);
|
||||
if (nullptr == bufferFromImageSrc) {
|
||||
LogError("We should not fail buffer creation from image_buffer!");
|
||||
} else {
|
||||
type = CL_COMMAND_COPY_BUFFER;
|
||||
srcMemory = dev().getGpuMemory(bufferFromImageSrc);
|
||||
}
|
||||
}
|
||||
// Force buffer write for IMAGE1D_BUFFER
|
||||
if ((dstMem.getType() == CL_MEM_OBJECT_IMAGE1D_BUFFER)) {
|
||||
if (dstMem.getType() == CL_MEM_OBJECT_IMAGE1D_BUFFER) {
|
||||
bufferFromImageDst = createBufferFromImage(dstMem);
|
||||
if (nullptr == bufferFromImageDst) {
|
||||
LogError("We should not fail buffer creation from image_buffer!");
|
||||
} else {
|
||||
type = CL_COMMAND_COPY_BUFFER;
|
||||
dstMemory = dev().getGpuMemory(bufferFromImageDst);
|
||||
}
|
||||
}
|
||||
|
||||
type = getCopyCommandType(type, srcMem.getType(), dstMem.getType());
|
||||
|
||||
bool result = false;
|
||||
|
||||
// Check if HW can be used for memory copy
|
||||
@@ -1473,41 +1473,44 @@ bool VirtualGPU::copyMemory(cl_command_type type, amd::Memory& srcMem, amd::Memo
|
||||
amd::Coord3D realSize(size.c[0], size.c[1], size.c[2]);
|
||||
|
||||
if (nullptr != bufferFromImageSrc) {
|
||||
size_t elemSize = srcMem.asImage()->getImageFormat().getElementSize();
|
||||
const size_t elemSize = srcMem.asImage()->getImageFormat().getElementSize();
|
||||
realSrcOrigin.c[0] *= elemSize;
|
||||
if (nullptr != bufferFromImageDst) {
|
||||
realDstOrigin.c[0] *= elemSize;
|
||||
}
|
||||
realSize.c[0] *= elemSize;
|
||||
} else if (nullptr != bufferFromImageDst) {
|
||||
size_t elemSize = dstMem.asImage()->getImageFormat().getElementSize();
|
||||
const size_t elemSize = dstMem.asImage()->getImageFormat().getElementSize();
|
||||
realDstOrigin.c[0] *= elemSize;
|
||||
realSize.c[0] *= elemSize;
|
||||
}
|
||||
|
||||
result = blitMgr().copyBuffer(*srcMemory, *dstMemory, realSrcOrigin, realDstOrigin, realSize,
|
||||
entire, copyMetadata);
|
||||
|
||||
if (nullptr != bufferFromImageSrc) {
|
||||
bufferFromImageSrc->release();
|
||||
}
|
||||
if (nullptr != bufferFromImageDst) {
|
||||
bufferFromImageDst->release();
|
||||
}
|
||||
} break;
|
||||
case CL_COMMAND_COPY_BUFFER_RECT:
|
||||
result = blitMgr().copyBufferRect(*srcMemory, *dstMemory, srcRect, dstRect, size, entire,
|
||||
copyMetadata);
|
||||
break;
|
||||
case CL_COMMAND_COPY_IMAGE_TO_BUFFER: {
|
||||
amd::Coord3D realDstOrigin(dstOrigin);
|
||||
if (nullptr != bufferFromImageDst) {
|
||||
const size_t elemSize = dstMem.asImage()->getImageFormat().getElementSize();
|
||||
realDstOrigin.c[0] *= elemSize;
|
||||
}
|
||||
result =
|
||||
blitMgr().copyImageToBuffer(*srcMemory, *dstMemory, srcOrigin, dstOrigin, size, entire,
|
||||
blitMgr().copyImageToBuffer(*srcMemory, *dstMemory, srcOrigin, realDstOrigin, size, entire,
|
||||
dstRect.rowPitch_, dstRect.slicePitch_, copyMetadata);
|
||||
break;
|
||||
}
|
||||
case CL_COMMAND_COPY_BUFFER_TO_IMAGE: {
|
||||
amd::Coord3D realSrcOrigin(srcOrigin);
|
||||
if (nullptr != bufferFromImageSrc) {
|
||||
const size_t elemSize = srcMem.asImage()->getImageFormat().getElementSize();
|
||||
realSrcOrigin.c[0] *= elemSize;
|
||||
}
|
||||
result =
|
||||
blitMgr().copyBufferToImage(*srcMemory, *dstMemory, srcOrigin, dstOrigin, size, entire,
|
||||
blitMgr().copyBufferToImage(*srcMemory, *dstMemory, realSrcOrigin, dstOrigin, size, entire,
|
||||
srcRect.rowPitch_, srcRect.slicePitch_, copyMetadata);
|
||||
break;
|
||||
}
|
||||
@@ -1519,7 +1522,12 @@ bool VirtualGPU::copyMemory(cl_command_type type, amd::Memory& srcMem, amd::Memo
|
||||
LogError("Unsupported command type for memory copy!");
|
||||
break;
|
||||
}
|
||||
|
||||
if (nullptr != bufferFromImageSrc) {
|
||||
bufferFromImageSrc->release();
|
||||
}
|
||||
if (nullptr != bufferFromImageDst) {
|
||||
bufferFromImageDst->release();
|
||||
}
|
||||
if (!result) {
|
||||
LogError("submitCopyMemory failed!");
|
||||
return false;
|
||||
@@ -3782,16 +3790,6 @@ bool VirtualGPU::processMemObjectsHSA(const amd::Kernel& kernel, const_address p
|
||||
return true;
|
||||
}
|
||||
|
||||
amd::Memory* VirtualGPU::createBufferFromImage(amd::Memory& amdImage) {
|
||||
amd::Memory* mem = new (amdImage.getContext()) amd::Buffer(amdImage, 0, 0, amdImage.getSize());
|
||||
mem->setVirtualDevice(this);
|
||||
if ((mem != nullptr) && !mem->create()) {
|
||||
mem->release();
|
||||
}
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
void VirtualGPU::writeVQueueHeader(VirtualGPU& hostQ, const Memory* kernelTable) {
|
||||
if (nullptr == kernelTable) {
|
||||
vqHeader_->kernel_table = 0;
|
||||
|
||||
@@ -612,9 +612,37 @@ class VirtualGPU : public device::VirtualDevice {
|
||||
void profileEvent(EngineType engine, bool type) const;
|
||||
|
||||
//! Creates buffer object from image
|
||||
amd::Memory* createBufferFromImage(
|
||||
inline amd::Memory* createBufferFromImage(
|
||||
amd::Memory& amdImage //! The parent image object(untiled images only)
|
||||
);
|
||||
) {
|
||||
amd::Memory* mem = new (amdImage.getContext()) amd::Buffer(amdImage, 0, 0, amdImage.getSize());
|
||||
mem->setVirtualDevice(this);
|
||||
if ((mem != nullptr) && !mem->create()) {
|
||||
mem->release();
|
||||
}
|
||||
return mem;
|
||||
}
|
||||
|
||||
//! Get copy command type from original copy command type and memory object types
|
||||
inline cl_command_type getCopyCommandType(cl_command_type type, const cl_mem_object_type srcType,
|
||||
const cl_mem_object_type dstType) {
|
||||
if (srcType == CL_MEM_OBJECT_IMAGE1D_BUFFER) {
|
||||
if (dstType == CL_MEM_OBJECT_IMAGE1D_BUFFER) {
|
||||
type = CL_COMMAND_COPY_BUFFER;
|
||||
} else if (dstType == CL_MEM_OBJECT_BUFFER) {
|
||||
type = CL_COMMAND_COPY_BUFFER;
|
||||
} else if (type == CL_COMMAND_COPY_IMAGE) {
|
||||
type = CL_COMMAND_COPY_BUFFER_TO_IMAGE;
|
||||
}
|
||||
} else if (dstType == CL_MEM_OBJECT_IMAGE1D_BUFFER) {
|
||||
if (srcType == CL_MEM_OBJECT_BUFFER) {
|
||||
type = CL_COMMAND_COPY_BUFFER;
|
||||
} else if (type == CL_COMMAND_COPY_IMAGE) {
|
||||
type = CL_COMMAND_COPY_IMAGE_TO_BUFFER;
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
private:
|
||||
struct MemoryRange {
|
||||
@@ -764,6 +792,5 @@ template <bool avoidBarrierSubmit> uint VirtualGPU::Queue::submit(bool forceFlus
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/*@}*/ // namespace amd::pal
|
||||
} // namespace amd::pal
|
||||
|
||||
Reference in New Issue
Block a user