1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2024 Valve Corporation
3*61046927SAndroid Build Coastguard Worker * Copyright 2024 Alyssa Rosenzweig
4*61046927SAndroid Build Coastguard Worker * Copyright 2022-2023 Collabora Ltd. and Red Hat Inc.
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #pragma once
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker #include "asahi/compiler/agx_compile.h"
11*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
12*61046927SAndroid Build Coastguard Worker #include "agx_linker.h"
13*61046927SAndroid Build Coastguard Worker #include "agx_nir_lower_vbo.h"
14*61046927SAndroid Build Coastguard Worker #include "agx_pack.h"
15*61046927SAndroid Build Coastguard Worker #include "agx_usc.h"
16*61046927SAndroid Build Coastguard Worker #include "agx_uvs.h"
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker #include "hk_device.h"
19*61046927SAndroid Build Coastguard Worker #include "hk_device_memory.h"
20*61046927SAndroid Build Coastguard Worker #include "hk_private.h"
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker #include "nir_xfb_info.h"
23*61046927SAndroid Build Coastguard Worker #include "shader_enums.h"
24*61046927SAndroid Build Coastguard Worker #include "vk_pipeline_cache.h"
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include "nir.h"
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #include "vk_shader.h"
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker struct hk_physical_device;
31*61046927SAndroid Build Coastguard Worker struct hk_pipeline_compilation_ctx;
32*61046927SAndroid Build Coastguard Worker struct vk_descriptor_set_layout;
33*61046927SAndroid Build Coastguard Worker struct vk_graphics_pipeline_state;
34*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache;
35*61046927SAndroid Build Coastguard Worker struct vk_pipeline_layout;
36*61046927SAndroid Build Coastguard Worker struct vk_pipeline_robustness_state;
37*61046927SAndroid Build Coastguard Worker struct vk_shader_module;
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker /* TODO: Make dynamic */
40*61046927SAndroid Build Coastguard Worker #define HK_ROOT_UNIFORM 104
41*61046927SAndroid Build Coastguard Worker #define HK_IMAGE_HEAP_UNIFORM 108
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker struct hk_shader_info {
44*61046927SAndroid Build Coastguard Worker union {
45*61046927SAndroid Build Coastguard Worker struct {
46*61046927SAndroid Build Coastguard Worker uint32_t attribs_read;
47*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(attrib_components_read, AGX_MAX_ATTRIBS * 4);
48*61046927SAndroid Build Coastguard Worker uint8_t cull_distance_array_size;
49*61046927SAndroid Build Coastguard Worker uint8_t _pad[7];
50*61046927SAndroid Build Coastguard Worker } vs;
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker struct {
53*61046927SAndroid Build Coastguard Worker /* Local workgroup size */
54*61046927SAndroid Build Coastguard Worker uint16_t local_size[3];
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker uint8_t _pad[26];
57*61046927SAndroid Build Coastguard Worker } cs;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker struct {
60*61046927SAndroid Build Coastguard Worker struct agx_interp_info interp;
61*61046927SAndroid Build Coastguard Worker struct agx_fs_epilog_link_info epilog_key;
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker bool reads_sample_mask;
64*61046927SAndroid Build Coastguard Worker bool post_depth_coverage;
65*61046927SAndroid Build Coastguard Worker bool uses_sample_shading;
66*61046927SAndroid Build Coastguard Worker bool early_fragment_tests;
67*61046927SAndroid Build Coastguard Worker bool writes_memory;
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker uint8_t _pad[7];
70*61046927SAndroid Build Coastguard Worker } fs;
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker struct {
73*61046927SAndroid Build Coastguard Worker uint8_t spacing;
74*61046927SAndroid Build Coastguard Worker uint8_t mode;
75*61046927SAndroid Build Coastguard Worker enum mesa_prim out_prim;
76*61046927SAndroid Build Coastguard Worker bool point_mode;
77*61046927SAndroid Build Coastguard Worker bool ccw;
78*61046927SAndroid Build Coastguard Worker uint8_t _pad[27];
79*61046927SAndroid Build Coastguard Worker } ts;
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker struct {
82*61046927SAndroid Build Coastguard Worker uint64_t per_vertex_outputs;
83*61046927SAndroid Build Coastguard Worker uint32_t output_stride;
84*61046927SAndroid Build Coastguard Worker uint8_t output_patch_size;
85*61046927SAndroid Build Coastguard Worker uint8_t nr_patch_outputs;
86*61046927SAndroid Build Coastguard Worker uint8_t _pad[18];
87*61046927SAndroid Build Coastguard Worker } tcs;
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker struct {
90*61046927SAndroid Build Coastguard Worker unsigned count_words;
91*61046927SAndroid Build Coastguard Worker enum mesa_prim out_prim;
92*61046927SAndroid Build Coastguard Worker uint8_t _pad[27];
93*61046927SAndroid Build Coastguard Worker } gs;
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker /* Used to initialize the union for other stages */
96*61046927SAndroid Build Coastguard Worker uint8_t _pad[32];
97*61046927SAndroid Build Coastguard Worker };
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker struct agx_unlinked_uvs_layout uvs;
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker /* Transform feedback buffer strides */
102*61046927SAndroid Build Coastguard Worker uint8_t xfb_stride[MAX_XFB_BUFFERS];
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker gl_shader_stage stage : 8;
105*61046927SAndroid Build Coastguard Worker uint8_t clip_distance_array_size;
106*61046927SAndroid Build Coastguard Worker uint8_t cull_distance_array_size;
107*61046927SAndroid Build Coastguard Worker uint8_t _pad0[1];
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker /* XXX: is there a less goofy way to do this? I really don't want dynamic
110*61046927SAndroid Build Coastguard Worker * allocation here.
111*61046927SAndroid Build Coastguard Worker */
112*61046927SAndroid Build Coastguard Worker nir_xfb_info xfb_info;
113*61046927SAndroid Build Coastguard Worker nir_xfb_output_info xfb_outputs[64];
114*61046927SAndroid Build Coastguard Worker };
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker /*
117*61046927SAndroid Build Coastguard Worker * Hash table keys for fast-linked shader variants. These contain the entire
118*61046927SAndroid Build Coastguard Worker * prolog/epilog key so we only do 1 hash table lookup instead of 2 in the
119*61046927SAndroid Build Coastguard Worker * general case where the linked shader is already ready.
120*61046927SAndroid Build Coastguard Worker */
121*61046927SAndroid Build Coastguard Worker struct hk_fast_link_key_vs {
122*61046927SAndroid Build Coastguard Worker struct agx_vs_prolog_key prolog;
123*61046927SAndroid Build Coastguard Worker };
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker struct hk_fast_link_key_fs {
126*61046927SAndroid Build Coastguard Worker unsigned nr_samples_shaded;
127*61046927SAndroid Build Coastguard Worker struct agx_fs_prolog_key prolog;
128*61046927SAndroid Build Coastguard Worker struct agx_fs_epilog_key epilog;
129*61046927SAndroid Build Coastguard Worker };
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker struct hk_shader {
132*61046927SAndroid Build Coastguard Worker struct agx_shader_part b;
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker struct hk_shader_info info;
135*61046927SAndroid Build Coastguard Worker struct agx_fragment_face_2_packed frag_face;
136*61046927SAndroid Build Coastguard Worker struct agx_counts_packed counts;
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker const void *code_ptr;
139*61046927SAndroid Build Coastguard Worker uint32_t code_size;
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker const void *data_ptr;
142*61046927SAndroid Build Coastguard Worker uint32_t data_size;
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker /* BO for any uploaded shader part */
145*61046927SAndroid Build Coastguard Worker struct agx_bo *bo;
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker /* Cache of fast linked variants */
148*61046927SAndroid Build Coastguard Worker struct {
149*61046927SAndroid Build Coastguard Worker simple_mtx_t lock;
150*61046927SAndroid Build Coastguard Worker struct hash_table *ht;
151*61046927SAndroid Build Coastguard Worker } linked;
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker /* If there's only a single possibly linked variant, direct pointer. TODO:
154*61046927SAndroid Build Coastguard Worker * Union with the cache to save some space?
155*61046927SAndroid Build Coastguard Worker */
156*61046927SAndroid Build Coastguard Worker struct hk_linked_shader *only_linked;
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker /* Address to the uploaded preamble section. Preambles are uploaded
159*61046927SAndroid Build Coastguard Worker * separately from fast-linked main shaders.
160*61046927SAndroid Build Coastguard Worker */
161*61046927SAndroid Build Coastguard Worker uint64_t preamble_addr;
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker /* Address of the start of the shader data section */
164*61046927SAndroid Build Coastguard Worker uint64_t data_addr;
165*61046927SAndroid Build Coastguard Worker };
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker enum hk_vs_variant {
168*61046927SAndroid Build Coastguard Worker /* Hardware vertex shader, when next stage is fragment */
169*61046927SAndroid Build Coastguard Worker HK_VS_VARIANT_HW,
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker /* Hardware compute shader, when next is geometry/tessellation */
172*61046927SAndroid Build Coastguard Worker HK_VS_VARIANT_SW,
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker HK_VS_VARIANTS,
175*61046927SAndroid Build Coastguard Worker };
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker enum hk_gs_variant {
178*61046927SAndroid Build Coastguard Worker /* Hardware vertex shader used for rasterization */
179*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_RAST,
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker /* Main compute shader */
182*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_MAIN,
183*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_MAIN_NO_RAST,
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker /* Count compute shader */
186*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_COUNT,
187*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_COUNT_NO_RAST,
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker /* Pre-GS compute shader */
190*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_PRE,
191*61046927SAndroid Build Coastguard Worker HK_GS_VARIANT_PRE_NO_RAST,
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker HK_GS_VARIANTS,
194*61046927SAndroid Build Coastguard Worker };
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker /* clang-format off */
197*61046927SAndroid Build Coastguard Worker static const char *hk_gs_variant_name[] = {
198*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_RAST] = "Rasterization",
199*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_MAIN] = "Main",
200*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_MAIN_NO_RAST] = "Main (rast. discard)",
201*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_COUNT] = "Count",
202*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_COUNT_NO_RAST] = "Count (rast. discard)",
203*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_PRE] = "Pre-GS",
204*61046927SAndroid Build Coastguard Worker [HK_GS_VARIANT_PRE_NO_RAST] = "Pre-GS (rast. discard)",
205*61046927SAndroid Build Coastguard Worker };
206*61046927SAndroid Build Coastguard Worker /* clang-format on */
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker static inline unsigned
hk_num_variants(gl_shader_stage stage)209*61046927SAndroid Build Coastguard Worker hk_num_variants(gl_shader_stage stage)
210*61046927SAndroid Build Coastguard Worker {
211*61046927SAndroid Build Coastguard Worker switch (stage) {
212*61046927SAndroid Build Coastguard Worker case MESA_SHADER_VERTEX:
213*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_EVAL:
214*61046927SAndroid Build Coastguard Worker return HK_VS_VARIANTS;
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker case MESA_SHADER_GEOMETRY:
217*61046927SAndroid Build Coastguard Worker return HK_GS_VARIANTS;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker default:
220*61046927SAndroid Build Coastguard Worker return 1;
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker /*
225*61046927SAndroid Build Coastguard Worker * An hk_api shader maps 1:1 to a VkShader object. An hk_api_shader may contain
226*61046927SAndroid Build Coastguard Worker * multiple hardware hk_shader's, built at shader compile time. This complexity
227*61046927SAndroid Build Coastguard Worker * is required to efficiently implement the legacy geometry pipeline.
228*61046927SAndroid Build Coastguard Worker */
229*61046927SAndroid Build Coastguard Worker struct hk_api_shader {
230*61046927SAndroid Build Coastguard Worker struct vk_shader vk;
231*61046927SAndroid Build Coastguard Worker
232*61046927SAndroid Build Coastguard Worker /* Is this an internal passthrough geometry shader? */
233*61046927SAndroid Build Coastguard Worker bool is_passthrough;
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker struct hk_shader variants[];
236*61046927SAndroid Build Coastguard Worker };
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker #define hk_foreach_variant(api_shader, var) \
239*61046927SAndroid Build Coastguard Worker for (struct hk_shader *var = api_shader->variants; \
240*61046927SAndroid Build Coastguard Worker var < api_shader->variants + hk_num_variants(api_shader->vk.stage); \
241*61046927SAndroid Build Coastguard Worker ++var)
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker static const char *
hk_variant_name(struct hk_api_shader * obj,struct hk_shader * variant)244*61046927SAndroid Build Coastguard Worker hk_variant_name(struct hk_api_shader *obj, struct hk_shader *variant)
245*61046927SAndroid Build Coastguard Worker {
246*61046927SAndroid Build Coastguard Worker unsigned i = variant - obj->variants;
247*61046927SAndroid Build Coastguard Worker assert(i < hk_num_variants(obj->vk.stage));
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker if (hk_num_variants(obj->vk.stage) == 1) {
250*61046927SAndroid Build Coastguard Worker return NULL;
251*61046927SAndroid Build Coastguard Worker } else if (obj->vk.stage == MESA_SHADER_GEOMETRY) {
252*61046927SAndroid Build Coastguard Worker assert(i < ARRAY_SIZE(hk_gs_variant_name));
253*61046927SAndroid Build Coastguard Worker return hk_gs_variant_name[i];
254*61046927SAndroid Build Coastguard Worker } else {
255*61046927SAndroid Build Coastguard Worker assert(i < 2);
256*61046927SAndroid Build Coastguard Worker return i == HK_VS_VARIANT_SW ? "Software" : "Hardware";
257*61046927SAndroid Build Coastguard Worker }
258*61046927SAndroid Build Coastguard Worker }
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker static struct hk_shader *
hk_only_variant(struct hk_api_shader * obj)261*61046927SAndroid Build Coastguard Worker hk_only_variant(struct hk_api_shader *obj)
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker if (!obj)
264*61046927SAndroid Build Coastguard Worker return NULL;
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker assert(hk_num_variants(obj->vk.stage) == 1);
267*61046927SAndroid Build Coastguard Worker return &obj->variants[0];
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker static struct hk_shader *
hk_any_variant(struct hk_api_shader * obj)271*61046927SAndroid Build Coastguard Worker hk_any_variant(struct hk_api_shader *obj)
272*61046927SAndroid Build Coastguard Worker {
273*61046927SAndroid Build Coastguard Worker if (!obj)
274*61046927SAndroid Build Coastguard Worker return NULL;
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker return &obj->variants[0];
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker
279*61046927SAndroid Build Coastguard Worker static struct hk_shader *
hk_main_gs_variant(struct hk_api_shader * obj,bool rast_disc)280*61046927SAndroid Build Coastguard Worker hk_main_gs_variant(struct hk_api_shader *obj, bool rast_disc)
281*61046927SAndroid Build Coastguard Worker {
282*61046927SAndroid Build Coastguard Worker return &obj->variants[HK_GS_VARIANT_MAIN + rast_disc];
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker static struct hk_shader *
hk_count_gs_variant(struct hk_api_shader * obj,bool rast_disc)286*61046927SAndroid Build Coastguard Worker hk_count_gs_variant(struct hk_api_shader *obj, bool rast_disc)
287*61046927SAndroid Build Coastguard Worker {
288*61046927SAndroid Build Coastguard Worker return &obj->variants[HK_GS_VARIANT_COUNT + rast_disc];
289*61046927SAndroid Build Coastguard Worker }
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker static struct hk_shader *
hk_pre_gs_variant(struct hk_api_shader * obj,bool rast_disc)292*61046927SAndroid Build Coastguard Worker hk_pre_gs_variant(struct hk_api_shader *obj, bool rast_disc)
293*61046927SAndroid Build Coastguard Worker {
294*61046927SAndroid Build Coastguard Worker return &obj->variants[HK_GS_VARIANT_PRE + rast_disc];
295*61046927SAndroid Build Coastguard Worker }
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker #define HK_MAX_LINKED_USC_SIZE \
298*61046927SAndroid Build Coastguard Worker (AGX_USC_PRESHADER_LENGTH + AGX_USC_FRAGMENT_PROPERTIES_LENGTH + \
299*61046927SAndroid Build Coastguard Worker AGX_USC_REGISTERS_LENGTH + AGX_USC_SHADER_LENGTH + AGX_USC_SHARED_LENGTH + \
300*61046927SAndroid Build Coastguard Worker AGX_USC_SAMPLER_LENGTH + (AGX_USC_UNIFORM_LENGTH * 9))
301*61046927SAndroid Build Coastguard Worker
302*61046927SAndroid Build Coastguard Worker struct hk_linked_shader {
303*61046927SAndroid Build Coastguard Worker struct agx_linked_shader b;
304*61046927SAndroid Build Coastguard Worker
305*61046927SAndroid Build Coastguard Worker /* Distinct from hk_shader::counts due to addition of cf_binding_count, which
306*61046927SAndroid Build Coastguard Worker * is delayed since it depends on cull distance.
307*61046927SAndroid Build Coastguard Worker */
308*61046927SAndroid Build Coastguard Worker struct agx_fragment_shader_word_0_packed fs_counts;
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker /* Baked USC words to bind this linked shader */
311*61046927SAndroid Build Coastguard Worker struct {
312*61046927SAndroid Build Coastguard Worker uint8_t data[HK_MAX_LINKED_USC_SIZE];
313*61046927SAndroid Build Coastguard Worker size_t size;
314*61046927SAndroid Build Coastguard Worker } usc;
315*61046927SAndroid Build Coastguard Worker };
316*61046927SAndroid Build Coastguard Worker
317*61046927SAndroid Build Coastguard Worker struct hk_linked_shader *hk_fast_link(struct hk_device *dev, bool fragment,
318*61046927SAndroid Build Coastguard Worker struct hk_shader *main,
319*61046927SAndroid Build Coastguard Worker struct agx_shader_part *prolog,
320*61046927SAndroid Build Coastguard Worker struct agx_shader_part *epilog,
321*61046927SAndroid Build Coastguard Worker unsigned nr_samples_shaded);
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker extern const struct vk_device_shader_ops hk_device_shader_ops;
324*61046927SAndroid Build Coastguard Worker
325*61046927SAndroid Build Coastguard Worker uint64_t
326*61046927SAndroid Build Coastguard Worker hk_physical_device_compiler_flags(const struct hk_physical_device *pdev);
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker static inline nir_address_format
hk_buffer_addr_format(VkPipelineRobustnessBufferBehaviorEXT robustness)329*61046927SAndroid Build Coastguard Worker hk_buffer_addr_format(VkPipelineRobustnessBufferBehaviorEXT robustness)
330*61046927SAndroid Build Coastguard Worker {
331*61046927SAndroid Build Coastguard Worker switch (robustness) {
332*61046927SAndroid Build Coastguard Worker case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT:
333*61046927SAndroid Build Coastguard Worker return nir_address_format_64bit_global_32bit_offset;
334*61046927SAndroid Build Coastguard Worker case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT:
335*61046927SAndroid Build Coastguard Worker case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT:
336*61046927SAndroid Build Coastguard Worker return nir_address_format_64bit_bounded_global;
337*61046927SAndroid Build Coastguard Worker default:
338*61046927SAndroid Build Coastguard Worker unreachable("Invalid robust buffer access behavior");
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker }
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker bool hk_lower_uvs_index(nir_shader *s, unsigned vs_uniform_base);
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker bool
345*61046927SAndroid Build Coastguard Worker hk_nir_lower_descriptors(nir_shader *nir,
346*61046927SAndroid Build Coastguard Worker const struct vk_pipeline_robustness_state *rs,
347*61046927SAndroid Build Coastguard Worker uint32_t set_layout_count,
348*61046927SAndroid Build Coastguard Worker struct vk_descriptor_set_layout *const *set_layouts);
349*61046927SAndroid Build Coastguard Worker void hk_lower_nir(struct hk_device *dev, nir_shader *nir,
350*61046927SAndroid Build Coastguard Worker const struct vk_pipeline_robustness_state *rs,
351*61046927SAndroid Build Coastguard Worker bool is_multiview, uint32_t set_layout_count,
352*61046927SAndroid Build Coastguard Worker struct vk_descriptor_set_layout *const *set_layouts);
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker VkResult hk_compile_shader(struct hk_device *dev,
355*61046927SAndroid Build Coastguard Worker struct vk_shader_compile_info *info,
356*61046927SAndroid Build Coastguard Worker const struct vk_graphics_pipeline_state *state,
357*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
358*61046927SAndroid Build Coastguard Worker struct hk_api_shader **shader_out);
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker void hk_preprocess_nir_internal(struct vk_physical_device *vk_pdev,
361*61046927SAndroid Build Coastguard Worker nir_shader *nir);
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker void hk_api_shader_destroy(struct vk_device *vk_dev,
364*61046927SAndroid Build Coastguard Worker struct vk_shader *vk_shader,
365*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator);
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker const nir_shader_compiler_options *
368*61046927SAndroid Build Coastguard Worker hk_get_nir_options(struct vk_physical_device *vk_pdev, gl_shader_stage stage,
369*61046927SAndroid Build Coastguard Worker UNUSED const struct vk_pipeline_robustness_state *rs);
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker struct hk_api_shader *hk_meta_shader(struct hk_device *dev,
372*61046927SAndroid Build Coastguard Worker hk_internal_builder_t builder, void *data,
373*61046927SAndroid Build Coastguard Worker size_t data_size);
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker static inline struct hk_shader *
hk_meta_kernel(struct hk_device * dev,hk_internal_builder_t builder,void * data,size_t data_size)376*61046927SAndroid Build Coastguard Worker hk_meta_kernel(struct hk_device *dev, hk_internal_builder_t builder, void *data,
377*61046927SAndroid Build Coastguard Worker size_t data_size)
378*61046927SAndroid Build Coastguard Worker {
379*61046927SAndroid Build Coastguard Worker return hk_only_variant(hk_meta_shader(dev, builder, data, data_size));
380*61046927SAndroid Build Coastguard Worker }
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker struct hk_passthrough_gs_key {
383*61046927SAndroid Build Coastguard Worker /* Bit mask of outputs written by the VS/TES, to be passed through */
384*61046927SAndroid Build Coastguard Worker uint64_t outputs;
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker /* Clip/cull sizes, implies clip/cull written in output */
387*61046927SAndroid Build Coastguard Worker uint8_t clip_distance_array_size;
388*61046927SAndroid Build Coastguard Worker uint8_t cull_distance_array_size;
389*61046927SAndroid Build Coastguard Worker
390*61046927SAndroid Build Coastguard Worker /* Transform feedback buffer strides */
391*61046927SAndroid Build Coastguard Worker uint8_t xfb_stride[MAX_XFB_BUFFERS];
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker /* Decomposed primitive */
394*61046927SAndroid Build Coastguard Worker enum mesa_prim prim;
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker /* Transform feedback info. Must add nir_xfb_info_size to get the key size */
397*61046927SAndroid Build Coastguard Worker nir_xfb_info xfb_info;
398*61046927SAndroid Build Coastguard Worker };
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker void hk_nir_passthrough_gs(struct nir_builder *b, const void *key_);
401