~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to src/gallium/drivers/radeonsi/si_state.h

  • Committer: mmach
  • Date: 2023-11-02 21:31:35 UTC
  • Revision ID: netbit73@gmail.com-20231102213135-18d4tzh7tj0uz752
2023-11-02 22:11:57

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * Copyright 2012 Advanced Micro Devices, Inc.
3
 
 * All Rights Reserved.
4
 
 *
5
 
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 
 * copy of this software and associated documentation files (the "Software"),
7
 
 * to deal in the Software without restriction, including without limitation
8
 
 * on the rights to use, copy, modify, merge, publish, distribute, sub
9
 
 * license, and/or sell copies of the Software, and to permit persons to whom
10
 
 * the Software is furnished to do so, subject to the following conditions:
11
 
 *
12
 
 * The above copyright notice and this permission notice (including the next
13
 
 * paragraph) shall be included in all copies or substantial portions of the
14
 
 * Software.
15
 
 *
16
 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19
 
 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20
 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21
 
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22
 
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
 
3
 *
 
4
 * SPDX-License-Identifier: MIT
23
5
 */
24
6
 
25
7
#ifndef SI_STATE_H
26
8
#define SI_STATE_H
27
9
 
28
 
#include "pipebuffer/pb_slab.h"
29
10
#include "si_pm4.h"
30
 
#include "util/u_blitter.h"
 
11
#include "util/format/u_format.h"
31
12
 
32
13
#ifdef __cplusplus
33
14
extern "C" {
49
30
struct si_shader_selector;
50
31
struct si_texture;
51
32
struct si_qbo_state;
 
33
struct legacy_surf_level;
 
34
struct pb_slab_entry;
52
35
 
53
36
struct si_state_blend {
54
37
   struct si_pm4_state pm4;
126
109
   /* 0 = without stencil buffer, 1 = when both Z and S buffers are present */
127
110
   struct si_dsa_order_invariance order_invariance[2];
128
111
 
129
 
   ubyte alpha_func : 3;
 
112
   uint8_t alpha_func : 3;
130
113
   bool depth_enabled : 1;
131
114
   bool depth_write_enabled : 1;
132
115
   bool stencil_enabled : 1;
184
167
      struct si_shader *hs;
185
168
      struct si_shader *es;
186
169
      struct si_shader *gs;
187
 
      struct si_pm4_state *vgt_shader_config;
188
170
      struct si_shader *vs;
189
171
      struct si_shader *ps;
190
172
      struct si_sqtt_fake_pipeline *sqtt_pipeline;
199
181
static inline unsigned si_states_that_always_roll_context(void)
200
182
{
201
183
   return (SI_STATE_BIT(blend) | SI_STATE_BIT(rasterizer) | SI_STATE_BIT(dsa) |
202
 
           SI_STATE_BIT(poly_offset) | SI_STATE_BIT(vgt_shader_config));
 
184
           SI_STATE_BIT(poly_offset));
203
185
}
204
186
 
205
187
union si_state_atoms {
209
191
      struct si_atom streamout_begin;
210
192
      struct si_atom streamout_enable; /* must be after streamout_begin */
211
193
      struct si_atom framebuffer;
212
 
      struct si_atom msaa_sample_locs;
 
194
      struct si_atom sample_locations;
213
195
      struct si_atom db_render_state;
214
196
      struct si_atom dpbb_state;
215
197
      struct si_atom msaa_config;
228
210
      struct si_atom window_rectangles;
229
211
      struct si_atom shader_query;
230
212
      struct si_atom ngg_cull_state;
 
213
      struct si_atom vgt_pipeline_state;
 
214
      struct si_atom tess_io_layout;
231
215
   } s;
232
216
   struct si_atom array[sizeof(struct si_atoms_s) / sizeof(struct si_atom)];
233
217
};
238
222
static inline unsigned si_atoms_that_always_roll_context(void)
239
223
{
240
224
   return (SI_ATOM_BIT(streamout_begin) | SI_ATOM_BIT(streamout_enable) | SI_ATOM_BIT(framebuffer) |
241
 
           SI_ATOM_BIT(msaa_sample_locs) | SI_ATOM_BIT(sample_mask) | SI_ATOM_BIT(blend_color) |
 
225
           SI_ATOM_BIT(sample_locations) | SI_ATOM_BIT(sample_mask) | SI_ATOM_BIT(blend_color) |
242
226
           SI_ATOM_BIT(clip_state) | SI_ATOM_BIT(scissors) | SI_ATOM_BIT(viewports) |
243
227
           SI_ATOM_BIT(stencil_ref) | SI_ATOM_BIT(scratch_state) | SI_ATOM_BIT(window_rectangles));
244
228
}
247
231
   uint32_t sh_base[SI_NUM_SHADERS];
