1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Collabora Ltd. and Red Hat Inc.
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker #ifndef NVK_MME_H
6*61046927SAndroid Build Coastguard Worker #define NVK_MME_H 1
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include "mme_builder.h"
9*61046927SAndroid Build Coastguard Worker #include "nvk_private.h"
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker struct nv_device_info;
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker enum nvk_mme {
14*61046927SAndroid Build Coastguard Worker NVK_MME_SELECT_CB0,
15*61046927SAndroid Build Coastguard Worker NVK_MME_BIND_CBUF_DESC,
16*61046927SAndroid Build Coastguard Worker NVK_MME_CLEAR,
17*61046927SAndroid Build Coastguard Worker NVK_MME_BIND_IB,
18*61046927SAndroid Build Coastguard Worker NVK_MME_BIND_VB,
19*61046927SAndroid Build Coastguard Worker NVK_MME_SET_VB_ENABLES,
20*61046927SAndroid Build Coastguard Worker NVK_MME_SET_VB_STRIDE,
21*61046927SAndroid Build Coastguard Worker NVK_MME_SET_TESS_PARAMS,
22*61046927SAndroid Build Coastguard Worker NVK_MME_SET_ANTI_ALIAS,
23*61046927SAndroid Build Coastguard Worker NVK_MME_DRAW,
24*61046927SAndroid Build Coastguard Worker NVK_MME_DRAW_INDEXED,
25*61046927SAndroid Build Coastguard Worker NVK_MME_DRAW_INDIRECT,
26*61046927SAndroid Build Coastguard Worker NVK_MME_DRAW_INDEXED_INDIRECT,
27*61046927SAndroid Build Coastguard Worker NVK_MME_DRAW_INDIRECT_COUNT,
28*61046927SAndroid Build Coastguard Worker NVK_MME_DRAW_INDEXED_INDIRECT_COUNT,
29*61046927SAndroid Build Coastguard Worker NVK_MME_ADD_CS_INVOCATIONS,
30*61046927SAndroid Build Coastguard Worker NVK_MME_DISPATCH_INDIRECT,
31*61046927SAndroid Build Coastguard Worker NVK_MME_WRITE_CS_INVOCATIONS,
32*61046927SAndroid Build Coastguard Worker NVK_MME_XFB_COUNTER_LOAD,
33*61046927SAndroid Build Coastguard Worker NVK_MME_XFB_DRAW_INDIRECT,
34*61046927SAndroid Build Coastguard Worker NVK_MME_SET_PRIV_REG,
35*61046927SAndroid Build Coastguard Worker NVK_MME_SET_WRITE_MASK,
36*61046927SAndroid Build Coastguard Worker NVK_MME_SET_CONSERVATIVE_RASTER_STATE,
37*61046927SAndroid Build Coastguard Worker NVK_MME_SET_VIEWPORT_MIN_MAX_Z,
38*61046927SAndroid Build Coastguard Worker NVK_MME_SET_Z_CLAMP,
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker NVK_MME_COUNT,
41*61046927SAndroid Build Coastguard Worker };
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker enum nvk_mme_scratch {
44*61046927SAndroid Build Coastguard Worker /* These are reserved for communicating with FALCON */
45*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_FALCON_0 = 0,
46*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_FALCON_1 = 0,
47*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_FALCON_2 = 0,
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CS_INVOCATIONS_HI,
50*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CS_INVOCATIONS_LO,
51*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_DRAW_BEGIN,
52*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_DRAW_COUNT,
53*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_DRAW_PAD_DW,
54*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_DRAW_IDX,
55*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_VIEW_MASK,
56*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_WRITE_MASK_DYN,
57*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_WRITE_MASK_PIPELINE,
58*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CONSERVATIVE_RASTER_STATE,
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker /* Bitfield of enabled vertex buffer bindings */
61*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_VB_ENABLES,
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker /* Tessellation parameters */
64*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_TESS_PARAMS,
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker /* Anti-aliasing state */
67*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_ANTI_ALIAS,
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker /* Addres of cb0 */
70*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CB0_ADDR_HI,
71*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CB0_ADDR_LO,
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker /* Addres of zero page */
74*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_ZERO_ADDR_HI,
75*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_ZERO_ADDR_LO,
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker /* Shadow copies of values in CB0 */
78*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CB0_FIRST_VERTEX,
79*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CB0_DRAW_INDEX,
80*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_CB0_VIEW_INDEX,
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_VIEWPORT0_MIN_Z,
83*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_VIEWPORT0_MAX_Z,
84*61046927SAndroid Build Coastguard Worker NVK_MME_SCRATCH_Z_CLAMP = NVK_MME_SCRATCH_VIEWPORT0_MIN_Z
85*61046927SAndroid Build Coastguard Worker + (NVK_MAX_VIEWPORTS * 2),
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker /* Must be at the end */
88*61046927SAndroid Build Coastguard Worker NVK_MME_NUM_SCRATCH,
89*61046927SAndroid Build Coastguard Worker };
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker #define NVK_SET_MME_SCRATCH(S) (0x3400 + (NVK_MME_SCRATCH_##S) * 4)
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker static inline void
_nvk_mme_load_scratch_to(struct mme_builder * b,struct mme_value val,enum nvk_mme_scratch scratch)94*61046927SAndroid Build Coastguard Worker _nvk_mme_load_scratch_to(struct mme_builder *b, struct mme_value val,
95*61046927SAndroid Build Coastguard Worker enum nvk_mme_scratch scratch)
96*61046927SAndroid Build Coastguard Worker {
97*61046927SAndroid Build Coastguard Worker mme_state_to(b, val, 0x3400 + scratch * 4);
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker #define nvk_mme_load_scratch_to(b, v, S) \
100*61046927SAndroid Build Coastguard Worker _nvk_mme_load_scratch_to(b, v, NVK_MME_SCRATCH_##S)
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker static inline struct mme_value
_nvk_mme_load_scratch(struct mme_builder * b,enum nvk_mme_scratch scratch)103*61046927SAndroid Build Coastguard Worker _nvk_mme_load_scratch(struct mme_builder *b, enum nvk_mme_scratch scratch)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker struct mme_value val = mme_alloc_reg(b);
106*61046927SAndroid Build Coastguard Worker _nvk_mme_load_scratch_to(b, val, scratch);
107*61046927SAndroid Build Coastguard Worker return val;
108*61046927SAndroid Build Coastguard Worker }
109*61046927SAndroid Build Coastguard Worker #define nvk_mme_load_scratch(b, S) \
110*61046927SAndroid Build Coastguard Worker _nvk_mme_load_scratch(b, NVK_MME_SCRATCH_##S)
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker static inline void
_nvk_mme_store_scratch(struct mme_builder * b,enum nvk_mme_scratch scratch,struct mme_value data)113*61046927SAndroid Build Coastguard Worker _nvk_mme_store_scratch(struct mme_builder *b, enum nvk_mme_scratch scratch,
114*61046927SAndroid Build Coastguard Worker struct mme_value data)
115*61046927SAndroid Build Coastguard Worker {
116*61046927SAndroid Build Coastguard Worker mme_mthd(b, 0x3400 + scratch * 4);
117*61046927SAndroid Build Coastguard Worker mme_emit(b, data);
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker #define nvk_mme_store_scratch(b, S, v) \
120*61046927SAndroid Build Coastguard Worker _nvk_mme_store_scratch(b, NVK_MME_SCRATCH_##S, v)
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker static inline void
_nvk_mme_load_to_scratch(struct mme_builder * b,enum nvk_mme_scratch scratch)123*61046927SAndroid Build Coastguard Worker _nvk_mme_load_to_scratch(struct mme_builder *b, enum nvk_mme_scratch scratch)
124*61046927SAndroid Build Coastguard Worker {
125*61046927SAndroid Build Coastguard Worker struct mme_value val = mme_load(b);
126*61046927SAndroid Build Coastguard Worker _nvk_mme_store_scratch(b, scratch, val);
127*61046927SAndroid Build Coastguard Worker mme_free_reg(b, val);
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker #define nvk_mme_load_to_scratch(b, S) \
130*61046927SAndroid Build Coastguard Worker _nvk_mme_load_to_scratch(b, NVK_MME_SCRATCH_##S)
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker static inline uint32_t
nvk_mme_val_mask(uint16_t val,uint16_t mask)133*61046927SAndroid Build Coastguard Worker nvk_mme_val_mask(uint16_t val, uint16_t mask)
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker /* If there are bits in val which aren't in mask, it's probably a
136*61046927SAndroid Build Coastguard Worker * programming error on the CPU side. nvk_mme_set_masked() will still
137*61046927SAndroid Build Coastguard Worker * work in this case but it's worth an assert.
138*61046927SAndroid Build Coastguard Worker */
139*61046927SAndroid Build Coastguard Worker assert(!(val & ~mask));
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker return ((uint32_t)val) | (((uint32_t)mask) << 16);
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker /* This is a common pattern in NVK. The input val_mask is a value plus a mask
145*61046927SAndroid Build Coastguard Worker * where the top 16 bits are mask and the bottom 16 bits are data. src is
146*61046927SAndroid Build Coastguard Worker * copied and the bits in the mask are replaced by the corresponding value
147*61046927SAndroid Build Coastguard Worker * bits in val_mask.
148*61046927SAndroid Build Coastguard Worker */
149*61046927SAndroid Build Coastguard Worker static inline struct mme_value
nvk_mme_set_masked(struct mme_builder * b,struct mme_value src,struct mme_value val_mask)150*61046927SAndroid Build Coastguard Worker nvk_mme_set_masked(struct mme_builder *b, struct mme_value src,
151*61046927SAndroid Build Coastguard Worker struct mme_value val_mask)
152*61046927SAndroid Build Coastguard Worker {
153*61046927SAndroid Build Coastguard Worker struct mme_value mask = mme_merge(b, mme_zero(), val_mask, 0, 16, 16);
154*61046927SAndroid Build Coastguard Worker struct mme_value val = mme_and_not(b, src, mask);
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker /* Re-use the mask reg for val_mask & mask */
157*61046927SAndroid Build Coastguard Worker mme_and_to(b, mask, val_mask, mask);
158*61046927SAndroid Build Coastguard Worker mme_or_to(b, val, val, mask);
159*61046927SAndroid Build Coastguard Worker mme_free_reg(b, mask);
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker return val;
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker static void
_nvk_mme_spill(struct mme_builder * b,enum nvk_mme_scratch scratch,struct mme_value val)165*61046927SAndroid Build Coastguard Worker _nvk_mme_spill(struct mme_builder *b, enum nvk_mme_scratch scratch,
166*61046927SAndroid Build Coastguard Worker struct mme_value val)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker if (val.type == MME_VALUE_TYPE_REG) {
169*61046927SAndroid Build Coastguard Worker _nvk_mme_store_scratch(b, scratch, val);
170*61046927SAndroid Build Coastguard Worker mme_free_reg(b, val);
171*61046927SAndroid Build Coastguard Worker }
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker #define nvk_mme_spill(b, S, v) \
174*61046927SAndroid Build Coastguard Worker _nvk_mme_spill(b, NVK_MME_SCRATCH_##S, v)
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker static void
_nvk_mme_unspill(struct mme_builder * b,enum nvk_mme_scratch scratch,struct mme_value val)177*61046927SAndroid Build Coastguard Worker _nvk_mme_unspill(struct mme_builder *b, enum nvk_mme_scratch scratch,
178*61046927SAndroid Build Coastguard Worker struct mme_value val)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker if (val.type == MME_VALUE_TYPE_REG) {
181*61046927SAndroid Build Coastguard Worker mme_realloc_reg(b, val);
182*61046927SAndroid Build Coastguard Worker _nvk_mme_load_scratch_to(b, val, scratch);
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker }
185*61046927SAndroid Build Coastguard Worker #define nvk_mme_unspill(b, S, v) \
186*61046927SAndroid Build Coastguard Worker _nvk_mme_unspill(b, NVK_MME_SCRATCH_##S, v)
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker typedef void (*nvk_mme_builder_func)(struct mme_builder *b);
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Worker uint32_t *nvk_build_mme(const struct nv_device_info *devinfo,
191*61046927SAndroid Build Coastguard Worker enum nvk_mme mme, size_t *size_out);
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker void nvk_mme_select_cb0(struct mme_builder *b);
194*61046927SAndroid Build Coastguard Worker void nvk_mme_bind_cbuf_desc(struct mme_builder *b);
195*61046927SAndroid Build Coastguard Worker void nvk_mme_clear(struct mme_builder *b);
196*61046927SAndroid Build Coastguard Worker void nvk_mme_bind_ib(struct mme_builder *b);
197*61046927SAndroid Build Coastguard Worker void nvk_mme_bind_vb(struct mme_builder *b);
198*61046927SAndroid Build Coastguard Worker void nvk_mme_set_vb_enables(struct mme_builder *b);
199*61046927SAndroid Build Coastguard Worker void nvk_mme_set_vb_stride(struct mme_builder *b);
200*61046927SAndroid Build Coastguard Worker void nvk_mme_set_tess_params(struct mme_builder *b);
201*61046927SAndroid Build Coastguard Worker void nvk_mme_set_anti_alias(struct mme_builder *b);
202*61046927SAndroid Build Coastguard Worker void nvk_mme_draw(struct mme_builder *b);
203*61046927SAndroid Build Coastguard Worker void nvk_mme_draw_indexed(struct mme_builder *b);
204*61046927SAndroid Build Coastguard Worker void nvk_mme_draw_indirect(struct mme_builder *b);
205*61046927SAndroid Build Coastguard Worker void nvk_mme_draw_indexed_indirect(struct mme_builder *b);
206*61046927SAndroid Build Coastguard Worker void nvk_mme_draw_indirect_count(struct mme_builder *b);
207*61046927SAndroid Build Coastguard Worker void nvk_mme_draw_indexed_indirect_count(struct mme_builder *b);
208*61046927SAndroid Build Coastguard Worker void nvk_mme_add_cs_invocations(struct mme_builder *b);
209*61046927SAndroid Build Coastguard Worker void nvk_mme_dispatch_indirect(struct mme_builder *b);
210*61046927SAndroid Build Coastguard Worker void nvk_mme_write_cs_invocations(struct mme_builder *b);
211*61046927SAndroid Build Coastguard Worker void nvk_mme_xfb_counter_load(struct mme_builder *b);
212*61046927SAndroid Build Coastguard Worker void nvk_mme_xfb_draw_indirect(struct mme_builder *b);
213*61046927SAndroid Build Coastguard Worker void nvk_mme_set_priv_reg(struct mme_builder *b);
214*61046927SAndroid Build Coastguard Worker void nvk_mme_set_write_mask(struct mme_builder *b);
215*61046927SAndroid Build Coastguard Worker void nvk_mme_set_conservative_raster_state(struct mme_builder *b);
216*61046927SAndroid Build Coastguard Worker void nvk_mme_set_viewport_min_max_z(struct mme_builder *b);
217*61046927SAndroid Build Coastguard Worker void nvk_mme_set_z_clamp(struct mme_builder *b);
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker struct nvk_mme_mthd_data {
220*61046927SAndroid Build Coastguard Worker uint16_t mthd;
221*61046927SAndroid Build Coastguard Worker uint32_t data;
222*61046927SAndroid Build Coastguard Worker };
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker #define NVK_MME_MTHD_DATA_END ((struct nvk_mme_mthd_data) { 0, 0 })
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker struct nvk_mme_test_case {
227*61046927SAndroid Build Coastguard Worker const struct nvk_mme_mthd_data *init;
228*61046927SAndroid Build Coastguard Worker const uint32_t *params;
229*61046927SAndroid Build Coastguard Worker const struct nvk_mme_mthd_data *expected;
230*61046927SAndroid Build Coastguard Worker void (*check)(const struct nv_device_info *devinfo,
231*61046927SAndroid Build Coastguard Worker const struct nvk_mme_test_case *test,
232*61046927SAndroid Build Coastguard Worker const struct nvk_mme_mthd_data *results);
233*61046927SAndroid Build Coastguard Worker };
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker extern const struct nvk_mme_test_case nvk_mme_clear_tests[];
236*61046927SAndroid Build Coastguard Worker extern const struct nvk_mme_test_case nvk_mme_bind_vb_tests[];
237*61046927SAndroid Build Coastguard Worker extern const struct nvk_mme_test_case nvk_mme_set_tess_params_tests[];
238*61046927SAndroid Build Coastguard Worker extern const struct nvk_mme_test_case nvk_mme_set_anti_alias_tests[];
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker void nvk_test_all_mmes(const struct nv_device_info *devinfo);
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker #endif /* NVK_MME_H */
243