mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-06 10:26:29 +08:00
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:
committed by
Compute-Runtime-Automation
parent
f198507875
commit
badbecb126
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user