From 7130b87d5ce91ef723c99ae7aee1f282c3b4097f Mon Sep 17 00:00:00 2001 From: German Andryeyev Date: Tue, 12 Dec 2023 16:26:46 -0500 Subject: [PATCH] SWDEV-436859 - Enable pitch for COPY_HOST_PTR Original logic didn't use pitch because, abstraction layer had a sysmem copy without pitch. Since extra sysmem copy was disabled, the code has to accept pitch values from the app. Change-Id: Ia9fba7b33ddff4e9109b4e63d0d6afa52f501c8f [ROCm/clr commit: fb3dfcf889bafd7a757868360cec5b51d6d31a0b] --- projects/clr/rocclr/device/pal/paldevice.cpp | 8 +++++--- projects/clr/rocclr/device/rocm/rocdevice.cpp | 5 ++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/projects/clr/rocclr/device/pal/paldevice.cpp b/projects/clr/rocclr/device/pal/paldevice.cpp index 7db9a686ec..225d949895 100644 --- a/projects/clr/rocclr/device/pal/paldevice.cpp +++ b/projects/clr/rocclr/device/pal/paldevice.cpp @@ -1789,9 +1789,11 @@ pal::Memory* Device::createImage(amd::Memory& owner, bool directAccess) const { owner.setHostMem(nullptr); } else { amd::Coord3D origin(0, 0, 0); - static const bool Entire = true; - if (xferMgr().writeImage(owner.getHostMem(), *gpuImage, origin, image.getRegion(), 0, 0, - Entire)) { + // Copy data with the original pitch values, since runtime doesn't perform + // extra sysmem allocation for one device + constexpr bool kEntire = true; + if (xferMgr().writeImage(owner.getHostMem(), *gpuImage, origin, image.getRegion(), + image.getRowPitch(), image.getSlicePitch(), kEntire)) { // Clear CHP memory owner.setHostMem(nullptr); } diff --git a/projects/clr/rocclr/device/rocm/rocdevice.cpp b/projects/clr/rocclr/device/rocm/rocdevice.cpp index 5c9d383435..02e27e14ce 100644 --- a/projects/clr/rocclr/device/rocm/rocdevice.cpp +++ b/projects/clr/rocclr/device/rocm/rocdevice.cpp @@ -2086,8 +2086,11 @@ device::Memory* Device::createMemory(amd::Memory& owner) const { imageView->replaceDeviceMemory(this, devImageView); + // Copy data with the original pitch values, since runtime doesn't perform + // extra sysmem allocation for one device + const auto image = owner.asImage(); result = xferMgr().writeImage(owner.getHostMem(), *devImageView, amd::Coord3D(0, 0, 0), - imageView->getRegion(), 0, 0, true); + imageView->getRegion(), image->getRowPitch(), image->getSlicePitch(), true); // Release host memory, since runtime copied data owner.setHostMem(nullptr);