• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_optional_features {
53    bool fp16;
54    bool fp64;
55    bool int64;
56    bool images;
57    bool images_read_write;
58    bool images_write_3d;
59    bool intel_subgroups;
60    bool subgroups;
61 };
62 
63 struct clc_compile_args {
64    const struct clc_named_value *headers;
65    unsigned num_headers;
66    struct clc_named_value source;
67    const char * const *args;
68    unsigned num_args;
69 
70    /* SPIRV version to target. */
71    enum clc_spirv_version spirv_version;
72    struct clc_optional_features features;
73 
74    /* Allowed extensions SPIRV extensions the OpenCL->SPIRV translation can
75     * enable. A pointer to a NULL terminated array of strings, allow any
76     * extension if NULL.
77     */
78    const char * const *allowed_spirv_extensions;
79 };
80 
81 struct clc_binary {
82    void *data;
83    size_t size;
84 };
85 
86 struct clc_linker_args {
87    const struct clc_binary * const *in_objs;
88    unsigned num_in_objs;
89    unsigned create_library;
90 };
91 
92 typedef void (*clc_msg_callback)(void *priv, const char *msg);
93 
94 struct clc_logger {
95    void *priv;
96    clc_msg_callback error;
97    clc_msg_callback warning;
98 };
99 
100 enum clc_kernel_arg_type_qualifier {
101    CLC_KERNEL_ARG_TYPE_CONST = 1 << 0,
102    CLC_KERNEL_ARG_TYPE_RESTRICT = 1 << 1,
103    CLC_KERNEL_ARG_TYPE_VOLATILE = 1 << 2,
104 };
105 
106 enum clc_kernel_arg_access_qualifier {
107    CLC_KERNEL_ARG_ACCESS_READ = 1 << 0,
108    CLC_KERNEL_ARG_ACCESS_WRITE = 1 << 1,
109 };
110 
111 enum clc_kernel_arg_address_qualifier {
112    CLC_KERNEL_ARG_ADDRESS_PRIVATE,
113    CLC_KERNEL_ARG_ADDRESS_CONSTANT,
114    CLC_KERNEL_ARG_ADDRESS_LOCAL,
115    CLC_KERNEL_ARG_ADDRESS_GLOBAL,
116 };
117 
118 struct clc_kernel_arg {
119    const char *name;
120    const char *type_name;
121    unsigned type_qualifier;
122    unsigned access_qualifier;
123    enum clc_kernel_arg_address_qualifier address_qualifier;
124 };
125 
126 enum clc_vec_hint_type {
127    CLC_VEC_HINT_TYPE_CHAR = 0,
128    CLC_VEC_HINT_TYPE_SHORT = 1,
129    CLC_VEC_HINT_TYPE_INT = 2,
130    CLC_VEC_HINT_TYPE_LONG = 3,
131    CLC_VEC_HINT_TYPE_HALF = 4,
132    CLC_VEC_HINT_TYPE_FLOAT = 5,
133    CLC_VEC_HINT_TYPE_DOUBLE = 6
134 };
135 
136 struct clc_kernel_info {
137    const char *name;
138    size_t num_args;
139    const struct clc_kernel_arg *args;
140 
141    unsigned vec_hint_size;
142    enum clc_vec_hint_type vec_hint_type;
143 
144    unsigned local_size[3];
145    unsigned local_size_hint[3];
146 };
147 
148 enum clc_spec_constant_type {
149    CLC_SPEC_CONSTANT_UNKNOWN,
150    CLC_SPEC_CONSTANT_BOOL,
151    CLC_SPEC_CONSTANT_FLOAT,
152    CLC_SPEC_CONSTANT_DOUBLE,
153    CLC_SPEC_CONSTANT_INT8,
154    CLC_SPEC_CONSTANT_UINT8,
155    CLC_SPEC_CONSTANT_INT16,
156    CLC_SPEC_CONSTANT_UINT16,
157    CLC_SPEC_CONSTANT_INT32,
158    CLC_SPEC_CONSTANT_UINT32,
159    CLC_SPEC_CONSTANT_INT64,
160    CLC_SPEC_CONSTANT_UINT64,
161 };
162 
163 struct clc_parsed_spec_constant {
164    uint32_t id;
165    enum clc_spec_constant_type type;
166 };
167 
168 struct clc_parsed_spirv {
169    const struct clc_kernel_info *kernels;
170    unsigned num_kernels;
171 
172    const struct clc_parsed_spec_constant *spec_constants;
173    unsigned num_spec_constants;
174 };
175 
176 struct clc_libclc;
177 
178 struct clc_libclc_options {
179    unsigned optimize;
180    const struct nir_shader_compiler_options *nir_options;
181 };
182 
183 struct clc_libclc *clc_libclc_new(const struct clc_logger *logger, const struct clc_libclc_options *options);
184 
185 void clc_free_libclc(struct clc_libclc *lib);
186 
187 const nir_shader *clc_libclc_get_clc_shader(struct clc_libclc *lib);
188 
189 void clc_libclc_serialize(struct clc_libclc *lib, void **serialized, size_t *size);
190 void clc_libclc_free_serialized(void *serialized);
191 struct clc_libclc *clc_libclc_deserialize(const void *serialized, size_t size);
192 
193 bool
194 clc_compile_c_to_spir(const struct clc_compile_args *args,
195                       const struct clc_logger *logger,
196                       struct clc_binary *out_spir);
197 
198 void
199 clc_free_spir(struct clc_binary *spir);
200 
201 bool
202 clc_compile_spir_to_spirv(const struct clc_binary *in_spir,
203                           const struct clc_logger *logger,
204                           struct clc_binary *out_spirv);
205 
206 void
207 clc_free_spirv(struct clc_binary *spirv);
208 
209 bool
210 clc_compile_c_to_spirv(const struct clc_compile_args *args,
211                        const struct clc_logger *logger,
212                        struct clc_binary *out_spirv);
213 
214 bool
215 clc_link_spirv(const struct clc_linker_args *args,
216                const struct clc_logger *logger,
217                struct clc_binary *out_spirv);
218 
219 bool
220 clc_parse_spirv(const struct clc_binary *in_spirv,
221                 const struct clc_logger *logger,
222                 struct clc_parsed_spirv *out_data);
223 
224 void
225 clc_free_parsed_spirv(struct clc_parsed_spirv *data);
226 
227 typedef union {
228    bool b;
229    float f32;
230    double f64;
231    int8_t i8;
232    uint8_t u8;
233    int16_t i16;
234    uint16_t u16;
235    int32_t i32;
236    uint32_t u32;
237    int64_t i64;
238    uint64_t u64;
239 } clc_spirv_const_value;
240 
241 struct clc_spirv_specialization {
242    uint32_t id;
243    clc_spirv_const_value value;
244    bool defined_on_module;
245 };
246 
247 struct clc_spirv_specialization_consts {
248    const struct clc_spirv_specialization *specializations;
249    unsigned num_specializations;
250 };
251 
252 bool
253 clc_specialize_spirv(const struct clc_binary *in_spirv,
254                      const struct clc_parsed_spirv *parsed_data,
255                      const struct clc_spirv_specialization_consts *consts,
256                      struct clc_binary *out_spirv);
257 
258 #ifdef __cplusplus
259 }
260 #endif
261 
262 #endif /* MESA_CLC_H */
263