diff --git a/projects/clr/rocclr/device/rocm/rocmemory.cpp b/projects/clr/rocclr/device/rocm/rocmemory.cpp index 1df902e6e2..52a12f3797 100644 --- a/projects/clr/rocclr/device/rocm/rocmemory.cpp +++ b/projects/clr/rocclr/device/rocm/rocmemory.cpp @@ -1138,22 +1138,26 @@ bool Image::createView(const Memory& parent) { hsa_status_t status; if (linearLayout) { - size_t rowPitch; - amd::Image& ownerImage = *owner()->asImage(); - size_t elementSize = ownerImage.getImageFormat().getElementSize(); - // First get the row pitch in pixels - if (ownerImage.getRowPitch() != 0) { - rowPitch = ownerImage.getRowPitch() / elementSize; + if (nullptr != copyImageBuffer_ ) { + status = HSA_STATUS_SUCCESS; } else { - rowPitch = ownerImage.getWidth(); - } + size_t rowPitch; + amd::Image& ownerImage = *owner()->asImage(); + size_t elementSize = ownerImage.getImageFormat().getElementSize(); + // First get the row pitch in pixels + if (ownerImage.getRowPitch() != 0) { + rowPitch = ownerImage.getRowPitch() / elementSize; + } else { + rowPitch = ownerImage.getWidth(); + } - // Make sure the row pitch is aligned to pixels - rowPitch = elementSize * amd::alignUp(rowPitch, (dev().info().imagePitchAlignment_ / elementSize)); + // Make sure the row pitch is aligned to pixels + rowPitch = elementSize * amd::alignUp(rowPitch, (dev().info().imagePitchAlignment_ / elementSize)); - status = hsa_ext_image_create_with_layout( + status = hsa_ext_image_create_with_layout( dev().getBackendDevice(), &imageDescriptor_, deviceMemory_, permission_, HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR, rowPitch, 0, &hsaImageObject_); + } } else if (kind_ == MEMORY_KIND_INTEROP) { amdImageDesc_ = static_cast(parent.owner()->getDeviceMemory(dev()))->amdImageDesc_; status = hsa_amd_image_create(dev().getBackendDevice(), &imageDescriptor_, amdImageDesc_, diff --git a/projects/clr/rocclr/device/rocm/rocsettings.cpp b/projects/clr/rocclr/device/rocm/rocsettings.cpp index bedb0b679c..ff2606e3f7 100644 --- a/projects/clr/rocclr/device/rocm/rocsettings.cpp +++ b/projects/clr/rocclr/device/rocm/rocsettings.cpp @@ -145,8 +145,9 @@ bool Settings::create(bool fullProfile, int gfxipVersion, bool coop_groups) { if (gfxipVersion >= 1000) { enableWave32Mode_ = true; enableWgpMode_ = GPU_ENABLE_WGP_MODE; - if (gfxipVersion == 1001) { + if (gfxipVersion >= 1010) { // GFX10.1 HW doesn't support custom pitch. Enable double copy workaround + // TODO: This should be updated when ROCr support custom pitch imageBufferWar_ = GPU_IMAGE_BUFFER_WAR; } } diff --git a/projects/clr/rocclr/device/rocm/rocvirtual.cpp b/projects/clr/rocclr/device/rocm/rocvirtual.cpp index 68b563dce6..2dfb35938c 100644 --- a/projects/clr/rocclr/device/rocm/rocvirtual.cpp +++ b/projects/clr/rocclr/device/rocm/rocvirtual.cpp @@ -366,7 +366,7 @@ bool VirtualGPU::processMemObjects(const amd::Kernel& kernel, const_address para // If it's not a read only resource, then runtime has to write back if (!desc.info_.readOnly_) { - wrtBackImageBuffer_.push_back(devCpImg); + wrtBackImageBuffer_.push_back(mem->getDeviceMemory(dev())); imageBufferWrtBack_ = true; } }