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]
This commit is contained in:
Alex Xie
2021-03-28 21:28:34 -04:00
committed by AlexBin Xie
parent 859d0bd497
commit 06349fd486
2 changed files with 15 additions and 12 deletions
+12 -9
View File
@@ -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;
}
}
}
@@ -226,7 +226,6 @@ class VirtualGPU : public device::VirtualDevice {
uint profileEnabled_ : 1; //!< Profiling is enabled for WaveLimiter
uint perfCounterEnabled_ : 1; //!< PerfCounter is enabled
uint rgpCaptureEnabled_ : 1; //!< RGP capture is enabled in the runtime
uint imageBufferWrtBack_ : 1; //!< Enable image buffer write back
};
uint value_;
State() : value_(0) {}
@@ -584,7 +583,9 @@ class VirtualGPU : public device::VirtualDevice {
bool processMemObjectsHSA(const amd::Kernel& kernel, //!< AMD kernel object for execution
const_address params, //!< Pointer to the param's store
bool nativeMem, //!< Native memory objects
size_t& ldsAddess //!< Returns LDS size, used in the kernel
size_t& ldsAddess, //!< Returns LDS size, used in the kernel
bool& imageBufferWrtBack, //!< Image buffer write back is required
std::vector<Image*>& wrtBackImageBuffer //!< images for write back
);
//! Common function for fill memory used by both svm Fill and non-svm fill
@@ -674,7 +675,6 @@ class VirtualGPU : public device::VirtualDevice {
Pal::ICmdAllocator* cmdAllocator_; //!< Command buffer allocator
Queue* queues_[AllEngines]; //!< HW queues for all engines
MemoryRange sdmaRange_; //!< SDMA memory range for write access
std::vector<Image*> wrtBackImageBuffer_; //!< Array of images for write back
void* hostcallBuffer_; //!< Hostcall buffer
};