248
232
};
249
233
 
250
 
/* The list of registers whose emitted values are remembered by si_context. */
251
 
enum si_tracked_reg
 
234
/* Context registers whose values are tracked by si_context. */
 
235
enum si_tracked_context_reg
252
236
{
253
 
   SI_TRACKED_DB_RENDER_CONTROL, /* 2 consecutive registers */
 
237
   /* 2 consecutive registers */
 
238
   SI_TRACKED_DB_RENDER_CONTROL,
254
239
   SI_TRACKED_DB_COUNT_CONTROL,
255
240
 
256
 
   SI_TRACKED_DB_RENDER_OVERRIDE2,
257
 
   SI_TRACKED_DB_SHADER_CONTROL,
258
 
 
259
 
   SI_TRACKED_CB_TARGET_MASK,
260
 
   SI_TRACKED_CB_DCC_CONTROL,
261
 
 
262
 
   SI_TRACKED_SX_PS_DOWNCONVERT, /* 3 consecutive registers */
263
 
   SI_TRACKED_SX_BLEND_OPT_EPSILON,
264
 
   SI_TRACKED_SX_BLEND_OPT_CONTROL,
265
 
 
266
 
   SI_TRACKED_PA_SC_LINE_CNTL, /* 2 consecutive registers */
 
241
   /* 2 consecutive registers */
 
242
   SI_TRACKED_PA_SC_LINE_CNTL,
267
243
   SI_TRACKED_PA_SC_AA_CONFIG,
268
244
 
269
 
   SI_TRACKED_DB_EQAA,
270
 
   SI_TRACKED_PA_SC_MODE_CNTL_1,
271
 
 
272
 
   SI_TRACKED_PA_SU_PRIM_FILTER_CNTL,
273
 
   SI_TRACKED_PA_SU_SMALL_PRIM_FILTER_CNTL,
274
 
 
275
 
   SI_TRACKED_PA_CL_VS_OUT_CNTL,
276
 
   SI_TRACKED_PA_CL_CLIP_CNTL,
277
 
 
278
 
   SI_TRACKED_PA_SC_BINNER_CNTL_0,
279
 
 
280
 
   SI_TRACKED_DB_PA_SC_VRS_OVERRIDE_CNTL,
281
 
 
282
 
   SI_TRACKED_PA_SU_VTX_CNTL, /* 5 consecutive registers */
 
245
   /* 5 consecutive registers */
 
246
   SI_TRACKED_PA_SU_VTX_CNTL,
283
247
   SI_TRACKED_PA_CL_GB_VERT_CLIP_ADJ,
284
248
   SI_TRACKED_PA_CL_GB_VERT_DISC_ADJ,
285
249
   SI_TRACKED_PA_CL_GB_HORZ_CLIP_ADJ,
286
250
   SI_TRACKED_PA_CL_GB_HORZ_DISC_ADJ,
287
251
 
288
 
   SI_TRACKED_PA_SU_HARDWARE_SCREEN_OFFSET,
289
 
 
 
252
   /* 2 consecutive registers */
 
253
   SI_TRACKED_SPI_SHADER_IDX_FORMAT,
 
254
   SI_TRACKED_SPI_SHADER_POS_FORMAT,
 
255
 
 
256
   /* 2 consecutive registers */
 
257
   SI_TRACKED_SPI_SHADER_Z_FORMAT,
 
258
   SI_TRACKED_SPI_SHADER_COL_FORMAT,
 
259
 
 
260
   SI_TRACKED_SPI_BARYC_CNTL,
 
261
 
 
262
   /* 2 consecutive registers */
 
263
   SI_TRACKED_SPI_PS_INPUT_ENA,
 
264
   SI_TRACKED_SPI_PS_INPUT_ADDR,
 
265
 
 
266
   SI_TRACKED_DB_EQAA,
 
267
   SI_TRACKED_DB_SHADER_CONTROL,
 
268
   SI_TRACKED_CB_SHADER_MASK,
 
269
   SI_TRACKED_CB_TARGET_MASK,
 
270
   SI_TRACKED_PA_CL_CLIP_CNTL,
 
271
   SI_TRACKED_PA_CL_VS_OUT_CNTL,
 
272
   SI_TRACKED_PA_CL_VTE_CNTL,
290
273
   SI_TRACKED_PA_SC_CLIPRECT_RULE,
291
 
 
292
274
   SI_TRACKED_PA_SC_LINE_STIPPLE,
293
 
 
294
 
   SI_TRACKED_VGT_ESGS_RING_ITEMSIZE,
295
 
 
296
 
   SI_TRACKED_VGT_GSVS_RING_OFFSET_1, /* 3 consecutive registers */
297
 
   SI_TRACKED_VGT_GSVS_RING_OFFSET_2,
298
 
   SI_TRACKED_VGT_GSVS_RING_OFFSET_3,
299
 
 
300
 
   SI_TRACKED_VGT_GSVS_RING_ITEMSIZE,
 
275
   SI_TRACKED_PA_SC_MODE_CNTL_1,
 
276
   SI_TRACKED_PA_SU_HARDWARE_SCREEN_OFFSET,
 
277
   SI_TRACKED_SPI_PS_IN_CONTROL,
 
278
   SI_TRACKED_VGT_GS_INSTANCE_CNT,
301
279
   SI_TRACKED_VGT_GS_MAX_VERT_OUT,
302
 
 
303
 
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE, /* 4 consecutive registers */
304
 
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE_1,
305
 
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE_2,
306
 
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE_3,
307
 
 
308
 
   SI_TRACKED_VGT_GS_INSTANCE_CNT,
309
 
   SI_TRACKED_VGT_GS_ONCHIP_CNTL,
310
 
   SI_TRACKED_VGT_GS_MAX_PRIMS_PER_SUBGROUP,
311
 
   SI_TRACKED_VGT_GS_MODE,
312
 
   SI_TRACKED_VGT_PRIMITIVEID_EN,
313
 
   SI_TRACKED_VGT_REUSE_OFF,
314
 
   SI_TRACKED_SPI_VS_OUT_CONFIG,
315
 
   SI_TRACKED_PA_CL_VTE_CNTL,
316
 
   SI_TRACKED_PA_CL_NGG_CNTL,
317
 
   SI_TRACKED_GE_MAX_OUTPUT_PER_SUBGROUP,
318
 
   SI_TRACKED_GE_NGG_SUBGRP_CNTL,
319
 
 
320
 
   SI_TRACKED_SPI_SHADER_IDX_FORMAT, /* 2 consecutive registers */
321
 
   SI_TRACKED_SPI_SHADER_POS_FORMAT,
322
 
 
323
 
   SI_TRACKED_SPI_PS_INPUT_ENA, /* 2 consecutive registers */
324
 
   SI_TRACKED_SPI_PS_INPUT_ADDR,
325
 
 
326
 
   SI_TRACKED_SPI_BARYC_CNTL,
327
 
   SI_TRACKED_SPI_PS_IN_CONTROL,
328
 
 
329
 
   SI_TRACKED_SPI_SHADER_Z_FORMAT, /* 2 consecutive registers */
330
 
   SI_TRACKED_SPI_SHADER_COL_FORMAT,
331
 
 
332
 
   SI_TRACKED_CB_SHADER_MASK,
 
280
   SI_TRACKED_VGT_SHADER_STAGES_EN,
 
281
   SI_TRACKED_VGT_LS_HS_CONFIG,
333
282
   SI_TRACKED_VGT_TF_PARAM,
334
 
   SI_TRACKED_VGT_VERTEX_REUSE_BLOCK_CNTL,
335
 
 
336
 
   /* Non-context registers: */
337
 
   SI_TRACKED_GE_PC_ALLOC,
338
 
   SI_TRACKED_SPI_SHADER_PGM_RSRC3_GS,
339
 
   SI_TRACKED_SPI_SHADER_PGM_RSRC4_GS,
340
 
 
341
 
   SI_NUM_TRACKED_REGS,
 
283
   SI_TRACKED_PA_SU_SMALL_PRIM_FILTER_CNTL,  /* GFX8-9 (only with has_small_prim_filter_sample_loc_bug) */
 
284
   SI_TRACKED_PA_SC_BINNER_CNTL_0,           /* GFX9+ */
 
285
   SI_TRACKED_GE_MAX_OUTPUT_PER_SUBGROUP,    /* GFX10+ - the SMALL_PRIM_FILTER slot above can be reused */
 
286
   SI_TRACKED_GE_NGG_SUBGRP_CNTL,            /* GFX10+ */
 
287
   SI_TRACKED_DB_PA_SC_VRS_OVERRIDE_CNTL,    /* GFX10.3+ */
 
288
 
 
289
   /* 3 consecutive registers */
 
290
   SI_TRACKED_SX_PS_DOWNCONVERT,             /* GFX8+ */
 
291
   SI_TRACKED_SX_BLEND_OPT_EPSILON,          /* GFX8+ */
 
292
   SI_TRACKED_SX_BLEND_OPT_CONTROL,          /* GFX8+ */
 
293
 
 
294
   /* The slots below can be reused by other generations. */
 
295
   SI_TRACKED_VGT_ESGS_RING_ITEMSIZE,        /* GFX6-8 (GFX9+ can reuse this slot) */
 
296
   SI_TRACKED_VGT_REUSE_OFF,                 /* GFX6-8 (GFX9+ can reuse this slot) */
 
297
   SI_TRACKED_IA_MULTI_VGT_PARAM,            /* GFX6-8 (GFX9+ can reuse this slot) */
 
298
 
 
299
   SI_TRACKED_VGT_GS_MAX_PRIMS_PER_SUBGROUP, /* GFX9-10 - the slots above can be reused */
 
300
   SI_TRACKED_VGT_GS_ONCHIP_CNTL,            /* GFX9-10 - the slots above can be reused */
 
301
 
 
302
   SI_TRACKED_VGT_GSVS_RING_ITEMSIZE,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
303
   SI_TRACKED_VGT_GS_MODE,                   /* GFX6-10 (GFX11+ can reuse this slot) */
 
304
   SI_TRACKED_VGT_VERTEX_REUSE_BLOCK_CNTL,   /* GFX6-10 (GFX11+ can reuse this slot) */
 
305
   SI_TRACKED_VGT_GS_OUT_PRIM_TYPE,          /* GFX6-10 (GFX11+ can reuse this slot) */
 
306
 
 
307
   /* 3 consecutive registers */
 
308
   SI_TRACKED_VGT_GSVS_RING_OFFSET_1,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
309
   SI_TRACKED_VGT_GSVS_RING_OFFSET_2,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
310
   SI_TRACKED_VGT_GSVS_RING_OFFSET_3,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
311
 
 
312
   /* 4 consecutive registers */
 
313
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE,          /* GFX6-10 (GFX11+ can reuse this slot) */
 
314
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE_1,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
315
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE_2,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
316
   SI_TRACKED_VGT_GS_VERT_ITEMSIZE_3,        /* GFX6-10 (GFX11+ can reuse this slot) */
 
317
 
 
318
   SI_TRACKED_DB_RENDER_OVERRIDE2,           /* GFX6-xx (TBD) */
 
319
   SI_TRACKED_SPI_VS_OUT_CONFIG,             /* GFX6-xx (TBD) */
 
320
   SI_TRACKED_VGT_PRIMITIVEID_EN,            /* GFX6-xx (TBD) */
 
321
   SI_TRACKED_CB_DCC_CONTROL,                /* GFX8-xx (TBD) */
 
322
 
 
323
   SI_NUM_TRACKED_CONTEXT_REGS,
 
324
};
 
