diff --git a/rocclr/runtime/device/gpu/gpublit.cpp b/rocclr/runtime/device/gpu/gpublit.cpp index ebd13b0885..8375388911 100644 --- a/rocclr/runtime/device/gpu/gpublit.cpp +++ b/rocclr/runtime/device/gpu/gpublit.cpp @@ -57,10 +57,12 @@ DmaBlitManager::readMemoryStaged( if (dev().xferRead().bufSize() < 128 * Ki) { chunkSize = dev().xferRead().bufSize(); } - else { + else if (xferSize > 256 * Ki) { chunkSize = std::min(amd::alignUp(xferSize / 4, 256), dev().xferRead().bufSize()); - chunkSize = std::max(chunkSize, 128 * Ki); + } + else { + chunkSize = xferSize; } // Find the partial transfer size @@ -112,6 +114,7 @@ DmaBlitManager::readMemoryStaged( reinterpret_cast(dstHost) + offset - copySizeLast[0], dst, copySizeLast)) { return false; } + return true; } @@ -314,14 +317,19 @@ DmaBlitManager::writeMemoryStaged( amd::Coord3D src(0, 0, 0); size_t tmpSize; size_t chunkSize; + static const bool CopyRect = false; + // Flush DMA for ASYNC copy + static const bool FlushDMA = true; if (dev().xferRead().bufSize() < 128 * Ki) { - chunkSize = dev().xferRead().bufSize(); + chunkSize = dev().xferWrite().bufSize(); + } + else if (xferSize > 256 * Ki) { + chunkSize = std::min(amd::alignUp(xferSize / 4, 256), + dev().xferWrite().bufSize()); } else { - chunkSize = std::min(amd::alignUp(xferSize / 4, 256), - dev().xferRead().bufSize()); - chunkSize = std::max(chunkSize, 128 * Ki); + chunkSize = xferSize; } while (xferSize != 0) { @@ -339,7 +347,7 @@ DmaBlitManager::writeMemoryStaged( // Copy data into the original destination memory if (!xferBuf.partialMemCopyTo( - gpu(), src, dst, copySize, dstMemory)) { + gpu(), src, dst, copySize, dstMemory, CopyRect, FlushDMA)) { return false; } @@ -347,6 +355,7 @@ DmaBlitManager::writeMemoryStaged( offset += tmpSize; xferSize -= tmpSize; } + return true; } @@ -366,6 +375,7 @@ DmaBlitManager::writeBuffer( srcHost, dstMemory, origin, size, entire); } else { + size_t dstSize = size[0]; size_t tmpSize = 0; size_t offset = 0; @@ -432,6 +442,7 @@ DmaBlitManager::writeBuffer( } } + if (dstSize != 0) { Memory& xferBuf = dev().xferWrite().acquire(); @@ -2247,6 +2258,7 @@ KernelBlitManager::writeBuffer( synchronize(); + return result; } @@ -2723,7 +2735,6 @@ DmaBlitManager::pinHostMemory( amdMemory = new(*context_) amd::Buffer(*context_, CL_MEM_USE_HOST_PTR, pinAllocSize); - if ((amdMemory != NULL) && !amdMemory->create(tmpHost, SysMem)) { amdMemory->release(); return NULL; diff --git a/rocclr/runtime/device/pal/palblit.cpp b/rocclr/runtime/device/pal/palblit.cpp index 66d02aba9d..8e210acb21 100644 --- a/rocclr/runtime/device/pal/palblit.cpp +++ b/rocclr/runtime/device/pal/palblit.cpp @@ -56,10 +56,12 @@ DmaBlitManager::readMemoryStaged( if (dev().xferRead().bufSize() < 128 * Ki) { chunkSize = dev().xferRead().bufSize(); } - else { + else if (xferSize > 256 * Ki) { chunkSize = std::min(amd::alignUp(xferSize / 4, 256), dev().xferRead().bufSize()); - chunkSize = std::max(chunkSize, 128 * Ki); + } + else { + chunkSize = xferSize; } // Find the partial transfer size @@ -313,14 +315,19 @@ DmaBlitManager::writeMemoryStaged( amd::Coord3D src(0, 0, 0); size_t tmpSize; size_t chunkSize; + static const bool CopyRect = false; + // Flush DMA for ASYNC copy + static const bool FlushDMA = true; if (dev().xferRead().bufSize() < 128 * Ki) { - chunkSize = dev().xferRead().bufSize(); + chunkSize = dev().xferWrite().bufSize(); + } + else if (xferSize > 256 * Ki) { + chunkSize = std::min(amd::alignUp(xferSize / 4, 256), + dev().xferWrite().bufSize()); } else { - chunkSize = std::min(amd::alignUp(xferSize / 4, 256), - dev().xferRead().bufSize()); - chunkSize = std::max(chunkSize, 128 * Ki); + chunkSize = xferSize; } while (xferSize != 0) { @@ -338,7 +345,7 @@ DmaBlitManager::writeMemoryStaged( // Copy data into the original destination memory if (!xferBuf.partialMemCopyTo( - gpu(), src, dst, copySize, dstMemory)) { + gpu(), src, dst, copySize, dstMemory, CopyRect, FlushDMA)) { return false; } @@ -2761,7 +2768,7 @@ KernelBlitManager::createView( const Memory& gpuMem = static_cast(parent); params.owner_ = parent.owner(); - params.level_ = 0; + params.level_ = parent.desc().baseLevel_; params.layer_ = 0; params.resource_ = &gpuMem; params.memory_ = &gpuMem;