1 /* 2 * Copyright © Microsoft Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #ifndef MESA_CLC_H 25 #define MESA_CLC_H 26 27 #include <stdbool.h> 28 #include <stddef.h> 29 #include <stdint.h> 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 typedef struct nir_shader nir_shader; 36 struct nir_shader_compiler_options; 37 38 struct clc_named_value { 39 const char *name; 40 const char *value; 41 }; 42 43 enum clc_spirv_version { 44 CLC_SPIRV_VERSION_MAX = 0, 45 CLC_SPIRV_VERSION_1_0, 46 CLC_SPIRV_VERSION_1_1, 47 CLC_SPIRV_VERSION_1_2, 48 CLC_SPIRV_VERSION_1_3, 49 CLC_SPIRV_VERSION_1_4, 50 }; 51 52 struct clc_compile_args { 53 const struct clc_named_value *headers; 54 unsigned num_headers; 55 struct clc_named_value source; 56 const char * const *args; 57 unsigned num_args; 58 59 /* SPIRV version to target. */ 60 enum clc_spirv_version spirv_version; 61 62 /* Allowed extensions SPIRV extensions the OpenCL->SPIRV translation can 63 * enable. A pointer to a NULL terminated array of strings, allow any 64 * extension if NULL. 65 */ 66 const char * const *allowed_spirv_extensions; 67 }; 68 69 struct clc_binary { 70 void *data; 71 size_t size; 72 }; 73 74 struct clc_linker_args { 75 const struct clc_binary * const *in_objs; 76 unsigned num_in_objs; 77 unsigned create_library; 78 }; 79 80 typedef void (*clc_msg_callback)(void *priv, const char *msg); 81 82 struct clc_logger { 83 void *priv; 84 clc_msg_callback error; 85 clc_msg_callback warning; 86 }; 87 88 enum clc_kernel_arg_type_qualifier { 89 CLC_KERNEL_ARG_TYPE_CONST = 1 << 0, 90 CLC_KERNEL_ARG_TYPE_RESTRICT = 1 << 1, 91 CLC_KERNEL_ARG_TYPE_VOLATILE = 1 << 2, 92 }; 93 94 enum clc_kernel_arg_access_qualifier { 95 CLC_KERNEL_ARG_ACCESS_READ = 1 << 0, 96 CLC_KERNEL_ARG_ACCESS_WRITE = 1 << 1, 97 }; 98 99 enum clc_kernel_arg_address_qualifier { 100 CLC_KERNEL_ARG_ADDRESS_PRIVATE, 101 CLC_KERNEL_ARG_ADDRESS_CONSTANT, 102 CLC_KERNEL_ARG_ADDRESS_LOCAL, 103 CLC_KERNEL_ARG_ADDRESS_GLOBAL, 104 }; 105 106 struct clc_kernel_arg { 107 const char *name; 108 const char *type_name; 109 unsigned type_qualifier; 110 unsigned access_qualifier; 111 enum clc_kernel_arg_address_qualifier address_qualifier; 112 }; 113 114 enum clc_vec_hint_type { 115 CLC_VEC_HINT_TYPE_CHAR = 0, 116 CLC_VEC_HINT_TYPE_SHORT = 1, 117 CLC_VEC_HINT_TYPE_INT = 2, 118 CLC_VEC_HINT_TYPE_LONG = 3, 119 CLC_VEC_HINT_TYPE_HALF = 4, 120 CLC_VEC_HINT_TYPE_FLOAT = 5, 121 CLC_VEC_HINT_TYPE_DOUBLE = 6 122 }; 123 124 struct clc_kernel_info { 125 const char *name; 126 size_t num_args; 127 const struct clc_kernel_arg *args; 128 129 unsigned vec_hint_size; 130 enum clc_vec_hint_type vec_hint_type; 131 }; 132 133 enum clc_spec_constant_type { 134 CLC_SPEC_CONSTANT_UNKNOWN, 135 CLC_SPEC_CONSTANT_BOOL, 136 CLC_SPEC_CONSTANT_FLOAT, 137 CLC_SPEC_CONSTANT_DOUBLE, 138 CLC_SPEC_CONSTANT_INT8, 139 CLC_SPEC_CONSTANT_UINT8, 140 CLC_SPEC_CONSTANT_INT16, 141 CLC_SPEC_CONSTANT_UINT16, 142 CLC_SPEC_CONSTANT_INT32, 143 CLC_SPEC_CONSTANT_UINT32, 144 CLC_SPEC_CONSTANT_INT64, 145 CLC_SPEC_CONSTANT_UINT64, 146 }; 147 148 struct clc_parsed_spec_constant { 149 uint32_t id; 150 enum clc_spec_constant_type type; 151 }; 152 153 struct clc_parsed_spirv { 154 const struct clc_kernel_info *kernels; 155 unsigned num_kernels; 156 157 const struct clc_parsed_spec_constant *spec_constants; 158 unsigned num_spec_constants; 159 }; 160 161 struct clc_libclc; 162 163 struct clc_libclc_options { 164 unsigned optimize; 165 const struct nir_shader_compiler_options *nir_options; 166 }; 167 168 struct clc_libclc *clc_libclc_new(const struct clc_logger *logger, const struct clc_libclc_options *options); 169 170 void clc_free_libclc(struct clc_libclc *lib); 171 172 const nir_shader *clc_libclc_get_clc_shader(struct clc_libclc *lib); 173 174 void clc_libclc_serialize(struct clc_libclc *lib, void **serialized, size_t *size); 175 void clc_libclc_free_serialized(void *serialized); 176 struct clc_libclc *clc_libclc_deserialize(const void *serialized, size_t size); 177 178 bool 179 clc_compile_c_to_spir(const struct clc_compile_args *args, 180 const struct clc_logger *logger, 181 struct clc_binary *out_spir); 182 183 void 184 clc_free_spir(struct clc_binary *spir); 185 186 bool 187 clc_compile_spir_to_spirv(const struct clc_binary *in_spir, 188 const struct clc_logger *logger, 189 struct clc_binary *out_spirv); 190 191 void 192 clc_free_spirv(struct clc_binary *spirv); 193 194 bool 195 clc_compile_c_to_spirv(const struct clc_compile_args *args, 196 const struct clc_logger *logger, 197 struct clc_binary *out_spirv); 198 199 bool 200 clc_link_spirv(const struct clc_linker_args *args, 201 const struct clc_logger *logger, 202 struct clc_binary *out_spirv); 203 204 bool 205 clc_parse_spirv(const struct clc_binary *in_spirv, 206 const struct clc_logger *logger, 207 struct clc_parsed_spirv *out_data); 208 209 void 210 clc_free_parsed_spirv(struct clc_parsed_spirv *data); 211 212 typedef union { 213 bool b; 214 float f32; 215 double f64; 216 int8_t i8; 217 uint8_t u8; 218 int16_t i16; 219 uint16_t u16; 220 int32_t i32; 221 uint32_t u32; 222 int64_t i64; 223 uint64_t u64; 224 } clc_spirv_const_value; 225 226 struct clc_spirv_specialization { 227 uint32_t id; 228 clc_spirv_const_value value; 229 bool defined_on_module; 230 }; 231 232 struct clc_spirv_specialization_consts { 233 const struct clc_spirv_specialization *specializations; 234 unsigned num_specializations; 235 }; 236 237 bool 238 clc_specialize_spirv(const struct clc_binary *in_spirv, 239 const struct clc_parsed_spirv *parsed_data, 240 const struct clc_spirv_specialization_consts *consts, 241 struct clc_binary *out_spirv); 242 243 #ifdef __cplusplus 244 } 245 #endif 246 247 #endif /* MESA_CLC_H */ 248