325
 
 
326
/* Non-context registers whose values are tracked by si_context. */
 
327
enum si_tracked_other_reg {
 
328
   SI_TRACKED_GE_PC_ALLOC,                   /* GFX10+ */
 
329
   SI_TRACKED_SPI_SHADER_PGM_RSRC3_GS,       /* GFX7+ */
 
330
   SI_TRACKED_SPI_SHADER_PGM_RSRC4_GS,       /* GFX10+ */
 
331
   SI_TRACKED_VGT_GS_OUT_PRIM_TYPE_UCONFIG,  /* GFX11+ */
 
332
 
 
333
   SI_TRACKED_IA_MULTI_VGT_PARAM_UCONFIG,    /* GFX9 only */
 
334
   SI_TRACKED_GE_CNTL = SI_TRACKED_IA_MULTI_VGT_PARAM_UCONFIG, /* GFX10+ */
 
335
 
 
336
   SI_TRACKED_SPI_SHADER_PGM_RSRC2_HS,       /* GFX9+ (not tracked on previous chips) */
 
337
 
 
338
   /* 3 consecutive registers. */
 
339
   SI_TRACKED_SPI_SHADER_USER_DATA_HS__TCS_OFFCHIP_LAYOUT,
 
340
   SI_TRACKED_SPI_SHADER_USER_DATA_HS__TCS_OFFCHIP_ADDR,
 
341
   SI_TRACKED_SPI_SHADER_USER_DATA_HS__VS_STATE_BITS,    /* GFX6-8 */
 
342
 
 
343
   SI_TRACKED_COMPUTE_RESOURCE_LIMITS,
 
344
   SI_TRACKED_COMPUTE_NUM_THREAD_X,
 
345
   SI_TRACKED_COMPUTE_NUM_THREAD_Y,
 
346
   SI_TRACKED_COMPUTE_NUM_THREAD_Z,
 
347
   SI_TRACKED_COMPUTE_TMPRING_SIZE,
 
348
   SI_TRACKED_COMPUTE_PGM_RSRC3,             /* GFX11+ */
 
349
 
 
350
   /* 2 consecutive registers. */
 
351
   SI_TRACKED_COMPUTE_PGM_RSRC1,
 
352
   SI_TRACKED_COMPUTE_PGM_RSRC2,
 
353
 
 
354
   /* 2 consecutive registers. */
 
355
   SI_TRACKED_COMPUTE_DISPATCH_SCRATCH_BASE_LO, /* GFX11+ */
 
356
   SI_TRACKED_COMPUTE_DISPATCH_SCRATCH_BASE_HI, /* GFX11+ */
 
357
 
 
358
   SI_NUM_TRACKED_OTHER_REGS,
342
359
};
343
360
 
