xref: /aosp_15_r20/external/mesa3d/src/compiler/clc/clc.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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