xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/zink/zink_compiler.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2018 Collabora Ltd.
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  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the 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 NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
24 #ifndef ZINK_COMPILER_H
25 #define ZINK_COMPILER_H
26 
27 #include "zink_types.h"
28 
29 #define ZINK_WORKGROUP_SIZE_X 1
30 #define ZINK_WORKGROUP_SIZE_Y 2
31 #define ZINK_WORKGROUP_SIZE_Z 3
32 #define ZINK_VARIABLE_SHARED_MEM 4
33 #define ZINK_INLINE_VAL_FLAT_MASK 0
34 #define ZINK_INLINE_VAL_PV_LAST_VERT 2
35 
36 /* stop inlining shaders if they have >limit ssa vals after inlining:
37  * recompile time isn't worth the inline
38  */
39 #define ZINK_ALWAYS_INLINE_LIMIT 1500
40 
41 struct zink_shader_key;
42 struct spirv_shader;
43 
44 struct tgsi_token;
45 
46 static inline gl_shader_stage
clamp_stage(const shader_info * info)47 clamp_stage(const shader_info *info)
48 {
49    return info->stage == MESA_SHADER_KERNEL ? MESA_SHADER_COMPUTE : info->stage;
50 }
51 
52 const void *
53 zink_get_compiler_options(struct pipe_screen *screen,
54                           enum pipe_shader_ir ir,
55                           gl_shader_stage shader);
56 
57 struct nir_shader *
58 zink_tgsi_to_nir(struct pipe_screen *screen, const struct tgsi_token *tokens);
59 
60 nir_shader*
61 zink_create_quads_emulation_gs(const nir_shader_compiler_options *options,
62                                const nir_shader *prev_stage);
63 
64 bool
65 zink_lower_system_values_to_inlined_uniforms(nir_shader *nir);
66 
67 void
68 zink_screen_init_compiler(struct zink_screen *screen);
69 void
70 zink_compiler_assign_io(struct zink_screen *screen, nir_shader *producer, nir_shader *consumer);
71 /* pass very large shader key data with extra_data */
72 struct zink_shader_object
73 zink_shader_compile(struct zink_screen *screen, bool can_shobj, struct zink_shader *zs, nir_shader *nir, const struct zink_shader_key *key, const void *extra_data, struct zink_program *pg);
74 struct zink_shader_object
75 zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs);
76 struct zink_shader *
77 zink_shader_create(struct zink_screen *screen, struct nir_shader *nir);
78 void
79 zink_shader_init(struct zink_screen *screen, struct zink_shader *zs);
80 
81 char *
82 zink_shader_finalize(struct pipe_screen *pscreen, void *nirptr);
83 
84 void
85 zink_shader_free(struct zink_screen *screen, struct zink_shader *shader);
86 void
87 zink_gfx_shader_free(struct zink_screen *screen, struct zink_shader *shader);
88 
89 struct zink_shader_object
90 zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv, bool can_shobj, struct zink_program *pg);
91 struct zink_shader_object
92 zink_shader_tcs_compile(struct zink_screen *screen, struct zink_shader *zs, unsigned patch_vertices, bool can_shobj, struct zink_program *pg);
93 struct zink_shader *
94 zink_shader_tcs_create(struct zink_screen *screen, unsigned vertices_per_patch);
95 void
96 zink_shader_tcs_init(struct zink_screen *screen, struct zink_shader *zs, nir_shader *tes, nir_shader **nir_ret);
97 
98 static inline bool
zink_shader_descriptor_is_buffer(struct zink_shader * zs,enum zink_descriptor_type type,unsigned i)99 zink_shader_descriptor_is_buffer(struct zink_shader *zs, enum zink_descriptor_type type, unsigned i)
100 {
101    return zs->bindings[type][i].type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER ||
102           zs->bindings[type][i].type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
103 }
104 
105 bool
106 zink_shader_has_cubes(nir_shader *nir);
107 nir_shader *
108 zink_shader_blob_deserialize(struct zink_screen *screen, struct blob *blob);
109 nir_shader *
110 zink_shader_deserialize(struct zink_screen *screen, struct zink_shader *zs);
111 void
112 zink_shader_serialize_blob(nir_shader *nir, struct blob *blob);
113 void
114 zink_print_shader(struct zink_screen *screen, struct zink_shader *zs, FILE *fp);
115 #endif
116