SWDEV-366528 – Fix image memory format updating issue

Add dstMemory format updating.
Separate format updating for srcMemory and dstMemory.

Change-Id: I1692b92d417bbd742d562679f218ebf8ca532e92
This commit is contained in:
taosang2
2023-05-04 11:05:49 -04:00
committed by Tao Sang
parent b17056cb93
commit 7624a48de9
2 changed files with 135 additions and 58 deletions
+65 -28
View File
@@ -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;
+70 -30
View File
@@ -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<amd::Image*>(srcMemory.owner());
amd::Image* dstImage = static_cast<amd::Image*>(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;