diff --git a/level_zero/api/core/ze_core_loader.cpp b/level_zero/api/core/ze_core_loader.cpp index c86ca44000..6ee0b46e57 100644 --- a/level_zero/api/core/ze_core_loader.cpp +++ b/level_zero/api/core/ze_core_loader.cpp @@ -584,3 +584,19 @@ zeGetKernelExpProcAddrTable( driver_ddiTable.core_ddiTable.KernelExp = *pDdiTable; return result; } + +ZE_APIEXPORT ze_result_t ZE_APICALL +zeGetImageExpProcAddrTable( + ze_api_version_t version, + ze_image_exp_dditable_t *pDdiTable) { + if (nullptr == pDdiTable) + return ZE_RESULT_ERROR_INVALID_ARGUMENT; + if (ZE_MAJOR_VERSION(driver_ddiTable.version) != ZE_MAJOR_VERSION(version) || + ZE_MINOR_VERSION(driver_ddiTable.version) > ZE_MINOR_VERSION(version)) + return ZE_RESULT_ERROR_UNSUPPORTED_VERSION; + + ze_result_t result = ZE_RESULT_SUCCESS; + pDdiTable->pfnGetMemoryPropertiesExp = zeImageGetMemoryPropertiesExp; + driver_ddiTable.core_ddiTable.ImageExp = *pDdiTable; + return result; +} diff --git a/level_zero/api/extensions/public/ze_exp_ext.cpp b/level_zero/api/extensions/public/ze_exp_ext.cpp index 027f8ca294..9efa0599ea 100644 --- a/level_zero/api/extensions/public/ze_exp_ext.cpp +++ b/level_zero/api/extensions/public/ze_exp_ext.cpp @@ -7,6 +7,7 @@ #include "level_zero/api/extensions/public/ze_exp_ext.h" +#include "level_zero/core/source/image/image.h" #include "level_zero/core/source/kernel/kernel.h" #if defined(__cplusplus) @@ -22,6 +23,13 @@ zeKernelSetGlobalOffsetExp( return L0::Kernel::fromHandle(hKernel)->setGlobalOffsetExp(offsetX, offsetY, offsetZ); } +ZE_APIEXPORT ze_result_t ZE_APICALL +zeImageGetMemoryPropertiesExp( + ze_image_handle_t hImage, + ze_image_memory_properties_exp_t *pMemoryProperties) { + return L0::Image::fromHandle(hImage)->getMemoryProperties(pMemoryProperties); +} + #if defined(__cplusplus) } // extern "C" #endif diff --git a/level_zero/core/source/image/image.h b/level_zero/core/source/image/image.h index eaf7aef1a1..0fa5ef8e9a 100644 --- a/level_zero/core/source/image/image.h +++ b/level_zero/core/source/image/image.h @@ -38,6 +38,7 @@ struct Image : _ze_image_handle_t { virtual void copyRedescribedSurfaceStateToSSH(void *surfaceStateHeap, const uint32_t surfaceStateOffset) = 0; virtual NEO::ImageInfo getImageInfo() = 0; virtual ze_image_desc_t getImageDesc() = 0; + virtual ze_result_t getMemoryProperties(ze_image_memory_properties_exp_t *pMemoryProperties) = 0; static Image *fromHandle(ze_image_handle_t handle) { return static_cast(handle); } diff --git a/level_zero/core/source/image/image_imp.h b/level_zero/core/source/image/image_imp.h index 45ed8745fa..b22d39593a 100644 --- a/level_zero/core/source/image/image_imp.h +++ b/level_zero/core/source/image/image_imp.h @@ -25,6 +25,15 @@ struct ImageImp : public Image { ze_image_desc_t getImageDesc() override { return imageFormatDesc; } + + ze_result_t getMemoryProperties(ze_image_memory_properties_exp_t *pMemoryProperties) override { + pMemoryProperties->rowPitch = imgInfo.rowPitch; + pMemoryProperties->slicePitch = imgInfo.slicePitch; + pMemoryProperties->size = imgInfo.surfaceFormat->ImageElementSizeInBytes; + + return ZE_RESULT_SUCCESS; + } + static NEO::ImageType convertType(const ze_image_type_t type) { switch (type) { case ZE_IMAGE_TYPE_2D: diff --git a/level_zero/core/test/unit_tests/sources/image/test_image.cpp b/level_zero/core/test/unit_tests/sources/image/test_image.cpp index dc871b2d0c..056c7758db 100644 --- a/level_zero/core/test/unit_tests/sources/image/test_image.cpp +++ b/level_zero/core/test/unit_tests/sources/image/test_image.cpp @@ -619,5 +619,42 @@ TEST(ImageFormatDescHelperTest, givenSupportedSwizzlesThenProperClEnumIsReturned EXPECT_EQ(getClChannelOrder(format), static_cast(CL_BGRA)); } +using ImageGetMemoryProperties = Test; + +HWTEST2_F(ImageGetMemoryProperties, givenImageMemoryPropertiesExpStructureWhenGetMemroyPropertiesThenProperDataAreSet, ImageSupport) { + ze_image_desc_t zeDesc = {}; + zeDesc.arraylevels = 1u; + zeDesc.depth = 1u; + zeDesc.height = 1u; + zeDesc.width = 1u; + zeDesc.miplevels = 1u; + zeDesc.type = ZE_IMAGE_TYPE_2DARRAY; + zeDesc.flags = ZE_IMAGE_FLAG_BIAS_UNCACHED; + + zeDesc.format = {ZE_IMAGE_FORMAT_LAYOUT_32, + 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}; + + Image *image_ptr; + auto result = Image::create(productFamily, device, &zeDesc, &image_ptr); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + std::unique_ptr image(image_ptr); + + ASSERT_NE(image, nullptr); + + ze_image_memory_properties_exp_t imageMemoryPropertiesExp = {}; + + image->getMemoryProperties(&imageMemoryPropertiesExp); + + auto imageInfo = image->getImageInfo(); + + EXPECT_EQ(imageInfo.surfaceFormat->ImageElementSizeInBytes, imageMemoryPropertiesExp.size); + EXPECT_EQ(imageInfo.slicePitch, imageMemoryPropertiesExp.slicePitch); + EXPECT_EQ(imageInfo.rowPitch, imageMemoryPropertiesExp.rowPitch); +} + } // namespace ult } // namespace L0