feature: adds support for 3 channel (2/N)

Allows user to create L0 images with 3 channel

Related-To: NEO-12887

Signed-off-by: Kulkarni, Ashwin Kumar <ashwin.kumar.kulkarni@intel.com>
This commit is contained in:
Kulkarni, Ashwin Kumar
2024-12-31 18:37:27 +00:00
committed by Compute-Runtime-Automation
parent f198507875
commit badbecb126
17 changed files with 1409 additions and 804 deletions

View File

@@ -52,6 +52,7 @@ struct Image : _ze_image_handle_t {
virtual ze_result_t allocateBindlessSlot() = 0;
virtual NEO::SurfaceStateInHeapInfo *getBindlessSlot() = 0;
virtual ze_result_t getDeviceOffset(uint64_t *deviceOffset) = 0;
virtual bool isMimickedImage() = 0;
static ze_result_t getPitchFor2dImage(
ze_device_handle_t hDevice,

View File

@@ -128,6 +128,58 @@ NEO::SurfaceStateInHeapInfo *ImageImp::getBindlessSlot() {
return bindlessInfo.get();
}
bool getImageDescriptor(const ze_image_desc_t *origImgDesc, ze_image_desc_t *imgDesc) {
bool modified = false;
*imgDesc = *origImgDesc;
if (origImgDesc->pNext) {
const ze_base_desc_t *extendedDesc = reinterpret_cast<const ze_base_desc_t *>(origImgDesc->pNext);
if (extendedDesc->stype != ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32) {
switch (origImgDesc->format.layout) {
default:
break;
case ZE_IMAGE_FORMAT_LAYOUT_16_16_16:
imgDesc->format.layout = ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16;
imgDesc->format.x = ZE_IMAGE_FORMAT_SWIZZLE_R;
imgDesc->format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
imgDesc->format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
imgDesc->format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
modified = true;
break;
case ZE_IMAGE_FORMAT_LAYOUT_8_8_8:
imgDesc->format.layout = ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8;
imgDesc->format.x = ZE_IMAGE_FORMAT_SWIZZLE_R;
imgDesc->format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
imgDesc->format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
imgDesc->format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
modified = true;
break;
}
}
} else {
switch (origImgDesc->format.layout) {
default:
break;
case ZE_IMAGE_FORMAT_LAYOUT_16_16_16:
imgDesc->format.layout = ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16;
imgDesc->format.x = ZE_IMAGE_FORMAT_SWIZZLE_R;
imgDesc->format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
imgDesc->format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
imgDesc->format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
modified = true;
break;
case ZE_IMAGE_FORMAT_LAYOUT_8_8_8:
imgDesc->format.layout = ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8;
imgDesc->format.x = ZE_IMAGE_FORMAT_SWIZZLE_R;
imgDesc->format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
imgDesc->format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
imgDesc->format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
modified = true;
break;
}
}
return modified;
}
ze_result_t Image::create(uint32_t productFamily, Device *device, const ze_image_desc_t *desc, Image **pImage) {
ze_result_t result = ZE_RESULT_SUCCESS;
ImageAllocatorFn allocator = nullptr;
@@ -138,7 +190,15 @@ ze_result_t Image::create(uint32_t productFamily, Device *device, const ze_image
ImageImp *image = nullptr;
if (allocator) {
image = static_cast<ImageImp *>((*allocator)());
result = image->initialize(device, desc);
ze_image_desc_t imgDesc = {};
bool modified = getImageDescriptor(desc, &imgDesc);
if (modified) {
image->setMimickedImage(true);
result = image->initialize(device, &imgDesc);
} else {
result = image->initialize(device, desc);
}
if (result != ZE_RESULT_SUCCESS) {
image->destroy();
image = nullptr;

View File

@@ -46,6 +46,14 @@ struct ImageImp : public Image, NEO::NonCopyableOrMovableClass {
return sourceImageFormatDesc.has_value();
}
bool isMimickedImage() override {
return mimickedImagefor3Ch;
}
void setMimickedImage(bool value) {
this->mimickedImagefor3Ch = value;
}
ze_result_t allocateBindlessSlot() override;
NEO::SurfaceStateInHeapInfo *getBindlessSlot() override;
ze_result_t getDeviceOffset(uint64_t *deviceOffset) override;
@@ -63,5 +71,6 @@ struct ImageImp : public Image, NEO::NonCopyableOrMovableClass {
bool bindlessImage = false;
bool imageFromBuffer = false;
bool sampledImage = false;
bool mimickedImagefor3Ch = false;
};
} // namespace L0