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:
systems-assistant[bot]
2025-10-09 09:47:11 -04:00
committed by GitHub
parent 22b4ff7aae
commit 1ae36dd856
2 changed files with 54 additions and 29 deletions
+24 -26
View File
@@ -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;
+30 -3
View File
@@ -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