xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_shader.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * based in part on anv driver which is:
7*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
8*61046927SAndroid Build Coastguard Worker  */
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #ifndef TU_SHADER_H
11*61046927SAndroid Build Coastguard Worker #define TU_SHADER_H
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "tu_common.h"
14*61046927SAndroid Build Coastguard Worker #include "tu_cs.h"
15*61046927SAndroid Build Coastguard Worker #include "tu_suballoc.h"
16*61046927SAndroid Build Coastguard Worker #include "tu_descriptor_set.h"
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker struct tu_inline_ubo
19*61046927SAndroid Build Coastguard Worker {
20*61046927SAndroid Build Coastguard Worker    /* Push the data at BINDLESS_BASE[base] + offset */
21*61046927SAndroid Build Coastguard Worker    unsigned base;
22*61046927SAndroid Build Coastguard Worker    unsigned offset;
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker    /* If true, push the base address instead */
25*61046927SAndroid Build Coastguard Worker    bool push_address;
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker    /* Push it to this location in the const file, in vec4s */
28*61046927SAndroid Build Coastguard Worker    unsigned const_offset_vec4;
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker    /* How much to push */
31*61046927SAndroid Build Coastguard Worker    unsigned size_vec4;
32*61046927SAndroid Build Coastguard Worker };
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker /* The meaning of the range depends on "type". If it's
35*61046927SAndroid Build Coastguard Worker  * IR3_PUSH_CONSTS_PER_STAGE, then it's the range used by this shader. If
36*61046927SAndroid Build Coastguard Worker  * it's IR3_PUSH_CONSTS_SHARED then it's the overall range as provided by
37*61046927SAndroid Build Coastguard Worker  * the pipeline layout and must match between shaders where it's non-zero.
38*61046927SAndroid Build Coastguard Worker  */
39*61046927SAndroid Build Coastguard Worker struct tu_push_constant_range
40*61046927SAndroid Build Coastguard Worker {
41*61046927SAndroid Build Coastguard Worker    uint32_t lo;
42*61046927SAndroid Build Coastguard Worker    uint32_t dwords;
43*61046927SAndroid Build Coastguard Worker    enum ir3_push_consts_type type;
44*61046927SAndroid Build Coastguard Worker };
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker struct tu_const_state
47*61046927SAndroid Build Coastguard Worker {
48*61046927SAndroid Build Coastguard Worker    struct tu_push_constant_range push_consts;
49*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_offset_loc;
50*61046927SAndroid Build Coastguard Worker    unsigned num_inline_ubos;
51*61046927SAndroid Build Coastguard Worker    struct tu_inline_ubo ubos[MAX_INLINE_UBOS];
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    struct ir3_driver_ubo fdm_ubo;
54*61046927SAndroid Build Coastguard Worker    struct ir3_driver_ubo dynamic_offsets_ubo;
55*61046927SAndroid Build Coastguard Worker    struct ir3_driver_ubo inline_uniforms_ubo;
56*61046927SAndroid Build Coastguard Worker };
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker struct tu_shader
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_cache_object base;
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker    const struct ir3_shader_variant *variant;
63*61046927SAndroid Build Coastguard Worker    const struct ir3_shader_variant *safe_const_variant;
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker    struct tu_suballoc_bo bo;
66*61046927SAndroid Build Coastguard Worker    struct tu_cs cs;
67*61046927SAndroid Build Coastguard Worker    struct tu_bo *pvtmem_bo;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    struct tu_draw_state state;
70*61046927SAndroid Build Coastguard Worker    struct tu_draw_state safe_const_state;
71*61046927SAndroid Build Coastguard Worker    struct tu_draw_state binning_state;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    struct tu_const_state const_state;
74*61046927SAndroid Build Coastguard Worker    uint32_t view_mask;
75*61046927SAndroid Build Coastguard Worker    uint8_t active_desc_sets;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker    /* The dynamic buffer descriptor size for descriptor sets that we know
78*61046927SAndroid Build Coastguard Worker     * about. This is used when linking to piece together the sizes and from
79*61046927SAndroid Build Coastguard Worker     * there calculate the offsets. It's -1 if we don't know because the
80*61046927SAndroid Build Coastguard Worker     * descriptor set layout is NULL.
81*61046927SAndroid Build Coastguard Worker     */
82*61046927SAndroid Build Coastguard Worker    int dynamic_descriptor_sizes[MAX_SETS];
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker    union {
85*61046927SAndroid Build Coastguard Worker       struct {
86*61046927SAndroid Build Coastguard Worker          unsigned patch_type;
87*61046927SAndroid Build Coastguard Worker          enum a6xx_tess_output tess_output_upper_left, tess_output_lower_left;
88*61046927SAndroid Build Coastguard Worker          enum a6xx_tess_spacing tess_spacing;
89*61046927SAndroid Build Coastguard Worker       } tes;
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker       struct {
92*61046927SAndroid Build Coastguard Worker          bool per_samp;
93*61046927SAndroid Build Coastguard Worker          bool has_fdm;
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker          struct {
96*61046927SAndroid Build Coastguard Worker             uint32_t status;
97*61046927SAndroid Build Coastguard Worker             bool force_late_z;
98*61046927SAndroid Build Coastguard Worker          } lrz;
99*61046927SAndroid Build Coastguard Worker       } fs;
100*61046927SAndroid Build Coastguard Worker    };
101*61046927SAndroid Build Coastguard Worker };
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker struct tu_shader_key {
104*61046927SAndroid Build Coastguard Worker    unsigned multiview_mask;
105*61046927SAndroid Build Coastguard Worker    bool force_sample_interp;
106*61046927SAndroid Build Coastguard Worker    bool fragment_density_map;
107*61046927SAndroid Build Coastguard Worker    uint8_t unscaled_input_fragcoord;
108*61046927SAndroid Build Coastguard Worker    enum ir3_wavesize_option api_wavesize, real_wavesize;
109*61046927SAndroid Build Coastguard Worker };
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker extern const struct vk_pipeline_cache_object_ops tu_shader_ops;
112*61046927SAndroid Build Coastguard Worker bool
113*61046927SAndroid Build Coastguard Worker tu_nir_lower_multiview(nir_shader *nir, uint32_t mask, struct tu_device *dev);
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker nir_shader *
116*61046927SAndroid Build Coastguard Worker tu_spirv_to_nir(struct tu_device *dev,
117*61046927SAndroid Build Coastguard Worker                 void *mem_ctx,
118*61046927SAndroid Build Coastguard Worker                 VkPipelineCreateFlags2KHR pipeline_flags,
119*61046927SAndroid Build Coastguard Worker                 const VkPipelineShaderStageCreateInfo *stage_info,
120*61046927SAndroid Build Coastguard Worker                 gl_shader_stage stage);
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker void
123*61046927SAndroid Build Coastguard Worker tu6_emit_xs(struct tu_cs *cs,
124*61046927SAndroid Build Coastguard Worker             gl_shader_stage stage,
125*61046927SAndroid Build Coastguard Worker             const struct ir3_shader_variant *xs,
126*61046927SAndroid Build Coastguard Worker             const struct tu_pvtmem_config *pvtmem,
127*61046927SAndroid Build Coastguard Worker             uint64_t binary_iova);
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker template <chip CHIP>
130*61046927SAndroid Build Coastguard Worker void
131*61046927SAndroid Build Coastguard Worker tu6_emit_vs(struct tu_cs *cs, const struct ir3_shader_variant *vs,
132*61046927SAndroid Build Coastguard Worker             uint32_t view_mask);
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker template <chip CHIP>
135*61046927SAndroid Build Coastguard Worker void
136*61046927SAndroid Build Coastguard Worker tu6_emit_hs(struct tu_cs *cs, const struct ir3_shader_variant *hs);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker template <chip CHIP>
139*61046927SAndroid Build Coastguard Worker void
140*61046927SAndroid Build Coastguard Worker tu6_emit_ds(struct tu_cs *cs, const struct ir3_shader_variant *hs);
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker template <chip CHIP>
143*61046927SAndroid Build Coastguard Worker void
144*61046927SAndroid Build Coastguard Worker tu6_emit_gs(struct tu_cs *cs, const struct ir3_shader_variant *hs);
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker template <chip CHIP>
147*61046927SAndroid Build Coastguard Worker void
148*61046927SAndroid Build Coastguard Worker tu6_emit_fs(struct tu_cs *cs, const struct ir3_shader_variant *fs);
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker VkResult
151*61046927SAndroid Build Coastguard Worker tu_shader_create(struct tu_device *dev,
152*61046927SAndroid Build Coastguard Worker                  struct tu_shader **shader_out,
153*61046927SAndroid Build Coastguard Worker                  nir_shader *nir,
154*61046927SAndroid Build Coastguard Worker                  const struct tu_shader_key *key,
155*61046927SAndroid Build Coastguard Worker                  const struct ir3_shader_key *ir3_key,
156*61046927SAndroid Build Coastguard Worker                  const void *key_data,
157*61046927SAndroid Build Coastguard Worker                  size_t key_size,
158*61046927SAndroid Build Coastguard Worker                  struct tu_pipeline_layout *layout,
159*61046927SAndroid Build Coastguard Worker                  bool executable_info);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker void
162*61046927SAndroid Build Coastguard Worker tu_shader_key_subgroup_size(struct tu_shader_key *key,
163*61046927SAndroid Build Coastguard Worker                             bool allow_varying_subgroup_size,
164*61046927SAndroid Build Coastguard Worker                             bool require_full_subgroups,
165*61046927SAndroid Build Coastguard Worker                             const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *subgroup_info,
166*61046927SAndroid Build Coastguard Worker                             struct tu_device *dev);
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker VkResult
169*61046927SAndroid Build Coastguard Worker tu_compile_shaders(struct tu_device *device,
170*61046927SAndroid Build Coastguard Worker                    VkPipelineCreateFlags2KHR pipeline_flags,
171*61046927SAndroid Build Coastguard Worker                    const VkPipelineShaderStageCreateInfo **stage_infos,
172*61046927SAndroid Build Coastguard Worker                    nir_shader **nir,
173*61046927SAndroid Build Coastguard Worker                    const struct tu_shader_key *keys,
174*61046927SAndroid Build Coastguard Worker                    struct tu_pipeline_layout *layout,
175*61046927SAndroid Build Coastguard Worker                    const unsigned char *pipeline_sha1,
176*61046927SAndroid Build Coastguard Worker                    struct tu_shader **shaders,
177*61046927SAndroid Build Coastguard Worker                    char **nir_initial_disasm,
178*61046927SAndroid Build Coastguard Worker                    void *nir_initial_disasm_mem_ctx,
179*61046927SAndroid Build Coastguard Worker                    nir_shader **nir_out,
180*61046927SAndroid Build Coastguard Worker                    VkPipelineCreationFeedback *stage_feedbacks);
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker VkResult
183*61046927SAndroid Build Coastguard Worker tu_init_empty_shaders(struct tu_device *device);
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker void
186*61046927SAndroid Build Coastguard Worker tu_destroy_empty_shaders(struct tu_device *device);
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker void
189*61046927SAndroid Build Coastguard Worker tu_shader_destroy(struct tu_device *dev,
190*61046927SAndroid Build Coastguard Worker                   struct tu_shader *shader);
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker #endif /* TU_SHADER_H */
193