344
361
struct si_tracked_regs {
345
 
   uint64_t reg_saved;
346
 
   uint32_t reg_value[SI_NUM_TRACKED_REGS];
 
362
   uint64_t context_reg_saved_mask;
 
363
   uint32_t context_reg_value[SI_NUM_TRACKED_CONTEXT_REGS];
347
364
   uint32_t spi_ps_input_cntl[32];
 
365
 
 
366
   uint32_t other_reg_saved_mask;
 
367
   uint32_t other_reg_value[SI_NUM_TRACKED_OTHER_REGS];
348
368
};
349
369
 
350
370
/* Private read-write buffer slots. */
448
468
    * to the descriptor array will be stored. */
449
469
   short shader_userdata_offset;
450
470
   /* The size of one descriptor. */
451
 
   ubyte element_dw_size;
 
471
   uint8_t element_dw_size;
452
472
   /* If there is only one slot enabled, bind it directly instead of
453
473
    * uploading descriptors. -1 if disabled. */
454
474
   signed char slot_index_to_bind_directly;
531
551
void si_bindless_descriptor_slab_free(void *priv, struct pb_slab *pslab);
532
552
void si_rebind_buffer(struct si_context *sctx, struct pipe_resource *buf);
533
553
/* si_state.c */
534
 
uint32_t si_translate_colorformat(enum amd_gfx_level gfx_level, enum pipe_format format);
535
554
void si_init_state_compute_functions(struct si_context *sctx);
536
555
void si_init_state_functions(struct si_context *sctx);
537
556
void si_init_screen_state_functions(struct si_screen *sscreen);
538
 
