From 6c5ac160a62db0a7968ddf64f70c715a6fb0867c Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Thu, 25 Sep 2025 12:34:19 +0000 Subject: [PATCH] fix: use memory ptr from api when copy from/to image by blt Related-To: NEO-15934 Signed-off-by: Maciej Plewka --- level_zero/core/source/cmdlist/cmdlist_hw.inl | 8 +- .../sources/cmdlist/test_cmdlist_2.cpp | 83 +++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 57dc43c5ad..72f2959b2c 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -831,7 +831,9 @@ ze_result_t CommandListCoreFamily::appendImageCopyFromMemoryExt(z } size_t imgRowPitch = image->getImageInfo().rowPitch; size_t imgSlicePitch = image->getImageInfo().slicePitch; - auto status = appendCopyImageBlit(allocationStruct.alignedAllocationPtr, allocationStruct.alloc, image->getAllocation()->getGpuAddress(), image->getAllocation(), + this->commandContainer.addToResidencyContainer(allocationStruct.alloc); + auto ptr = ptrOffset(allocationStruct.alignedAllocationPtr, allocationStruct.offset); + auto status = appendCopyImageBlit(ptr, nullptr, image->getAllocation()->getGpuAddress(), image->getAllocation(), {0, 0, 0}, {pDstRegion->originX, pDstRegion->originY, pDstRegion->originZ}, srcRowPitch, srcSlicePitch, imgRowPitch, imgSlicePitch, bytesPerPixel, {pDstRegion->width, pDstRegion->height, pDstRegion->depth}, {pDstRegion->width, pDstRegion->height, pDstRegion->depth}, imgSize, event, numWaitEvents, phWaitEvents, memoryCopyParams); @@ -1034,7 +1036,9 @@ ze_result_t CommandListCoreFamily::appendImageCopyToMemoryExt(voi } size_t imgRowPitch = image->getImageInfo().rowPitch; size_t imgSlicePitch = image->getImageInfo().slicePitch; - auto status = appendCopyImageBlit(image->getAllocation()->getGpuAddress(), image->getAllocation(), allocationStruct.alignedAllocationPtr, allocationStruct.alloc, + this->commandContainer.addToResidencyContainer(allocationStruct.alloc); + auto ptr = ptrOffset(allocationStruct.alignedAllocationPtr, allocationStruct.offset); + auto status = appendCopyImageBlit(image->getAllocation()->getGpuAddress(), image->getAllocation(), ptr, nullptr, {pSrcRegion->originX, pSrcRegion->originY, pSrcRegion->originZ}, {0, 0, 0}, imgRowPitch, imgSlicePitch, destRowPitch, destSlicePitch, bytesPerPixel, {pSrcRegion->width, pSrcRegion->height, pSrcRegion->depth}, imgSize, {pSrcRegion->width, pSrcRegion->height, pSrcRegion->depth}, event, numWaitEvents, phWaitEvents, memoryCopyParams); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_2.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_2.cpp index 4c10788731..723964d817 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_2.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_2.cpp @@ -44,6 +44,11 @@ class MockCommandListHw : public WhiteBox<::L0::CommandListCoreFamily(alignDown(buffer, sizeof(uint32_t))); + auto offset = reinterpret_cast(buffer) - alignedPtr; + return {alignedPtr, offset, &alignedAlloc, true}; + } if (buffer && !failAlignedAlloc) { return {0, 0, &alignedAlloc, true}; } @@ -161,6 +166,10 @@ class MockCommandListHw : public WhiteBox<::L0::CommandListCoreFamily appendImageRegionDstOrigin = {9, 9, 9}; Vec3 appendCopyImageSrcSize{0, 0, 0}; Vec3 appendCopyImageDstSize{0, 0, 0}; + uintptr_t appendSrcPtr; + uintptr_t appendDstPtr; + NEO::GraphicsAllocation *appendSrcAlloc; + NEO::GraphicsAllocation *appendDstAlloc; void *alignedDataPtr = alignUp(mockAlignedAllocData, MemoryConstants::pageSize); @@ -196,6 +209,7 @@ class MockCommandListHw : public WhiteBox<::L0::CommandListCoreFamilygetBatchBufferStartAddress()); } +HWTEST_F(CommandListAppend, givenCopyCommandListWhenImageCopyFromFromMemoryExtThenNotAlignedSrcPtrPassedToBltDispatch) { + MockCommandListHw cmdList; + cmdList.initialize(device, NEO::EngineGroupType::copy, 0u); + cmdList.returnMockAllocationStruct = true; + ze_image_desc_t zeDesc = {ZE_STRUCTURE_TYPE_IMAGE_DESC, + nullptr, + 0, + ZE_IMAGE_TYPE_1D, + {ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_UINT, + ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, + ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A}, + 4, + 1, + 1, + 0, + 0}; + zeDesc.stype = ZE_STRUCTURE_TYPE_IMAGE_DESC; + auto image = std::make_unique>>(); + image->initialize(device, &zeDesc); + + ze_image_region_t imgRegion = {0, 0, 0, static_cast(zeDesc.width), 1, 1}; + uint32_t rowPitch = static_cast(image->getImageInfo().rowPitch); + uint32_t slicePitch = rowPitch; + void *data; + ze_host_mem_alloc_desc_t hostDesc = {}; + context->allocHostMem(&hostDesc, 64u, 64u, &data); + void *srcPtr = ptrOffset(data, 3); + + cmdList.appendImageCopyFromMemoryExt(image->toHandle(), srcPtr, &imgRegion, rowPitch, slicePitch, nullptr, 0, nullptr, copyParams); + + EXPECT_EQ(cmdList.appendSrcPtr, reinterpret_cast(srcPtr)); + EXPECT_EQ(cmdList.appendSrcAlloc, nullptr); + context->freeMem(data); +} + +HWTEST_F(CommandListAppend, givenCopyCommandListWhenImageCopyFromToMemoryExtThenNotAlignedDstPtrPassedToBltDispatch) { + MockCommandListHw cmdList; + cmdList.returnMockAllocationStruct = true; + cmdList.initialize(device, NEO::EngineGroupType::copy, 0u); + ze_image_desc_t zeDesc = {ZE_STRUCTURE_TYPE_IMAGE_DESC, + nullptr, + 0, + ZE_IMAGE_TYPE_1D, + {ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_UINT, + ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, + ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A}, + 4, + 1, + 1, + 0, + 0}; + zeDesc.stype = ZE_STRUCTURE_TYPE_IMAGE_DESC; + auto image = std::make_unique>>(); + image->initialize(device, &zeDesc); + + ze_image_region_t imgRegion = {0, 0, 0, static_cast(zeDesc.width), 1, 1}; + uint32_t rowPitch = static_cast(image->getImageInfo().rowPitch); + uint32_t slicePitch = rowPitch; + void *data; + ze_host_mem_alloc_desc_t hostDesc = {}; + context->allocHostMem(&hostDesc, 64u, 64u, &data); + void *dstPtr = ptrOffset(data, 3); + + cmdList.appendImageCopyToMemoryExt(dstPtr, image->toHandle(), &imgRegion, rowPitch, slicePitch, nullptr, 0, nullptr, copyParams); + + EXPECT_EQ(cmdList.appendDstPtr, reinterpret_cast(dstPtr)); + EXPECT_EQ(cmdList.appendDstAlloc, nullptr); + context->freeMem(data); +} } // namespace ult } // namespace L0