diff --git a/projects/clr/rocclr/device/pal/palvirtual.cpp b/projects/clr/rocclr/device/pal/palvirtual.cpp index 243f2ceca2..9cd3be0f95 100644 --- a/projects/clr/rocclr/device/pal/palvirtual.cpp +++ b/projects/clr/rocclr/device/pal/palvirtual.cpp @@ -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; diff --git a/projects/clr/rocclr/device/pal/palvirtual.hpp b/projects/clr/rocclr/device/pal/palvirtual.hpp index 115d929719..98d276429b 100644 --- a/projects/clr/rocclr/device/pal/palvirtual.hpp +++ b/projects/clr/rocclr/device/pal/palvirtual.hpp @@ -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 uint VirtualGPU::Queue::submit(bool forceFlus } return id; } - /*@}*/ // namespace amd::pal } // namespace amd::pal