Skip to content

Commit c57c181

Browse files
committed
Move urMemImageGetInfo success test from a switch to individual test.
Added implementation details to OpenCL adapter for processing image format structs. Added a couple missing enums to spec for ur_image_info_t and added CTS tests for these.
1 parent 4643d1c commit c57c181

File tree

10 files changed

+404
-138
lines changed

10 files changed

+404
-138
lines changed

include/ur_api.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -3322,6 +3322,12 @@ typedef enum ur_image_info_t {
33223322
UR_IMAGE_INFO_HEIGHT = 5,
33233323
/// [size_t] image depth
33243324
UR_IMAGE_INFO_DEPTH = 6,
3325+
/// [size_t] array size
3326+
UR_IMAGE_INFO_ARRAY_SIZE = 7,
3327+
/// [uint32_t] number of MIP levels
3328+
UR_IMAGE_INFO_NUM_MIP_LEVELS = 8,
3329+
/// [uint32_t] number of samples
3330+
UR_IMAGE_INFO_NUM_SAMPLES = 9,
33253331
/// @cond
33263332
UR_IMAGE_INFO_FORCE_UINT32 = 0x7fffffff
33273333
/// @endcond
@@ -3835,7 +3841,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemGetInfo(
38353841
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
38363842
/// + `NULL == hMemory`
38373843
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
3838-
/// + `::UR_IMAGE_INFO_DEPTH < propName`
3844+
/// + `::UR_IMAGE_INFO_NUM_SAMPLES < propName`
38393845
/// - ::UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION
38403846
/// + If `propName` is not supported by the adapter.
38413847
/// - ::UR_RESULT_ERROR_INVALID_SIZE
@@ -9497,7 +9503,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImageCopyExp(
94979503
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
94989504
/// + `NULL == hContext`
94999505
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
9500-
/// + `::UR_IMAGE_INFO_DEPTH < propName`
9506+
/// + `::UR_IMAGE_INFO_NUM_SAMPLES < propName`
95019507
/// - ::UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION
95029508
/// + If `propName` is not supported by the adapter.
95039509
/// - ::UR_RESULT_ERROR_INVALID_SIZE

include/ur_print.hpp

+48
Original file line numberDiff line numberDiff line change
@@ -6444,6 +6444,15 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_image_info_t value) {
64446444
case UR_IMAGE_INFO_DEPTH:
64456445
os << "UR_IMAGE_INFO_DEPTH";
64466446
break;
6447+
case UR_IMAGE_INFO_ARRAY_SIZE:
6448+
os << "UR_IMAGE_INFO_ARRAY_SIZE";
6449+
break;
6450+
case UR_IMAGE_INFO_NUM_MIP_LEVELS:
6451+
os << "UR_IMAGE_INFO_NUM_MIP_LEVELS";
6452+
break;
6453+
case UR_IMAGE_INFO_NUM_SAMPLES:
6454+
os << "UR_IMAGE_INFO_NUM_SAMPLES";
6455+
break;
64476456
default:
64486457
os << "unknown enumerator";
64496458
break;
@@ -6552,6 +6561,45 @@ inline ur_result_t printTagged(std::ostream &os, const void *ptr,
65526561

65536562
os << ")";
65546563
} break;
6564+
case UR_IMAGE_INFO_ARRAY_SIZE: {
6565+
const size_t *tptr = (const size_t *)ptr;
6566+
if (sizeof(size_t) > size) {
6567+
os << "invalid size (is: " << size << ", expected: >=" << sizeof(size_t)
6568+
<< ")";
6569+
return UR_RESULT_ERROR_INVALID_SIZE;
6570+
}
6571+
os << (const void *)(tptr) << " (";
6572+
6573+
os << *tptr;
6574+
6575+
os << ")";
6576+
} break;
6577+
case UR_IMAGE_INFO_NUM_MIP_LEVELS: {
6578+
const uint32_t *tptr = (const uint32_t *)ptr;
6579+
if (sizeof(uint32_t) > size) {
6580+
os << "invalid size (is: " << size << ", expected: >=" << sizeof(uint32_t)
6581+
<< ")";
6582+
return UR_RESULT_ERROR_INVALID_SIZE;
6583+
}
6584+
os << (const void *)(tptr) << " (";
6585+
6586+
os << *tptr;
6587+
6588+
os << ")";
6589+
} break;
6590+
case UR_IMAGE_INFO_NUM_SAMPLES: {
6591+
const uint32_t *tptr = (const uint32_t *)ptr;
6592+
if (sizeof(uint32_t) > size) {
6593+
os << "invalid size (is: " << size << ", expected: >=" << sizeof(uint32_t)
6594+
<< ")";
6595+
return UR_RESULT_ERROR_INVALID_SIZE;
6596+
}
6597+
os << (const void *)(tptr) << " (";
6598+
6599+
os << *tptr;
6600+
6601+
os << ")";
6602+
} break;
65556603
default:
65566604
os << "unknown enumerator";
65576605
return UR_RESULT_ERROR_INVALID_ENUMERATION;

scripts/core/memory.yml

+6
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ etors:
160160
desc: "[size_t] image height"
161161
- name: DEPTH
162162
desc: "[size_t] image depth"
163+
- name: ARRAY_SIZE
164+
desc: "[size_t] array size"
165+
- name: NUM_MIP_LEVELS
166+
desc: "[uint32_t] number of MIP levels"
167+
- name: NUM_SAMPLES
168+
desc: "[uint32_t] number of samples"
163169
--- #--------------------------------------------------------------------------
164170
type: struct
165171
desc: "Image format including channel layout and data type"

source/adapters/opencl/memory.cpp

+98
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,92 @@
1010

1111
#include "common.hpp"
1212

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+
1399
cl_image_format mapURImageFormatToCL(const ur_image_format_t *PImageFormat) {
14100
cl_image_format CLImageFormat;
15101
switch (PImageFormat->channelOrder) {
@@ -174,6 +260,12 @@ cl_int mapURMemImageInfoToCL(ur_image_info_t URPropName) {
174260
return CL_IMAGE_HEIGHT;
175261
case UR_IMAGE_INFO_DEPTH:
176262
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;
177269
default:
178270
return -1;
179271
}
@@ -397,6 +489,12 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemImageGetInfo(ur_mem_handle_t hMemory,
397489
CL_RETURN_ON_FAILURE(ClResult);
398490
if (pPropSizeRet) {
399491
*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+
}
400498
}
401499
return UR_RESULT_SUCCESS;
402500
}

source/loader/layers/validation/ur_valddi.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1470,7 +1470,7 @@ __urdlllocal ur_result_t UR_APICALL urMemImageGetInfo(
14701470
if (pPropValue == NULL && pPropSizeRet == NULL)
14711471
return UR_RESULT_ERROR_INVALID_NULL_POINTER;
14721472

1473-
if (UR_IMAGE_INFO_DEPTH < propName)
1473+
if (UR_IMAGE_INFO_NUM_SAMPLES < propName)
14741474
return UR_RESULT_ERROR_INVALID_ENUMERATION;
14751475

14761476
if (propSize == 0 && pPropValue != NULL)
@@ -7069,7 +7069,7 @@ __urdlllocal ur_result_t UR_APICALL urBindlessImagesImageGetInfoExp(
70697069
if (pPropValue == NULL && pPropSizeRet == NULL)
70707070
return UR_RESULT_ERROR_INVALID_NULL_POINTER;
70717071

7072-
if (UR_IMAGE_INFO_DEPTH < propName)
7072+
if (UR_IMAGE_INFO_NUM_SAMPLES < propName)
70737073
return UR_RESULT_ERROR_INVALID_ENUMERATION;
70747074
}
70757075

source/loader/ur_libapi.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1943,7 +1943,7 @@ ur_result_t UR_APICALL urMemGetInfo(
19431943
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
19441944
/// + `NULL == hMemory`
19451945
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
1946-
/// + `::UR_IMAGE_INFO_DEPTH < propName`
1946+
/// + `::UR_IMAGE_INFO_NUM_SAMPLES < propName`
19471947
/// - ::UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION
19481948
/// + If `propName` is not supported by the adapter.
19491949
/// - ::UR_RESULT_ERROR_INVALID_SIZE
@@ -7120,7 +7120,7 @@ ur_result_t UR_APICALL urBindlessImagesImageCopyExp(
71207120
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
71217121
/// + `NULL == hContext`
71227122
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
7123-
/// + `::UR_IMAGE_INFO_DEPTH < propName`
7123+
/// + `::UR_IMAGE_INFO_NUM_SAMPLES < propName`
71247124
/// - ::UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION
71257125
/// + If `propName` is not supported by the adapter.
71267126
/// - ::UR_RESULT_ERROR_INVALID_SIZE

source/ur_api.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1720,7 +1720,7 @@ ur_result_t UR_APICALL urMemGetInfo(
17201720
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
17211721
/// + `NULL == hMemory`
17221722
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
1723-
/// + `::UR_IMAGE_INFO_DEPTH < propName`
1723+
/// + `::UR_IMAGE_INFO_NUM_SAMPLES < propName`
17241724
/// - ::UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION
17251725
/// + If `propName` is not supported by the adapter.
17261726
/// - ::UR_RESULT_ERROR_INVALID_SIZE
@@ -6249,7 +6249,7 @@ ur_result_t UR_APICALL urBindlessImagesImageCopyExp(
62496249
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
62506250
/// + `NULL == hContext`
62516251
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
6252-
/// + `::UR_IMAGE_INFO_DEPTH < propName`
6252+
/// + `::UR_IMAGE_INFO_NUM_SAMPLES < propName`
62536253
/// - ::UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION
62546254
/// + If `propName` is not supported by the adapter.
62556255
/// - ::UR_RESULT_ERROR_INVALID_SIZE

0 commit comments

Comments
 (0)