SWDEV-276304 - [Navi][OpenCL][Linux]AMF Converter generate corrupted Frames

This is part 2 of the code change for PAL.
The copy image workaround could be recursively used by ROCclr blit kernel.
Avoid such situation by using stack variable.

Tests:
clinfo.
Conformance tests - basic, API, info, and all images tests.
Internal runtime tests - all passed.

Change-Id: I3c822e55398cdf35c2c4a46ed9fc20fbee7cc908


[ROCm/clr commit: 090cf6c6d3]
这个提交包含在:
Alex Xie
2021-03-28 21:28:34 -04:00
提交者 AlexBin Xie
父节点 859d0bd497
当前提交 06349fd486
共修改 2 个文件,包含 15 行新增和 12 行删除
+12 -9
查看文件
@@ -2454,8 +2454,12 @@ bool VirtualGPU::submitKernelInternal(const amd::NDRangeContainer& sizes, const
iCmd()->CmdCommentString(buf);
}
bool imageBufferWrtBack = false; // Image buffer write back is required
std::vector<Image*> wrtBackImageBuffer; // Array of images for write back
// Check memory dependency and SVM objects
if (!processMemObjectsHSA(kernel, parameters, nativeMem, ldsSize)) {
if (!processMemObjectsHSA(kernel, parameters, nativeMem, ldsSize,
imageBufferWrtBack, wrtBackImageBuffer)) {
LogError("Wrong memory objects!");
return false;
}
@@ -2573,12 +2577,10 @@ bool VirtualGPU::submitKernelInternal(const amd::NDRangeContainer& sizes, const
}
// Check if image buffer write back is required
if (state_.imageBufferWrtBack_) {
// Avoid recursive write back
state_.imageBufferWrtBack_ = false;
if (imageBufferWrtBack) {
// Make sure the original kernel execution is done
addBarrier(RgpSqqtBarrierReason::MemDependency);
for (const auto imageBuffer : wrtBackImageBuffer_) {
for (const auto imageBuffer : wrtBackImageBuffer) {
Memory* buffer = dev().getGpuMemory(imageBuffer->owner()->parent());
amd::Image* image = imageBuffer->owner()->asImage();
amd::Coord3D offs(0);
@@ -2587,7 +2589,6 @@ bool VirtualGPU::submitKernelInternal(const amd::NDRangeContainer& sizes, const
offs, image->getRegion(), true,
image->getRowPitch(), image->getSlicePitch());
}
wrtBackImageBuffer_.clear();
}
// Perform post dispatch logic for RGP traces
@@ -3294,7 +3295,9 @@ void VirtualGPU::profileEvent(EngineType engine, bool type) const {
}
bool VirtualGPU::processMemObjectsHSA(const amd::Kernel& kernel, const_address params,
bool nativeMem, size_t& ldsAddress) {
bool nativeMem, size_t& ldsAddress,
bool& imageBufferWrtBack,
std::vector<Image*>& wrtBackImageBuffer) {
const amd::KernelParameters& kernelParams = kernel.parameters();
// Mark the tracker with a new kernel,
@@ -3470,8 +3473,8 @@ bool VirtualGPU::processMemObjectsHSA(const amd::Kernel& kernel, const_address p
addVmMemory(imageBuffer->CopyImageBuffer());
// If it's not a read only resource, then runtime has to write back
if (!info.readOnly_) {
wrtBackImageBuffer_.push_back(imageBuffer);
state_.imageBufferWrtBack_ = true;
wrtBackImageBuffer.push_back(imageBuffer);
imageBufferWrtBack = true;
}
}
}