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