From 7624a48de99a8844b030c41c66cf803e378ad074 Mon Sep 17 00:00:00 2001 From: taosang2 Date: Thu, 4 May 2023 11:05:49 -0400 Subject: [PATCH] =?UTF-8?q?SWDEV-366528=20=E2=80=93=20Fix=20image=20memory?= =?UTF-8?q?=20format=20updating=20issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add dstMemory format updating. Separate format updating for srcMemory and dstMemory. Change-Id: I1692b92d417bbd742d562679f218ebf8ca532e92 --- rocclr/device/pal/palblit.cpp | 93 +++++++++++++++++++++--------- rocclr/device/rocm/rocblit.cpp | 100 +++++++++++++++++++++++---------- 2 files changed, 135 insertions(+), 58 deletions(-) diff --git a/rocclr/device/pal/palblit.cpp b/rocclr/device/pal/palblit.cpp index b5ece1e6d1..3074e11d19 100644 --- a/rocclr/device/pal/palblit.cpp +++ b/rocclr/device/pal/palblit.cpp @@ -1525,53 +1525,88 @@ bool KernelBlitManager::copyImage(device::Memory& srcMemory, device::Memory& dst const amd::Coord3D& size, bool entire, amd::CopyMetadata copyMetadata) const { amd::ScopedLock k(lockXferOps_); - bool rejected = false; + bool result = false; Memory* srcView = &gpuMem(srcMemory); Memory* dstView = &gpuMem(dstMemory); - bool releaseView = false; - bool result = false; - amd::Image::Format newFormat(gpuMem(srcMemory).desc().format_); + amd::Image::Format srcFormat(srcView->desc().format_); + amd::Image::Format dstFormat(dstView->desc().format_); + bool srcRejected = false, dstRejected = false; + bool srcReleaseView = false, dstReleaseView = false; - // Find unsupported formats + // Find unsupported source formats for (uint i = 0; i < RejectedFormatDataTotal; ++i) { - if (RejectedData[i].clOldType_ == newFormat.image_channel_data_type) { - newFormat.image_channel_data_type = RejectedData[i].clNewType_; - rejected = true; + if (RejectedData[i].clOldType_ == srcFormat.image_channel_data_type) { + srcFormat.image_channel_data_type = RejectedData[i].clNewType_; + srcRejected = true; break; } } - // Search for the rejected channel's order only if the format was rejected + // Search for the rejected source channel's order only if the format was rejected // Note: Image blit is independent from the channel order - if (rejected) { + if (srcRejected) { for (uint i = 0; i < RejectedFormatChannelTotal; ++i) { - if (RejectedOrder[i].clOldType_ == newFormat.image_channel_order) { - newFormat.image_channel_order = RejectedOrder[i].clNewType_; - rejected = true; + if (RejectedOrder[i].clOldType_ == srcFormat.image_channel_order) { + srcFormat.image_channel_order = RejectedOrder[i].clNewType_; break; } } } - // Attempt to create a view if the format was rejected - if (rejected) { - srcView = createView(gpuMem(srcMemory), newFormat); - if (srcView != NULL) { - dstView = createView(gpuMem(dstMemory), newFormat); - if (dstView != NULL) { - rejected = false; - releaseView = true; - } else { - delete srcView; + // Find unsupported destination formats + for (uint i = 0; i < RejectedFormatDataTotal; ++i) { + if (RejectedData[i].clOldType_ == dstFormat.image_channel_data_type) { + dstFormat.image_channel_data_type = RejectedData[i].clNewType_; + dstRejected = true; + break; + } + } + + // Search for the rejected destination channel's order only if the format was rejected + // Note: Image blit is independent from the channel order + if (dstRejected) { + for (uint i = 0; i < RejectedFormatChannelTotal; ++i) { + if (RejectedOrder[i].clOldType_ == dstFormat.image_channel_order) { + dstFormat.image_channel_order = RejectedOrder[i].clNewType_; + break; } } } - // Fall into the host path for the entire 2D copy or - // if the image format was rejected - if (rejected) { + if (srcFormat.image_channel_order != dstFormat.image_channel_order || + srcFormat.image_channel_data_type != dstFormat.image_channel_data_type) { + //Give hint if any related test fails + LogPrintfInfo("srcFormat(order=0x%xh, type=0x%xh) != dstFormat(order=0x%xh, type=0x%xh)", + srcFormat.image_channel_order, srcFormat.image_channel_data_type, + dstFormat.image_channel_order, dstFormat.image_channel_data_type); + } + + // Attempt to create a view if the format was rejected + if (srcRejected) { + srcView = createView(gpuMem(srcMemory), srcFormat); + if (srcView) { + srcRejected = false; + srcReleaseView = true; + } + } + + if (dstRejected) { + dstView = createView(gpuMem(dstMemory), dstFormat); + if (dstView) { + dstRejected = false; + dstReleaseView = true; + } + } + // Fall into the host path for the copy if the image format was rejected + if (srcRejected || dstRejected) { result = HostBlitManager::copyImage(srcMemory, dstMemory, srcOrigin, dstOrigin, size, entire, copyMetadata); + if (srcReleaseView) { + delete srcView; + } + if (dstReleaseView) { + delete dstView; + } synchronize(); return result; } @@ -1643,11 +1678,13 @@ bool KernelBlitManager::copyImage(device::Memory& srcMemory, device::Memory& dst // Execute the blit address parameters = kernels_[blitType]->parameters().values(); result = gpu().submitKernelInternal(ndrange, *kernels_[blitType], parameters); - if (releaseView) { + + if (srcReleaseView) { delete srcView; + } + if (dstReleaseView) { delete dstView; } - synchronize(); return result; diff --git a/rocclr/device/rocm/rocblit.cpp b/rocclr/device/rocm/rocblit.cpp index d170fcaeb0..1c0f8741ef 100644 --- a/rocclr/device/rocm/rocblit.cpp +++ b/rocclr/device/rocm/rocblit.cpp @@ -1393,57 +1393,93 @@ bool KernelBlitManager::copyImage(device::Memory& srcMemory, device::Memory& dst guarantee((dev().info().imageSupport_ != false), "Image not supported on this device"); amd::ScopedLock k(lockXferOps_); - bool rejected = false; + bool result = false; Memory* srcView = &gpuMem(srcMemory); Memory* dstView = &gpuMem(dstMemory); - bool releaseView = false; - bool result = false; amd::Image* srcImage = static_cast(srcMemory.owner()); amd::Image* dstImage = static_cast(dstMemory.owner()); - amd::Image::Format newFormat(srcImage->getImageFormat()); - - // Find unsupported formats + amd::Image::Format srcFormat(srcImage->getImageFormat()); + amd::Image::Format dstFormat(dstImage->getImageFormat()); + bool srcRejected = false, dstRejected = false; + bool srcReleaseView = false, dstReleaseView = false; + // Find unsupported source formats for (uint i = 0; i < RejectedFormatDataTotal; ++i) { - if (RejectedData[i].clOldType_ == newFormat.image_channel_data_type) { - newFormat.image_channel_data_type = RejectedData[i].clNewType_; - rejected = true; + if (RejectedData[i].clOldType_ == srcFormat.image_channel_data_type) { + srcFormat.image_channel_data_type = RejectedData[i].clNewType_; + srcRejected = true; break; } } - // Search for the rejected channel's order only if the format was rejected + // Search for the rejected source channel's order only if the format was rejected // Note: Image blit is independent from the channel order - if (rejected) { + if (srcRejected) { for (uint i = 0; i < RejectedFormatChannelTotal; ++i) { - if (RejectedOrder[i].clOldType_ == newFormat.image_channel_order) { - newFormat.image_channel_order = RejectedOrder[i].clNewType_; - rejected = true; + if (RejectedOrder[i].clOldType_ == srcFormat.image_channel_order) { + srcFormat.image_channel_order = RejectedOrder[i].clNewType_; + srcRejected = true; break; } } } - // Attempt to create a view if the format was rejected - if (rejected) { - srcView = createView(gpuMem(srcMemory), newFormat, CL_MEM_READ_ONLY); - if (srcView != nullptr) { - dstView = createView(gpuMem(dstMemory), newFormat, CL_MEM_WRITE_ONLY); - if (dstView != nullptr) { - rejected = false; - releaseView = true; - } else { - delete srcView; + // Find unsupported destination formats + for (uint i = 0; i < RejectedFormatDataTotal; ++i) { + if (RejectedData[i].clOldType_ == dstFormat.image_channel_data_type) { + dstFormat.image_channel_data_type = RejectedData[i].clNewType_; + dstRejected = true; + break; + } + } + + // Search for the rejected destionation channel's order only if the format was rejected + // Note: Image blit is independent from the channel order + if (dstRejected) { + for (uint i = 0; i < RejectedFormatChannelTotal; ++i) { + if (RejectedOrder[i].clOldType_ == dstFormat.image_channel_order) { + dstFormat.image_channel_order = RejectedOrder[i].clNewType_; + break; } } } - // Fall into the host path for the entire 2D copy or - // if the image format was rejected - if (rejected) { + if (srcFormat.image_channel_order != dstFormat.image_channel_order || + srcFormat.image_channel_data_type != dstFormat.image_channel_data_type) { + //Give hint if any related test fails + LogPrintfInfo("srcFormat(order=0x%xh, type=0x%xh) != dstFormat(order=0x%xh, type=0x%xh)", + srcFormat.image_channel_order, srcFormat.image_channel_data_type, + dstFormat.image_channel_order, dstFormat.image_channel_data_type); + } + // Attempt to create a view if the format was rejected + if (srcRejected) { + srcView = createView(gpuMem(srcMemory), srcFormat, CL_MEM_READ_ONLY); + if (srcView != nullptr) { + srcRejected = false; + srcReleaseView = true; + } + } + + if (dstRejected) { + dstView = createView(gpuMem(dstMemory), dstFormat, CL_MEM_WRITE_ONLY); + if (dstView != nullptr) { + dstRejected = false; + dstReleaseView = true; + } + } + + // Fall into the host path for the copy if the image format was rejected + if (srcRejected || dstRejected) { result = DmaBlitManager::copyImage(srcMemory, dstMemory, srcOrigin, dstOrigin, size, entire, copyMetadata); + if (srcReleaseView) { + gpu().releaseGpuMemoryFence(); + srcView->owner()->release(); + } + if (dstReleaseView) { + gpu().releaseGpuMemoryFence(); + dstView->owner()->release(); + } synchronize(); - return result; } uint blitType = BlitCopyImage; @@ -1512,13 +1548,17 @@ bool KernelBlitManager::copyImage(device::Memory& srcMemory, device::Memory& dst address parameters = captureArguments(kernels_[blitType]); result = gpu().submitKernelInternal(ndrange, *kernels_[blitType], parameters, nullptr); releaseArguments(parameters); - if (releaseView) { + + if (srcReleaseView) { // todo SRD programming could be changed to avoid a stall gpu().releaseGpuMemoryFence(); srcView->owner()->release(); + } + if (dstReleaseView) { + // todo SRD programming could be changed to avoid a stall + gpu().releaseGpuMemoryFence(); dstView->owner()->release(); } - synchronize(); return result;