xref: /aosp_15_r20/external/mesa3d/src/panfrost/vulkan/panvk_shader.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #ifndef PANVK_SHADER_H
7*61046927SAndroid Build Coastguard Worker #define PANVK_SHADER_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #ifndef PAN_ARCH
10*61046927SAndroid Build Coastguard Worker #error "PAN_ARCH must be defined"
11*61046927SAndroid Build Coastguard Worker #endif
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "util/pan_ir.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include "pan_desc.h"
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker #include "panvk_descriptor_set.h"
18*61046927SAndroid Build Coastguard Worker #include "panvk_macros.h"
19*61046927SAndroid Build Coastguard Worker #include "panvk_mempool.h"
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker #include "vk_pipeline_layout.h"
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker #include "vk_shader.h"
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker extern const struct vk_device_shader_ops panvk_per_arch(device_shader_ops);
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #define MAX_VS_ATTRIBS 16
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker struct nir_shader;
30*61046927SAndroid Build Coastguard Worker struct pan_blend_state;
31*61046927SAndroid Build Coastguard Worker struct panvk_device;
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker enum panvk_varying_buf_id {
34*61046927SAndroid Build Coastguard Worker    PANVK_VARY_BUF_GENERAL,
35*61046927SAndroid Build Coastguard Worker    PANVK_VARY_BUF_POSITION,
36*61046927SAndroid Build Coastguard Worker    PANVK_VARY_BUF_PSIZ,
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker    /* Keep last */
39*61046927SAndroid Build Coastguard Worker    PANVK_VARY_BUF_MAX,
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker struct panvk_graphics_sysvals {
43*61046927SAndroid Build Coastguard Worker    struct {
44*61046927SAndroid Build Coastguard Worker       struct {
45*61046927SAndroid Build Coastguard Worker          float x, y, z;
46*61046927SAndroid Build Coastguard Worker       } scale, offset;
47*61046927SAndroid Build Coastguard Worker    } viewport;
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker    struct {
50*61046927SAndroid Build Coastguard Worker       float constants[4];
51*61046927SAndroid Build Coastguard Worker    } blend;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    struct {
54*61046927SAndroid Build Coastguard Worker       uint32_t first_vertex;
55*61046927SAndroid Build Coastguard Worker       uint32_t base_vertex;
56*61046927SAndroid Build Coastguard Worker       uint32_t base_instance;
57*61046927SAndroid Build Coastguard Worker    } vs;
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    struct {
60*61046927SAndroid Build Coastguard Worker       uint32_t multisampled;
61*61046927SAndroid Build Coastguard Worker    } fs;
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker #if PAN_ARCH <= 7
64*61046927SAndroid Build Coastguard Worker    /* gl_Layer on Bifrost is a bit of hack. We have to issue one draw per
65*61046927SAndroid Build Coastguard Worker     * layer, and filter primitives at the VS level.
66*61046927SAndroid Build Coastguard Worker     */
67*61046927SAndroid Build Coastguard Worker    int32_t layer_id;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    struct {
70*61046927SAndroid Build Coastguard Worker       uint64_t sets[MAX_SETS];
71*61046927SAndroid Build Coastguard Worker       uint64_t vs_dyn_ssbos;
72*61046927SAndroid Build Coastguard Worker       uint64_t fs_dyn_ssbos;
73*61046927SAndroid Build Coastguard Worker    } desc;
74*61046927SAndroid Build Coastguard Worker #endif
75*61046927SAndroid Build Coastguard Worker };
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker struct panvk_compute_sysvals {
78*61046927SAndroid Build Coastguard Worker    struct {
79*61046927SAndroid Build Coastguard Worker       uint32_t x, y, z;
80*61046927SAndroid Build Coastguard Worker    } base;
81*61046927SAndroid Build Coastguard Worker    struct {
82*61046927SAndroid Build Coastguard Worker       uint32_t x, y, z;
83*61046927SAndroid Build Coastguard Worker    } num_work_groups;
84*61046927SAndroid Build Coastguard Worker    struct {
85*61046927SAndroid Build Coastguard Worker       uint32_t x, y, z;
86*61046927SAndroid Build Coastguard Worker    } local_group_size;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker #if PAN_ARCH <= 7
89*61046927SAndroid Build Coastguard Worker    struct {
90*61046927SAndroid Build Coastguard Worker       uint64_t sets[MAX_SETS];
91*61046927SAndroid Build Coastguard Worker       uint64_t dyn_ssbos;
92*61046927SAndroid Build Coastguard Worker    } desc;
93*61046927SAndroid Build Coastguard Worker #endif
94*61046927SAndroid Build Coastguard Worker };
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker #if PAN_ARCH <= 7
97*61046927SAndroid Build Coastguard Worker enum panvk_bifrost_desc_table_type {
98*61046927SAndroid Build Coastguard Worker    PANVK_BIFROST_DESC_TABLE_INVALID = -1,
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    /* UBO is encoded on 8 bytes */
101*61046927SAndroid Build Coastguard Worker    PANVK_BIFROST_DESC_TABLE_UBO = 0,
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    /* Images are using a <3DAttributeBuffer,Attribute> pair, each
104*61046927SAndroid Build Coastguard Worker     * of them being stored in a separate table. */
105*61046927SAndroid Build Coastguard Worker    PANVK_BIFROST_DESC_TABLE_IMG,
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    /* Texture and sampler are encoded on 32 bytes */
108*61046927SAndroid Build Coastguard Worker    PANVK_BIFROST_DESC_TABLE_TEXTURE,
109*61046927SAndroid Build Coastguard Worker    PANVK_BIFROST_DESC_TABLE_SAMPLER,
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker    PANVK_BIFROST_DESC_TABLE_COUNT,
112*61046927SAndroid Build Coastguard Worker };
113*61046927SAndroid Build Coastguard Worker #endif
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker #define COPY_DESC_HANDLE(table, idx)           ((table << 28) | (idx))
116*61046927SAndroid Build Coastguard Worker #define COPY_DESC_HANDLE_EXTRACT_INDEX(handle) ((handle) & BITFIELD_MASK(28))
117*61046927SAndroid Build Coastguard Worker #define COPY_DESC_HANDLE_EXTRACT_TABLE(handle) ((handle) >> 28)
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker struct panvk_shader {
120*61046927SAndroid Build Coastguard Worker    struct vk_shader vk;
121*61046927SAndroid Build Coastguard Worker    struct pan_shader_info info;
122*61046927SAndroid Build Coastguard Worker    struct pan_compute_dim local_size;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    struct {
125*61046927SAndroid Build Coastguard Worker       uint32_t used_set_mask;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker #if PAN_ARCH <= 7
128*61046927SAndroid Build Coastguard Worker       struct {
129*61046927SAndroid Build Coastguard Worker          uint32_t map[MAX_DYNAMIC_UNIFORM_BUFFERS];
130*61046927SAndroid Build Coastguard Worker          uint32_t count;
131*61046927SAndroid Build Coastguard Worker       } dyn_ubos;
132*61046927SAndroid Build Coastguard Worker       struct {
133*61046927SAndroid Build Coastguard Worker          uint32_t map[MAX_DYNAMIC_STORAGE_BUFFERS];
134*61046927SAndroid Build Coastguard Worker          uint32_t count;
135*61046927SAndroid Build Coastguard Worker       } dyn_ssbos;
136*61046927SAndroid Build Coastguard Worker       struct {
137*61046927SAndroid Build Coastguard Worker          struct panvk_priv_mem map;
138*61046927SAndroid Build Coastguard Worker          uint32_t count[PANVK_BIFROST_DESC_TABLE_COUNT];
139*61046927SAndroid Build Coastguard Worker       } others;
140*61046927SAndroid Build Coastguard Worker #else
141*61046927SAndroid Build Coastguard Worker       struct {
142*61046927SAndroid Build Coastguard Worker          uint32_t map[MAX_DYNAMIC_BUFFERS];
143*61046927SAndroid Build Coastguard Worker          uint32_t count;
144*61046927SAndroid Build Coastguard Worker       } dyn_bufs;
145*61046927SAndroid Build Coastguard Worker #endif
146*61046927SAndroid Build Coastguard Worker    } desc_info;
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker    const void *bin_ptr;
149*61046927SAndroid Build Coastguard Worker    uint32_t bin_size;
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    struct panvk_priv_mem code_mem;
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker #if PAN_ARCH <= 7
154*61046927SAndroid Build Coastguard Worker    struct panvk_priv_mem rsd;
155*61046927SAndroid Build Coastguard Worker #else
156*61046927SAndroid Build Coastguard Worker    union {
157*61046927SAndroid Build Coastguard Worker       struct panvk_priv_mem spd;
158*61046927SAndroid Build Coastguard Worker       struct {
159*61046927SAndroid Build Coastguard Worker          struct panvk_priv_mem pos_points;
160*61046927SAndroid Build Coastguard Worker          struct panvk_priv_mem pos_triangles;
161*61046927SAndroid Build Coastguard Worker          struct panvk_priv_mem var;
162*61046927SAndroid Build Coastguard Worker       } spds;
163*61046927SAndroid Build Coastguard Worker    };
164*61046927SAndroid Build Coastguard Worker #endif
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    const char *nir_str;
167*61046927SAndroid Build Coastguard Worker    const char *asm_str;
168*61046927SAndroid Build Coastguard Worker };
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker struct panvk_shader_link {
171*61046927SAndroid Build Coastguard Worker    struct {
172*61046927SAndroid Build Coastguard Worker       struct panvk_priv_mem attribs;
173*61046927SAndroid Build Coastguard Worker    } vs, fs;
174*61046927SAndroid Build Coastguard Worker    unsigned buf_strides[PANVK_VARY_BUF_MAX];
175*61046927SAndroid Build Coastguard Worker };
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker static inline mali_ptr
panvk_shader_get_dev_addr(const struct panvk_shader * shader)178*61046927SAndroid Build Coastguard Worker panvk_shader_get_dev_addr(const struct panvk_shader *shader)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker    return shader != NULL ? panvk_priv_mem_dev_addr(shader->code_mem) : 0;
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker VkResult panvk_per_arch(link_shaders)(struct panvk_pool *desc_pool,
184*61046927SAndroid Build Coastguard Worker                                       const struct panvk_shader *vs,
185*61046927SAndroid Build Coastguard Worker                                       const struct panvk_shader *fs,
186*61046927SAndroid Build Coastguard Worker                                       struct panvk_shader_link *link);
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker static inline void
panvk_shader_link_cleanup(struct panvk_pool * desc_pool,struct panvk_shader_link * link)189*61046927SAndroid Build Coastguard Worker panvk_shader_link_cleanup(struct panvk_pool *desc_pool,
190*61046927SAndroid Build Coastguard Worker                           struct panvk_shader_link *link)
191*61046927SAndroid Build Coastguard Worker {
192*61046927SAndroid Build Coastguard Worker    panvk_pool_free_mem(desc_pool, link->vs.attribs);
193*61046927SAndroid Build Coastguard Worker    panvk_pool_free_mem(desc_pool, link->fs.attribs);
194*61046927SAndroid Build Coastguard Worker }
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker bool panvk_per_arch(nir_lower_descriptors)(
197*61046927SAndroid Build Coastguard Worker    nir_shader *nir, struct panvk_device *dev, uint32_t set_layout_count,
198*61046927SAndroid Build Coastguard Worker    struct vk_descriptor_set_layout *const *set_layouts,
199*61046927SAndroid Build Coastguard Worker    struct panvk_shader *shader);
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker #endif
202