void si_init_cs_preamble_state(struct si_context *sctx, bool uses_reg_shadowing);
 
557
void si_init_gfx_preamble_state(struct si_context *sctx);
539
558
void si_make_buffer_descriptor(struct si_screen *screen, struct si_resource *buf,
540
559
                               enum pipe_format format, unsigned offset, unsigned num_elements,
541
560
                               uint32_t *state);
562
581
void si_emit_dpbb_state(struct si_context *sctx);
563
582
 
564
583
/* si_state_shaders.cpp */
565
 
struct si_pm4_state *si_build_vgt_shader_config(struct si_screen *screen, union si_vgt_stages_key key);
566
584
void si_get_ir_cache_key(struct si_shader_selector *sel, bool ngg, bool es,
567
585
                         unsigned wave_size, unsigned char ir_sha1_cache_key[20]);
568
586
bool si_shader_cache_load_shader(struct si_screen *sscreen, unsigned char ir_sha1_cache_key[20],
599
617
bool si_update_spi_tmpring_size(struct si_context *sctx, unsigned bytes);
600
618
unsigned si_get_shader_prefetch_size(struct si_shader *shader);
601
619
bool si_set_tcs_to_fixed_func_shader(struct si_context *sctx);
 
620
void si_update_tess_io_layout_state(struct si_context *sctx);
602
621
 
603
622
/* si_state_draw.cpp */
604
623
void si_cp_dma_prefetch(struct si_context *sctx, struct pipe_resource *buf,
606
625
void si_set_vertex_buffer_descriptor(struct si_screen *sscreen, struct si_vertex_elements *velems,
607
626
                                     struct pipe_vertex_buffer *vb, unsigned element_index,
608
627
                                     uint32_t *out);
 
628
void gfx11_emit_buffered_compute_sh_regs(struct si_context *sctx);
609
629
void si_init_draw_functions_GFX6(struct si_context *sctx);
610
630
void si_init_draw_functions_GFX7(struct si_context *sctx);
611
631
void si_init_draw_functions_GFX8(struct si_context *sctx);
617
637
 
618
638
/* si_state_msaa.c */
619
639
void si_init_msaa_functions(struct si_context *sctx);
620
 
void si_emit_sample_locations(struct radeon_cmdbuf *cs, int nr_samples);
621
640
 
622
641
/* si_state_streamout.c */
623
642
void si_streamout_buffers_dirty(struct si_context *sctx);