1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/*
* Copyright (C) 2021-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/helpers/debug_helpers.h"
#include "shared/source/helpers/surface_format_info.h"
#include <level_zero/ze_api.h>
#include <cstdint>
namespace L0 {
inline NEO::ImageType convertType(const ze_image_type_t type) {
switch (type) {
case ZE_IMAGE_TYPE_2D:
return NEO::ImageType::Image2D;
case ZE_IMAGE_TYPE_3D:
return NEO::ImageType::Image3D;
case ZE_IMAGE_TYPE_2DARRAY:
return NEO::ImageType::Image2DArray;
case ZE_IMAGE_TYPE_1D:
return NEO::ImageType::Image1D;
case ZE_IMAGE_TYPE_1DARRAY:
return NEO::ImageType::Image1DArray;
case ZE_IMAGE_TYPE_BUFFER:
return NEO::ImageType::Image1DBuffer;
default:
break;
}
return NEO::ImageType::Invalid;
}
inline NEO::ImageDescriptor convertDescriptor(const ze_image_desc_t &imageDesc) {
NEO::ImageDescriptor desc = {};
desc.fromParent = false;
desc.imageArraySize = imageDesc.arraylevels;
desc.imageDepth = imageDesc.depth;
desc.imageHeight = imageDesc.height;
desc.imageRowPitch = 0u;
desc.imageSlicePitch = 0u;
desc.imageType = convertType(imageDesc.type);
desc.imageWidth = imageDesc.width;
desc.numMipLevels = imageDesc.miplevels;
desc.numSamples = 0u;
return desc;
}
struct StructuresLookupTable {
struct ImageProperties {
NEO::ImageDescriptor imageDescriptor;
uint32_t planeIndex;
bool isPlanarExtension;
} imageProperties;
struct SharedHandleType {
void *ntHnadle;
int fd;
bool isSupportedHandle;
bool isDMABUFHandle;
bool isNTHandle;
} sharedHandleType;
bool areImageProperties;
bool exportMemory;
bool isSharedHandle;
bool relaxedSizeAllowed;
bool compressedHint;
bool uncompressedHint;
bool rayTracingMemory;
};
inline ze_result_t prepareL0StructuresLookupTable(StructuresLookupTable &lookupTable, const void *desc) {
const ze_base_desc_t *extendedDesc = reinterpret_cast<const ze_base_desc_t *>(desc);
while (extendedDesc) {
if (extendedDesc->stype == ZE_STRUCTURE_TYPE_IMAGE_DESC) {
const ze_image_desc_t *imageDesc = reinterpret_cast<const ze_image_desc_t *>(extendedDesc);
lookupTable.areImageProperties = true;
lookupTable.imageProperties.imageDescriptor = convertDescriptor(*imageDesc);
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_FD) {
lookupTable.isSharedHandle = true;
const ze_external_memory_import_fd_t *linuxExternalMemoryImportDesc = reinterpret_cast<const ze_external_memory_import_fd_t *>(extendedDesc);
if (linuxExternalMemoryImportDesc->flags == ZE_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF) {
lookupTable.sharedHandleType.isSupportedHandle = true;
lookupTable.sharedHandleType.isDMABUFHandle = true;
lookupTable.sharedHandleType.fd = linuxExternalMemoryImportDesc->fd;
} else {
lookupTable.sharedHandleType.isSupportedHandle = false;
return ZE_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
}
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32) {
lookupTable.isSharedHandle = true;
const ze_external_memory_import_win32_handle_t *windowsExternalMemoryImportDesc = reinterpret_cast<const ze_external_memory_import_win32_handle_t *>(extendedDesc);
if (windowsExternalMemoryImportDesc->flags == ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32) {
lookupTable.sharedHandleType.isSupportedHandle = true;
lookupTable.sharedHandleType.isNTHandle = true;
lookupTable.sharedHandleType.ntHnadle = windowsExternalMemoryImportDesc->handle;
} else {
lookupTable.sharedHandleType.isSupportedHandle = false;
return ZE_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
}
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_IMAGE_VIEW_PLANAR_EXP_DESC) {
const ze_image_view_planar_exp_desc_t *imageViewDesc = reinterpret_cast<const ze_image_view_planar_exp_desc_t *>(extendedDesc);
lookupTable.areImageProperties = true;
lookupTable.imageProperties.isPlanarExtension = true;
lookupTable.imageProperties.planeIndex = imageViewDesc->planeIndex;
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_RELAXED_ALLOCATION_LIMITS_EXP_DESC) {
const ze_relaxed_allocation_limits_exp_desc_t *relaxedLimitsDesc =
reinterpret_cast<const ze_relaxed_allocation_limits_exp_desc_t *>(extendedDesc);
if (!(relaxedLimitsDesc->flags & ZE_RELAXED_ALLOCATION_LIMITS_EXP_FLAG_MAX_SIZE)) {
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
}
lookupTable.relaxedSizeAllowed = true;
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_EXPORT_DESC) {
const ze_external_memory_export_desc_t *externalMemoryExportDesc =
reinterpret_cast<const ze_external_memory_export_desc_t *>(extendedDesc);
if (externalMemoryExportDesc->flags & ZE_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF || externalMemoryExportDesc->flags & ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32) {
lookupTable.exportMemory = true;
} else {
return ZE_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
}
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_MEMORY_COMPRESSION_HINTS_EXT_DESC) {
auto memoryCompressionHintsDesc = reinterpret_cast<const ze_memory_compression_hints_ext_desc_t *>(extendedDesc);
if (memoryCompressionHintsDesc->flags == ZE_MEMORY_COMPRESSION_HINTS_EXT_FLAG_COMPRESSED) {
lookupTable.compressedHint = true;
} else if (memoryCompressionHintsDesc->flags == ZE_MEMORY_COMPRESSION_HINTS_EXT_FLAG_UNCOMPRESSED) {
lookupTable.uncompressedHint = true;
} else {
return ZE_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
}
} else if (extendedDesc->stype == ZE_STRUCTURE_TYPE_RAYTRACING_MEM_ALLOC_EXT_DESC) {
lookupTable.rayTracingMemory = true;
} else {
return ZE_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
}
extendedDesc = reinterpret_cast<const ze_base_desc_t *>(extendedDesc->pNext);
}
if (lookupTable.areImageProperties && lookupTable.exportMemory) {
return ZE_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
}
return ZE_RESULT_SUCCESS;
}
} // namespace L0
|