|
10 | 10 |
|
11 | 11 | #include "common.hpp"
|
12 | 12 |
|
| 13 | +#include <unordered_map> |
| 14 | + |
| 15 | +const std::unordered_map<ur_image_channel_order_t, cl_channel_order> |
| 16 | + ChannelOrderMap = { |
| 17 | + {UR_IMAGE_CHANNEL_ORDER_A, CL_A}, |
| 18 | + {UR_IMAGE_CHANNEL_ORDER_R, CL_R}, |
| 19 | + {UR_IMAGE_CHANNEL_ORDER_RG, CL_RG}, |
| 20 | + {UR_IMAGE_CHANNEL_ORDER_RA, CL_RA}, |
| 21 | + {UR_IMAGE_CHANNEL_ORDER_RGB, CL_RGB}, |
| 22 | + {UR_IMAGE_CHANNEL_ORDER_RGBA, CL_RGBA}, |
| 23 | + {UR_IMAGE_CHANNEL_ORDER_BGRA, CL_BGRA}, |
| 24 | + {UR_IMAGE_CHANNEL_ORDER_ARGB, CL_ARGB}, |
| 25 | + {UR_IMAGE_CHANNEL_ORDER_ABGR, CL_ABGR}, |
| 26 | + {UR_IMAGE_CHANNEL_ORDER_INTENSITY, CL_INTENSITY}, |
| 27 | + {UR_IMAGE_CHANNEL_ORDER_LUMINANCE, CL_LUMINANCE}, |
| 28 | + {UR_IMAGE_CHANNEL_ORDER_RX, CL_Rx}, |
| 29 | + {UR_IMAGE_CHANNEL_ORDER_RGX, CL_RGx}, |
| 30 | + {UR_IMAGE_CHANNEL_ORDER_RGBX, CL_RGBx}, |
| 31 | + {UR_IMAGE_CHANNEL_ORDER_SRGBA, CL_sRGBA}, |
| 32 | +}; |
| 33 | + |
| 34 | +const std::unordered_map<ur_image_channel_type_t, cl_channel_type> |
| 35 | + ChannelTypeMap = { |
| 36 | + {UR_IMAGE_CHANNEL_TYPE_SNORM_INT8, CL_SNORM_INT8}, |
| 37 | + {UR_IMAGE_CHANNEL_TYPE_SNORM_INT16, CL_SNORM_INT16}, |
| 38 | + {UR_IMAGE_CHANNEL_TYPE_UNORM_INT8, CL_UNORM_INT8}, |
| 39 | + {UR_IMAGE_CHANNEL_TYPE_UNORM_INT16, CL_UNORM_INT16}, |
| 40 | + {UR_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565, CL_UNORM_SHORT_565}, |
| 41 | + {UR_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555, CL_UNORM_SHORT_555}, |
| 42 | + {UR_IMAGE_CHANNEL_TYPE_INT_101010, CL_UNORM_INT_101010}, |
| 43 | + {UR_IMAGE_CHANNEL_TYPE_SIGNED_INT8, CL_SIGNED_INT8}, |
| 44 | + {UR_IMAGE_CHANNEL_TYPE_SIGNED_INT16, CL_SIGNED_INT16}, |
| 45 | + {UR_IMAGE_CHANNEL_TYPE_SIGNED_INT32, CL_SIGNED_INT32}, |
| 46 | + {UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8, CL_UNSIGNED_INT8}, |
| 47 | + {UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16, CL_UNSIGNED_INT16}, |
| 48 | + {UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32, CL_UNSIGNED_INT32}, |
| 49 | + {UR_IMAGE_CHANNEL_TYPE_HALF_FLOAT, CL_HALF_FLOAT}, |
| 50 | + {UR_IMAGE_CHANNEL_TYPE_FLOAT, CL_FLOAT}, |
| 51 | +}; |
| 52 | + |
| 53 | +cl_image_format mapURImageFormatToCL(const ur_image_format_t &PImageFormat) { |
| 54 | + cl_image_format CLImageFormat = {UR_IMAGE_CHANNEL_ORDER_FORCE_UINT32, |
| 55 | + UR_IMAGE_CHANNEL_TYPE_FORCE_UINT32}; |
| 56 | + |
| 57 | + auto channelOrderIt = ChannelOrderMap.find(PImageFormat.channelOrder); |
| 58 | + if (channelOrderIt != ChannelOrderMap.end()) { |
| 59 | + CLImageFormat.image_channel_order = channelOrderIt->second; |
| 60 | + } |
| 61 | + |
| 62 | + auto channelTypeIt = ChannelTypeMap.find(PImageFormat.channelType); |
| 63 | + if (channelTypeIt != ChannelTypeMap.end()) { |
| 64 | + CLImageFormat.image_channel_data_type = channelTypeIt->second; |
| 65 | + } |
| 66 | + |
| 67 | + return CLImageFormat; |
| 68 | +} |
| 69 | + |
| 70 | +ur_image_format_t mapCLImageFormatToUR(const cl_image_format *PImageFormat) { |
| 71 | + ur_image_format_t URImageFormat = {UR_IMAGE_CHANNEL_ORDER_FORCE_UINT32, |
| 72 | + UR_IMAGE_CHANNEL_TYPE_FORCE_UINT32}; |
| 73 | + |
| 74 | + auto reverseChannelOrderIt = |
| 75 | + std::find_if(ChannelOrderMap.begin(), ChannelOrderMap.end(), |
| 76 | + [PImageFormat](const auto &pair) { |
| 77 | + return pair.second == PImageFormat->image_channel_order; |
| 78 | + }); |
| 79 | + if (reverseChannelOrderIt != ChannelOrderMap.end()) { |
| 80 | + URImageFormat.channelOrder = reverseChannelOrderIt->first; |
| 81 | + } |
| 82 | + |
| 83 | + URImageFormat.channelOrder = (reverseChannelOrderIt != ChannelOrderMap.end()) |
| 84 | + ? reverseChannelOrderIt->first |
| 85 | + : UR_IMAGE_CHANNEL_ORDER_FORCE_UINT32; |
| 86 | + |
| 87 | + auto reverseChannelTypeIt = std::find_if( |
| 88 | + ChannelTypeMap.begin(), ChannelTypeMap.end(), |
| 89 | + [PImageFormat](const auto &pair) { |
| 90 | + return pair.second == PImageFormat->image_channel_data_type; |
| 91 | + }); |
| 92 | + if (reverseChannelTypeIt != ChannelTypeMap.end()) { |
| 93 | + URImageFormat.channelType = reverseChannelTypeIt->first; |
| 94 | + } |
| 95 | + |
| 96 | + return URImageFormat; |
| 97 | +} |
| 98 | + |
13 | 99 | cl_image_format mapURImageFormatToCL(const ur_image_format_t *PImageFormat) {
|
14 | 100 | cl_image_format CLImageFormat;
|
15 | 101 | switch (PImageFormat->channelOrder) {
|
@@ -174,6 +260,12 @@ cl_int mapURMemImageInfoToCL(ur_image_info_t URPropName) {
|
174 | 260 | return CL_IMAGE_HEIGHT;
|
175 | 261 | case UR_IMAGE_INFO_DEPTH:
|
176 | 262 | return CL_IMAGE_DEPTH;
|
| 263 | + case UR_IMAGE_INFO_ARRAY_SIZE: |
| 264 | + return CL_IMAGE_ARRAY_SIZE; |
| 265 | + case UR_IMAGE_INFO_NUM_MIP_LEVELS: |
| 266 | + return CL_IMAGE_NUM_MIP_LEVELS; |
| 267 | + case UR_IMAGE_INFO_NUM_SAMPLES: |
| 268 | + return CL_IMAGE_NUM_SAMPLES; |
177 | 269 | default:
|
178 | 270 | return -1;
|
179 | 271 | }
|
@@ -397,6 +489,12 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemImageGetInfo(ur_mem_handle_t hMemory,
|
397 | 489 | CL_RETURN_ON_FAILURE(ClResult);
|
398 | 490 | if (pPropSizeRet) {
|
399 | 491 | *pPropSizeRet = CheckPropSize;
|
| 492 | + } else { |
| 493 | + if (propName == UR_IMAGE_INFO_FORMAT) { |
| 494 | + ur_image_format_t format = mapCLImageFormatToUR( |
| 495 | + reinterpret_cast<const cl_image_format *>(pPropValue)); |
| 496 | + return ReturnValue(format); |
| 497 | + } |
400 | 498 | }
|
401 | 499 | return UR_RESULT_SUCCESS;
|
402 | 500 | }
|
|
0 commit comments