1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2012 Advanced Micro Devices, Inc.
3*61046927SAndroid Build Coastguard Worker * Copyright 2024 Valve Corporation
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include "ac_cmdbuf.h"
9*61046927SAndroid Build Coastguard Worker #include "ac_pm4.h"
10*61046927SAndroid Build Coastguard Worker #include "ac_shader_util.h"
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker #include "sid.h"
13*61046927SAndroid Build Coastguard Worker
14*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker #define SI_GS_PER_ES 128
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker static void
gfx6_init_compute_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)19*61046927SAndroid Build Coastguard Worker gfx6_init_compute_preamble_state(const struct ac_preamble_state *state,
20*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
21*61046927SAndroid Build Coastguard Worker {
22*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
23*61046927SAndroid Build Coastguard Worker const uint32_t compute_cu_en = S_00B858_SH0_CU_EN(info->spi_cu_en) |
24*61046927SAndroid Build Coastguard Worker S_00B858_SH1_CU_EN(info->spi_cu_en);
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B834_COMPUTE_PGM_HI, S_00B834_DATA(info->address32_hi >> 8));
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 2; ++i)
29*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B858_COMPUTE_STATIC_THREAD_MGMT_SE0 + i * 4,
30*61046927SAndroid Build Coastguard Worker i < info->max_se ? compute_cu_en : 0x0);
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7) {
33*61046927SAndroid Build Coastguard Worker for (unsigned i = 2; i < 4; ++i)
34*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B864_COMPUTE_STATIC_THREAD_MGMT_SE2 + (i - 2) * 4,
35*61046927SAndroid Build Coastguard Worker i < info->max_se ? compute_cu_en : 0x0);
36*61046927SAndroid Build Coastguard Worker }
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX9)
39*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0301EC_CP_COHER_START_DELAY, 0);
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker /* Set the pointer to border colors. */
42*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7) {
43*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030E00_TA_CS_BC_BASE_ADDR, state->border_color_va >> 8);
44*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030E04_TA_CS_BC_BASE_ADDR_HI,
45*61046927SAndroid Build Coastguard Worker S_030E04_ADDRESS(state->border_color_va >> 40));
46*61046927SAndroid Build Coastguard Worker } else if (info->gfx_level == GFX6) {
47*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00950C_TA_CS_BC_BASE_ADDR, state->border_color_va >> 8);
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker static void
gfx10_init_compute_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)52*61046927SAndroid Build Coastguard Worker gfx10_init_compute_preamble_state(const struct ac_preamble_state *state,
53*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
56*61046927SAndroid Build Coastguard Worker const uint32_t compute_cu_en = S_00B858_SH0_CU_EN(info->spi_cu_en) |
57*61046927SAndroid Build Coastguard Worker S_00B858_SH1_CU_EN(info->spi_cu_en);
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker if (info->gfx_level < GFX11)
60*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0301EC_CP_COHER_START_DELAY, 0x20);
61*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030E00_TA_CS_BC_BASE_ADDR, state->border_color_va >> 8);
62*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030E04_TA_CS_BC_BASE_ADDR_HI, S_030E04_ADDRESS(state->border_color_va >> 40));
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B834_COMPUTE_PGM_HI, S_00B834_DATA(info->address32_hi >> 8));
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 2; ++i)
67*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B858_COMPUTE_STATIC_THREAD_MGMT_SE0 + i * 4,
68*61046927SAndroid Build Coastguard Worker i < info->max_se ? compute_cu_en : 0x0);
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker for (unsigned i = 2; i < 4; ++i)
71*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B864_COMPUTE_STATIC_THREAD_MGMT_SE2 + (i - 2) * 4,
72*61046927SAndroid Build Coastguard Worker i < info->max_se ? compute_cu_en : 0x0);
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B890_COMPUTE_USER_ACCUM_0, 0);
75*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B894_COMPUTE_USER_ACCUM_1, 0);
76*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B898_COMPUTE_USER_ACCUM_2, 0);
77*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B89C_COMPUTE_USER_ACCUM_3, 0);
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX11) {
80*61046927SAndroid Build Coastguard Worker for (unsigned i = 4; i < 8; ++i)
81*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B8AC_COMPUTE_STATIC_THREAD_MGMT_SE4 + (i - 4) * 4,
82*61046927SAndroid Build Coastguard Worker i < info->max_se ? compute_cu_en : 0x0);
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker /* How many threads should go to 1 SE before moving onto the next. Think of GL1 cache hits.
85*61046927SAndroid Build Coastguard Worker * Only these values are valid: 0 (disabled), 64, 128, 256, 512
86*61046927SAndroid Build Coastguard Worker * Recommendation: 64 = RT, 256 = non-RT (run benchmarks to be sure)
87*61046927SAndroid Build Coastguard Worker */
88*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B8BC_COMPUTE_DISPATCH_INTERLEAVE,
89*61046927SAndroid Build Coastguard Worker S_00B8BC_INTERLEAVE(state->gfx11.compute_dispatch_interleave));
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B9F4_COMPUTE_DISPATCH_TUNNEL, 0);
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker static void
gfx12_init_compute_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)96*61046927SAndroid Build Coastguard Worker gfx12_init_compute_preamble_state(const struct ac_preamble_state *state,
97*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
100*61046927SAndroid Build Coastguard Worker const uint32_t compute_cu_en = S_00B858_SH0_CU_EN(info->spi_cu_en) |
101*61046927SAndroid Build Coastguard Worker S_00B858_SH1_CU_EN(info->spi_cu_en);
102*61046927SAndroid Build Coastguard Worker const uint32_t num_se = info->max_se;
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030E00_TA_CS_BC_BASE_ADDR, state->border_color_va >> 8);
105*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030E04_TA_CS_BC_BASE_ADDR_HI, S_030E04_ADDRESS(state->border_color_va >> 40));
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B82C_COMPUTE_PERFCOUNT_ENABLE, 0);
108*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B834_COMPUTE_PGM_HI, S_00B834_DATA(info->address32_hi >> 8));
109*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B838_COMPUTE_DISPATCH_PKT_ADDR_LO, 0);
110*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B83C_COMPUTE_DISPATCH_PKT_ADDR_HI, 0);
111*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B858_COMPUTE_STATIC_THREAD_MGMT_SE0, compute_cu_en);
112*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B85C_COMPUTE_STATIC_THREAD_MGMT_SE1, num_se > 1 ? compute_cu_en : 0);
113*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B864_COMPUTE_STATIC_THREAD_MGMT_SE2, num_se > 2 ? compute_cu_en : 0);
114*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B868_COMPUTE_STATIC_THREAD_MGMT_SE3, num_se > 3 ? compute_cu_en : 0);
115*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B88C_COMPUTE_STATIC_THREAD_MGMT_SE8, num_se > 8 ? compute_cu_en : 0);
116*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B890_COMPUTE_USER_ACCUM_0, 0);
117*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B894_COMPUTE_USER_ACCUM_1, 0);
118*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B898_COMPUTE_USER_ACCUM_2, 0);
119*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B89C_COMPUTE_USER_ACCUM_3, 0);
120*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B8AC_COMPUTE_STATIC_THREAD_MGMT_SE4, num_se > 4 ? compute_cu_en : 0);
121*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B8B0_COMPUTE_STATIC_THREAD_MGMT_SE5, num_se > 5 ? compute_cu_en : 0);
122*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B8B4_COMPUTE_STATIC_THREAD_MGMT_SE6, num_se > 6 ? compute_cu_en : 0);
123*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B8B8_COMPUTE_STATIC_THREAD_MGMT_SE7, num_se > 7 ? compute_cu_en : 0);
124*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B9F4_COMPUTE_DISPATCH_TUNNEL, 0);
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker void
ac_init_compute_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)128*61046927SAndroid Build Coastguard Worker ac_init_compute_preamble_state(const struct ac_preamble_state *state,
129*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
130*61046927SAndroid Build Coastguard Worker {
131*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX12) {
134*61046927SAndroid Build Coastguard Worker gfx12_init_compute_preamble_state(state, pm4);
135*61046927SAndroid Build Coastguard Worker } else if (info->gfx_level >= GFX10) {
136*61046927SAndroid Build Coastguard Worker gfx10_init_compute_preamble_state(state, pm4);
137*61046927SAndroid Build Coastguard Worker } else {
138*61046927SAndroid Build Coastguard Worker gfx6_init_compute_preamble_state(state, pm4);
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker static void
ac_set_grbm_gfx_index(const struct radeon_info * info,struct ac_pm4_state * pm4,unsigned value)143*61046927SAndroid Build Coastguard Worker ac_set_grbm_gfx_index(const struct radeon_info *info, struct ac_pm4_state *pm4, unsigned value)
144*61046927SAndroid Build Coastguard Worker {
145*61046927SAndroid Build Coastguard Worker const unsigned reg = info->gfx_level >= GFX7 ? R_030800_GRBM_GFX_INDEX : R_00802C_GRBM_GFX_INDEX;
146*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, reg, value);
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker static void
ac_set_grbm_gfx_index_se(const struct radeon_info * info,struct ac_pm4_state * pm4,unsigned se)150*61046927SAndroid Build Coastguard Worker ac_set_grbm_gfx_index_se(const struct radeon_info *info, struct ac_pm4_state *pm4, unsigned se)
151*61046927SAndroid Build Coastguard Worker {
152*61046927SAndroid Build Coastguard Worker assert(se == ~0 || se < info->max_se);
153*61046927SAndroid Build Coastguard Worker ac_set_grbm_gfx_index(info, pm4,
154*61046927SAndroid Build Coastguard Worker (se == ~0 ? S_030800_SE_BROADCAST_WRITES(1) : S_030800_SE_INDEX(se)) |
155*61046927SAndroid Build Coastguard Worker S_030800_SH_BROADCAST_WRITES(1) |
156*61046927SAndroid Build Coastguard Worker S_030800_INSTANCE_BROADCAST_WRITES(1));
157*61046927SAndroid Build Coastguard Worker }
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker static void
ac_write_harvested_raster_configs(const struct radeon_info * info,struct ac_pm4_state * pm4,unsigned raster_config,unsigned raster_config_1)160*61046927SAndroid Build Coastguard Worker ac_write_harvested_raster_configs(const struct radeon_info *info, struct ac_pm4_state *pm4,
161*61046927SAndroid Build Coastguard Worker unsigned raster_config, unsigned raster_config_1)
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker const unsigned num_se = MAX2(info->max_se, 1);
164*61046927SAndroid Build Coastguard Worker unsigned raster_config_se[4];
165*61046927SAndroid Build Coastguard Worker unsigned se;
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker ac_get_harvested_configs(info, raster_config, &raster_config_1, raster_config_se);
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker for (se = 0; se < num_se; se++) {
170*61046927SAndroid Build Coastguard Worker ac_set_grbm_gfx_index_se(info, pm4, se);
171*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028350_PA_SC_RASTER_CONFIG, raster_config_se[se]);
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker ac_set_grbm_gfx_index(info, pm4, ~0);
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7) {
176*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028354_PA_SC_RASTER_CONFIG_1, raster_config_1);
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker static void
ac_set_raster_config(const struct radeon_info * info,struct ac_pm4_state * pm4)181*61046927SAndroid Build Coastguard Worker ac_set_raster_config(const struct radeon_info *info, struct ac_pm4_state *pm4)
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker const unsigned num_rb = MIN2(info->max_render_backends, 16);
184*61046927SAndroid Build Coastguard Worker const uint64_t rb_mask = info->enabled_rb_mask;
185*61046927SAndroid Build Coastguard Worker unsigned raster_config, raster_config_1;
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker ac_get_raster_config(info, &raster_config, &raster_config_1, NULL);
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker if (!rb_mask || util_bitcount64(rb_mask) >= num_rb) {
190*61046927SAndroid Build Coastguard Worker /* Always use the default config when all backends are enabled
191*61046927SAndroid Build Coastguard Worker * (or when we failed to determine the enabled backends).
192*61046927SAndroid Build Coastguard Worker */
193*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028350_PA_SC_RASTER_CONFIG, raster_config);
194*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7)
195*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028354_PA_SC_RASTER_CONFIG_1, raster_config_1);
196*61046927SAndroid Build Coastguard Worker } else {
197*61046927SAndroid Build Coastguard Worker ac_write_harvested_raster_configs(info, pm4, raster_config, raster_config_1);
198*61046927SAndroid Build Coastguard Worker }
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker static void
gfx6_init_graphics_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)202*61046927SAndroid Build Coastguard Worker gfx6_init_graphics_preamble_state(const struct ac_preamble_state *state,
203*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
204*61046927SAndroid Build Coastguard Worker {
205*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker /* Graphics registers. */
208*61046927SAndroid Build Coastguard Worker /* CLEAR_STATE doesn't restore these correctly. */
209*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, S_028240_WINDOW_OFFSET_DISABLE(1));
210*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR,
211*61046927SAndroid Build Coastguard Worker S_028244_BR_X(16384) | S_028244_BR_Y(16384));
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, fui(64));
214*61046927SAndroid Build Coastguard Worker if (!info->has_clear_state)
215*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, fui(0));
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker if (!info->has_clear_state) {
218*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0);
219*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0);
220*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0);
221*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0);
222*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0);
223*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0);
224*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A5C_VGT_GS_PER_VS, 0x2);
225*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0);
226*61046927SAndroid Build Coastguard Worker }
227*61046927SAndroid Build Coastguard Worker
228*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028080_TA_BC_BASE_ADDR, state->border_color_va >> 8);
229*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7)
230*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028084_TA_BC_BASE_ADDR_HI, S_028084_ADDRESS(state->border_color_va >> 40));
231*61046927SAndroid Build Coastguard Worker
232*61046927SAndroid Build Coastguard Worker if (info->gfx_level == GFX6) {
233*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE,
234*61046927SAndroid Build Coastguard Worker S_008A14_NUM_CLIP_SEQ(3) | S_008A14_CLIP_VTX_REORDER_ENA(1));
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7) {
238*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030A00_PA_SU_LINE_STIPPLE_VALUE, 0);
239*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030A04_PA_SC_LINE_STIPPLE_STATE, 0);
240*61046927SAndroid Build Coastguard Worker } else {
241*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_008A60_PA_SU_LINE_STIPPLE_VALUE, 0);
242*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_008B10_PA_SC_LINE_STIPPLE_STATE, 0);
243*61046927SAndroid Build Coastguard Worker }
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker /* If any sample location uses the -8 coordinate, the EXCLUSION fields should be set to 0. */
246*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02882C_PA_SU_PRIM_FILTER_CNTL,
247*61046927SAndroid Build Coastguard Worker S_02882C_XMAX_RIGHT_EXCLUSION(info->gfx_level >= GFX7) |
248*61046927SAndroid Build Coastguard Worker S_02882C_YMAX_BOTTOM_EXCLUSION(info->gfx_level >= GFX7));
249*61046927SAndroid Build Coastguard Worker
250*61046927SAndroid Build Coastguard Worker if (info->gfx_level <= GFX7 || !info->has_clear_state) {
251*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C58_VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
252*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C5C_VGT_OUT_DEALLOC_CNTL, 16);
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker /* CLEAR_STATE doesn't clear these correctly on certain generations.
255*61046927SAndroid Build Coastguard Worker * I don't know why. Deduced by trial and error.
256*61046927SAndroid Build Coastguard Worker */
257*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0);
258*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, S_028204_WINDOW_OFFSET_DISABLE(1));
259*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, 0);
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7) {
263*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B01C_SPI_SHADER_PGM_RSRC3_PS,
264*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B01C_CU_EN(0xffffffff) |
265*61046927SAndroid Build Coastguard Worker S_00B01C_WAVE_LIMIT_GFX7(0x3F),
266*61046927SAndroid Build Coastguard Worker C_00B01C_CU_EN, 0, info));
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker if (info->gfx_level <= GFX8) {
270*61046927SAndroid Build Coastguard Worker ac_set_raster_config(info, pm4);
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker /* FIXME calculate these values somehow ??? */
273*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A54_VGT_GS_PER_ES, SI_GS_PER_ES);
274*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A58_VGT_ES_PER_GS, 0x40);
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker /* These registers, when written, also overwrite the CLEAR_STATE
277*61046927SAndroid Build Coastguard Worker * context, so we can't rely on CLEAR_STATE setting them.
278*61046927SAndroid Build Coastguard Worker * It would be an issue if there was another UMD changing them.
279*61046927SAndroid Build Coastguard Worker */
280*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028400_VGT_MAX_VTX_INDX, ~0);
281*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028404_VGT_MIN_VTX_INDX, 0);
282*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028408_VGT_INDX_OFFSET, 0);
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker if (info->gfx_level == GFX9) {
286*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B414_SPI_SHADER_PGM_HI_LS,
287*61046927SAndroid Build Coastguard Worker S_00B414_MEM_BASE(info->address32_hi >> 8));
288*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B214_SPI_SHADER_PGM_HI_ES,
289*61046927SAndroid Build Coastguard Worker S_00B214_MEM_BASE(info->address32_hi >> 8));
290*61046927SAndroid Build Coastguard Worker } else {
291*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B524_SPI_SHADER_PGM_HI_LS,
292*61046927SAndroid Build Coastguard Worker S_00B524_MEM_BASE(info->address32_hi >> 8));
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX7 && info->gfx_level <= GFX8) {
296*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B51C_SPI_SHADER_PGM_RSRC3_LS,
297*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B51C_CU_EN(0xffff) | S_00B51C_WAVE_LIMIT(0x3F),
298*61046927SAndroid Build Coastguard Worker C_00B51C_CU_EN, 0, info));
299*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B41C_SPI_SHADER_PGM_RSRC3_HS, S_00B41C_WAVE_LIMIT(0x3F));
300*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B31C_SPI_SHADER_PGM_RSRC3_ES,
301*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B31C_CU_EN(0xffff) | S_00B31C_WAVE_LIMIT(0x3F),
302*61046927SAndroid Build Coastguard Worker C_00B31C_CU_EN, 0, info));
303*61046927SAndroid Build Coastguard Worker
304*61046927SAndroid Build Coastguard Worker /* If this is 0, Bonaire can hang even if GS isn't being used.
305*61046927SAndroid Build Coastguard Worker * Other chips are unaffected. These are suboptimal values,
306*61046927SAndroid Build Coastguard Worker * but we don't use on-chip GS.
307*61046927SAndroid Build Coastguard Worker */
308*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A44_VGT_GS_ONCHIP_CNTL,
309*61046927SAndroid Build Coastguard Worker S_028A44_ES_VERTS_PER_SUBGRP(64) | S_028A44_GS_PRIMS_PER_SUBGRP(4));
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX8) {
313*61046927SAndroid Build Coastguard Worker unsigned vgt_tess_distribution;
314*61046927SAndroid Build Coastguard Worker
315*61046927SAndroid Build Coastguard Worker if (info->gfx_level == GFX9) {
316*61046927SAndroid Build Coastguard Worker vgt_tess_distribution = S_028B50_ACCUM_ISOLINE(12) |
317*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_TRI(30) |
318*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_QUAD(24) |
319*61046927SAndroid Build Coastguard Worker S_028B50_DONUT_SPLIT_GFX9(24) |
320*61046927SAndroid Build Coastguard Worker S_028B50_TRAP_SPLIT(6);
321*61046927SAndroid Build Coastguard Worker } else {
322*61046927SAndroid Build Coastguard Worker vgt_tess_distribution = S_028B50_ACCUM_ISOLINE(32) |
323*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_TRI(11) |
324*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_QUAD(11) |
325*61046927SAndroid Build Coastguard Worker S_028B50_DONUT_SPLIT_GFX81(16);
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker /* Testing with Unigine Heaven extreme tessellation yielded best results
328*61046927SAndroid Build Coastguard Worker * with TRAP_SPLIT = 3.
329*61046927SAndroid Build Coastguard Worker */
330*61046927SAndroid Build Coastguard Worker if (info->family == CHIP_FIJI || info->family >= CHIP_POLARIS10)
331*61046927SAndroid Build Coastguard Worker vgt_tess_distribution |= S_028B50_TRAP_SPLIT(3);
332*61046927SAndroid Build Coastguard Worker }
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028B50_VGT_TESS_DISTRIBUTION, vgt_tess_distribution);
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AA0_VGT_INSTANCE_STEP_RATE_0, 1);
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker if (info->gfx_level == GFX9) {
340*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030920_VGT_MAX_VTX_INDX, ~0);
341*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030924_VGT_MIN_VTX_INDX, 0);
342*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030928_VGT_INDX_OFFSET, 0);
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028060_DB_DFSM_CONTROL, S_028060_PUNCHOUT_MODE(V_028060_FORCE_OFF));
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B41C_SPI_SHADER_PGM_RSRC3_HS,
347*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B41C_CU_EN(0xffff) | S_00B41C_WAVE_LIMIT(0x3F),
348*61046927SAndroid Build Coastguard Worker C_00B41C_CU_EN, 0, info));
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C48_PA_SC_BINNER_CNTL_1,
351*61046927SAndroid Build Coastguard Worker S_028C48_MAX_ALLOC_COUNT(info->pbb_max_alloc_count - 1) |
352*61046927SAndroid Build Coastguard Worker S_028C48_MAX_PRIM_PER_BATCH(1023));
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AAC_VGT_ESGS_RING_ITEMSIZE, 1);
355*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030968_VGT_INSTANCE_BASE_ID, 0);
356*61046927SAndroid Build Coastguard Worker }
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker static void
gfx10_init_graphics_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)360*61046927SAndroid Build Coastguard Worker gfx10_init_graphics_preamble_state(const struct ac_preamble_state *state,
361*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
362*61046927SAndroid Build Coastguard Worker {
363*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
364*61046927SAndroid Build Coastguard Worker unsigned meta_write_policy, meta_read_policy, color_write_policy, color_read_policy;
365*61046927SAndroid Build Coastguard Worker unsigned zs_write_policy, zs_read_policy;
366*61046927SAndroid Build Coastguard Worker unsigned cache_no_alloc = info->gfx_level >= GFX11 ? V_02807C_CACHE_NOA_GFX11:
367*61046927SAndroid Build Coastguard Worker V_02807C_CACHE_NOA_GFX10;
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker if (state->gfx10.cache_rb_gl2) {
370*61046927SAndroid Build Coastguard Worker color_write_policy = V_028410_CACHE_LRU_WR;
371*61046927SAndroid Build Coastguard Worker color_read_policy = V_028410_CACHE_LRU_RD;
372*61046927SAndroid Build Coastguard Worker zs_write_policy = V_02807C_CACHE_LRU_WR;
373*61046927SAndroid Build Coastguard Worker zs_read_policy = V_02807C_CACHE_LRU_RD;
374*61046927SAndroid Build Coastguard Worker meta_write_policy = V_02807C_CACHE_LRU_WR;
375*61046927SAndroid Build Coastguard Worker meta_read_policy = V_02807C_CACHE_LRU_RD;
376*61046927SAndroid Build Coastguard Worker } else {
377*61046927SAndroid Build Coastguard Worker color_write_policy = V_028410_CACHE_STREAM;
378*61046927SAndroid Build Coastguard Worker color_read_policy = cache_no_alloc;
379*61046927SAndroid Build Coastguard Worker zs_write_policy = V_02807C_CACHE_STREAM;
380*61046927SAndroid Build Coastguard Worker zs_read_policy = cache_no_alloc;
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker /* Enable CMASK/HTILE/DCC caching in L2 for small chips. */
383*61046927SAndroid Build Coastguard Worker if (info->max_render_backends <= 4) {
384*61046927SAndroid Build Coastguard Worker meta_write_policy = V_02807C_CACHE_LRU_WR; /* cache writes */
385*61046927SAndroid Build Coastguard Worker meta_read_policy = V_02807C_CACHE_LRU_RD; /* cache reads */
386*61046927SAndroid Build Coastguard Worker } else {
387*61046927SAndroid Build Coastguard Worker meta_write_policy = V_02807C_CACHE_STREAM; /* write combine */
388*61046927SAndroid Build Coastguard Worker meta_read_policy = cache_no_alloc; /* don't cache reads that miss */
389*61046927SAndroid Build Coastguard Worker }
390*61046927SAndroid Build Coastguard Worker }
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker const unsigned cu_mask_ps = info->gfx_level >= GFX10_3 ? ac_gfx103_get_cu_mask_ps(info) : ~0u;
393*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B01C_SPI_SHADER_PGM_RSRC3_PS,
394*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B01C_CU_EN(cu_mask_ps) |
395*61046927SAndroid Build Coastguard Worker S_00B01C_WAVE_LIMIT_GFX7(0x3F) |
396*61046927SAndroid Build Coastguard Worker S_00B01C_LDS_GROUP_SIZE_GFX11(info->gfx_level >= GFX11),
397*61046927SAndroid Build Coastguard Worker C_00B01C_CU_EN, 0, info));
398*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0C0_SPI_SHADER_REQ_CTRL_PS,
399*61046927SAndroid Build Coastguard Worker S_00B0C0_SOFT_GROUPING_EN(1) |
400*61046927SAndroid Build Coastguard Worker S_00B0C0_NUMBER_OF_REQUESTS_PER_CU(4 - 1));
401*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0C8_SPI_SHADER_USER_ACCUM_PS_0, 0);
402*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0CC_SPI_SHADER_USER_ACCUM_PS_1, 0);
403*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0D0_SPI_SHADER_USER_ACCUM_PS_2, 0);
404*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0D4_SPI_SHADER_USER_ACCUM_PS_3, 0);
405*61046927SAndroid Build Coastguard Worker
406*61046927SAndroid Build Coastguard Worker if (info->gfx_level < GFX11) {
407*61046927SAndroid Build Coastguard Worker /* Shader registers - VS. */
408*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B104_SPI_SHADER_PGM_RSRC4_VS,
409*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B104_CU_EN(0xffff), /* CUs 16-31 */
410*61046927SAndroid Build Coastguard Worker C_00B104_CU_EN, 16, info));
411*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B1C0_SPI_SHADER_REQ_CTRL_VS, 0);
412*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B1C8_SPI_SHADER_USER_ACCUM_VS_0, 0);
413*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B1CC_SPI_SHADER_USER_ACCUM_VS_1, 0);
414*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B1D0_SPI_SHADER_USER_ACCUM_VS_2, 0);
415*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B1D4_SPI_SHADER_USER_ACCUM_VS_3, 0);
416*61046927SAndroid Build Coastguard Worker
417*61046927SAndroid Build Coastguard Worker /* Shader registers - PS. */
418*61046927SAndroid Build Coastguard Worker unsigned cu_mask_ps = info->gfx_level >= GFX10_3 ? ac_gfx103_get_cu_mask_ps(info) : ~0u;
419*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B004_SPI_SHADER_PGM_RSRC4_PS,
420*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B004_CU_EN(cu_mask_ps >> 16), /* CUs 16-31 */
421*61046927SAndroid Build Coastguard Worker C_00B004_CU_EN, 16, info));
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker /* Shader registers - HS. */
424*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B404_SPI_SHADER_PGM_RSRC4_HS,
425*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B404_CU_EN(0xffff), /* CUs 16-31 */
426*61046927SAndroid Build Coastguard Worker C_00B404_CU_EN, 16, info));
427*61046927SAndroid Build Coastguard Worker }
428*61046927SAndroid Build Coastguard Worker
429*61046927SAndroid Build Coastguard Worker /* Shader registers - GS. */
430*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2C8_SPI_SHADER_USER_ACCUM_ESGS_0, 0);
431*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2CC_SPI_SHADER_USER_ACCUM_ESGS_1, 0);
432*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2D0_SPI_SHADER_USER_ACCUM_ESGS_2, 0);
433*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2D4_SPI_SHADER_USER_ACCUM_ESGS_3, 0);
434*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B324_SPI_SHADER_PGM_HI_ES,
435*61046927SAndroid Build Coastguard Worker S_00B324_MEM_BASE(info->address32_hi >> 8));
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B41C_SPI_SHADER_PGM_RSRC3_HS,
438*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B41C_CU_EN(0xffff) | S_00B41C_WAVE_LIMIT(0x3F),
439*61046927SAndroid Build Coastguard Worker C_00B41C_CU_EN, 0, info));
440*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4C8_SPI_SHADER_USER_ACCUM_LSHS_0, 0);
441*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4CC_SPI_SHADER_USER_ACCUM_LSHS_1, 0);
442*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4D0_SPI_SHADER_USER_ACCUM_LSHS_2, 0);
443*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4D4_SPI_SHADER_USER_ACCUM_LSHS_3, 0);
444*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B524_SPI_SHADER_PGM_HI_LS,
445*61046927SAndroid Build Coastguard Worker S_00B524_MEM_BASE(info->address32_hi >> 8));
446*61046927SAndroid Build Coastguard Worker
447*61046927SAndroid Build Coastguard Worker /* Context registers. */
448*61046927SAndroid Build Coastguard Worker if (info->gfx_level < GFX11) {
449*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028038_DB_DFSM_CONTROL, S_028038_PUNCHOUT_MODE(V_028038_FORCE_OFF));
450*61046927SAndroid Build Coastguard Worker }
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02807C_DB_RMI_L2_CACHE_CONTROL,
453*61046927SAndroid Build Coastguard Worker S_02807C_Z_WR_POLICY(zs_write_policy) |
454*61046927SAndroid Build Coastguard Worker S_02807C_S_WR_POLICY(zs_write_policy) |
455*61046927SAndroid Build Coastguard Worker S_02807C_HTILE_WR_POLICY(meta_write_policy) |
456*61046927SAndroid Build Coastguard Worker S_02807C_ZPCPSD_WR_POLICY(V_02807C_CACHE_STREAM) | /* occlusion query writes */
457*61046927SAndroid Build Coastguard Worker S_02807C_Z_RD_POLICY(zs_read_policy) |
458*61046927SAndroid Build Coastguard Worker S_02807C_S_RD_POLICY(zs_read_policy) |
459*61046927SAndroid Build Coastguard Worker S_02807C_HTILE_RD_POLICY(meta_read_policy));
460*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028080_TA_BC_BASE_ADDR, state->border_color_va >> 8);
461*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028084_TA_BC_BASE_ADDR_HI, S_028084_ADDRESS(state->border_color_va >> 40));
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028410_CB_RMI_GL2_CACHE_CONTROL,
464*61046927SAndroid Build Coastguard Worker (info->gfx_level >= GFX11 ?
465*61046927SAndroid Build Coastguard Worker S_028410_COLOR_WR_POLICY_GFX11(color_write_policy) |
466*61046927SAndroid Build Coastguard Worker S_028410_COLOR_RD_POLICY(color_read_policy) |
467*61046927SAndroid Build Coastguard Worker S_028410_DCC_WR_POLICY_GFX11(meta_write_policy) |
468*61046927SAndroid Build Coastguard Worker S_028410_DCC_RD_POLICY(meta_read_policy)
469*61046927SAndroid Build Coastguard Worker :
470*61046927SAndroid Build Coastguard Worker S_028410_COLOR_WR_POLICY_GFX10(color_write_policy) |
471*61046927SAndroid Build Coastguard Worker S_028410_COLOR_RD_POLICY(color_read_policy)) |
472*61046927SAndroid Build Coastguard Worker S_028410_FMASK_WR_POLICY(color_write_policy) |
473*61046927SAndroid Build Coastguard Worker S_028410_FMASK_RD_POLICY(color_read_policy) |
474*61046927SAndroid Build Coastguard Worker S_028410_CMASK_WR_POLICY(meta_write_policy) |
475*61046927SAndroid Build Coastguard Worker S_028410_CMASK_RD_POLICY(meta_read_policy) |
476*61046927SAndroid Build Coastguard Worker S_028410_DCC_WR_POLICY_GFX10(meta_write_policy) |
477*61046927SAndroid Build Coastguard Worker S_028410_DCC_RD_POLICY(meta_read_policy));
478*61046927SAndroid Build Coastguard Worker
479*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX10_3)
480*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028750_SX_PS_DOWNCONVERT_CONTROL, 0xff);
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker /* If any sample location uses the -8 coordinate, the EXCLUSION fields should be set to 0. */
483*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02882C_PA_SU_PRIM_FILTER_CNTL,
484*61046927SAndroid Build Coastguard Worker S_02882C_XMAX_RIGHT_EXCLUSION(1) |
485*61046927SAndroid Build Coastguard Worker S_02882C_YMAX_BOTTOM_EXCLUSION(1));
486*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028830_PA_SU_SMALL_PRIM_FILTER_CNTL,
487*61046927SAndroid Build Coastguard Worker S_028830_SMALL_PRIM_FILTER_ENABLE(1));
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, fui(64));
490*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AAC_VGT_ESGS_RING_ITEMSIZE, 1);
491*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028B50_VGT_TESS_DISTRIBUTION,
492*61046927SAndroid Build Coastguard Worker info->gfx_level >= GFX11 ?
493*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_ISOLINE(128) |
494*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_TRI(128) |
495*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_QUAD(128) |
496*61046927SAndroid Build Coastguard Worker S_028B50_DONUT_SPLIT_GFX9(24) |
497*61046927SAndroid Build Coastguard Worker S_028B50_TRAP_SPLIT(6)
498*61046927SAndroid Build Coastguard Worker :
499*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_ISOLINE(12) |
500*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_TRI(30) |
501*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_QUAD(24) |
502*61046927SAndroid Build Coastguard Worker S_028B50_DONUT_SPLIT_GFX9(24) |
503*61046927SAndroid Build Coastguard Worker S_028B50_TRAP_SPLIT(6));
504*61046927SAndroid Build Coastguard Worker
505*61046927SAndroid Build Coastguard Worker /* GFX11+ shouldn't subtract 1 from pbb_max_alloc_count. */
506*61046927SAndroid Build Coastguard Worker unsigned gfx10_one = info->gfx_level < GFX11;
507*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C48_PA_SC_BINNER_CNTL_1,
508*61046927SAndroid Build Coastguard Worker S_028C48_MAX_ALLOC_COUNT(info->pbb_max_alloc_count - gfx10_one) |
509*61046927SAndroid Build Coastguard Worker S_028C48_MAX_PRIM_PER_BATCH(1023));
510*61046927SAndroid Build Coastguard Worker
511*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX11_5)
512*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C54_PA_SC_BINNER_CNTL_2,
513*61046927SAndroid Build Coastguard Worker S_028C54_ENABLE_PING_PONG_BIN_ORDER(1));
514*61046927SAndroid Build Coastguard Worker
515*61046927SAndroid Build Coastguard Worker /* Break up a pixel wave if it contains deallocs for more than
516*61046927SAndroid Build Coastguard Worker * half the parameter cache.
517*61046927SAndroid Build Coastguard Worker *
518*61046927SAndroid Build Coastguard Worker * To avoid a deadlock where pixel waves aren't launched
519*61046927SAndroid Build Coastguard Worker * because they're waiting for more pixels while the frontend
520*61046927SAndroid Build Coastguard Worker * is stuck waiting for PC space, the maximum allowed value is
521*61046927SAndroid Build Coastguard Worker * the size of the PC minus the largest possible allocation for
522*61046927SAndroid Build Coastguard Worker * a single primitive shader subgroup.
523*61046927SAndroid Build Coastguard Worker */
524*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C50_PA_SC_NGG_MODE_CNTL,
525*61046927SAndroid Build Coastguard Worker S_028C50_MAX_DEALLOCS_IN_WAVE(info->gfx_level >= GFX11 ? 16 : 512));
526*61046927SAndroid Build Coastguard Worker if (info->gfx_level < GFX11)
527*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C58_VGT_VERTEX_REUSE_BLOCK_CNTL, 14); /* Reuse for legacy (non-NGG) only. */
528*61046927SAndroid Build Coastguard Worker
529*61046927SAndroid Build Coastguard Worker /* Uconfig registers. */
530*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030924_GE_MIN_VTX_INDX, 0);
531*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030928_GE_INDX_OFFSET, 0);
532*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX11) {
533*61046927SAndroid Build Coastguard Worker /* This is changed by draws for indexed draws, but we need to set DISABLE_FOR_AUTO_INDEX
534*61046927SAndroid Build Coastguard Worker * here, which disables primitive restart for all non-indexed draws, so that those draws
535*61046927SAndroid Build Coastguard Worker * won't have to set this state.
536*61046927SAndroid Build Coastguard Worker */
537*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_03092C_GE_MULTI_PRIM_IB_RESET_EN, S_03092C_DISABLE_FOR_AUTO_INDEX(1));
538*61046927SAndroid Build Coastguard Worker }
539*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030964_GE_MAX_VTX_INDX, ~0);
540*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030968_VGT_INSTANCE_BASE_ID, 0);
541*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_03097C_GE_STEREO_CNTL, 0);
542*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030988_GE_USER_VGPR_EN, 0);
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030A00_PA_SU_LINE_STIPPLE_VALUE, 0);
545*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030A04_PA_SC_LINE_STIPPLE_STATE, 0);
546*61046927SAndroid Build Coastguard Worker
547*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX11) {
548*61046927SAndroid Build Coastguard Worker uint64_t rb_mask = BITFIELD64_MASK(info->max_render_backends);
549*61046927SAndroid Build Coastguard Worker
550*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, PKT3(PKT3_EVENT_WRITE, 2, 0));
551*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, EVENT_TYPE(V_028A90_PIXEL_PIPE_STAT_CONTROL) | EVENT_INDEX(1));
552*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, PIXEL_PIPE_STATE_CNTL_COUNTER_ID(0) |
553*61046927SAndroid Build Coastguard Worker PIXEL_PIPE_STATE_CNTL_STRIDE(2) |
554*61046927SAndroid Build Coastguard Worker PIXEL_PIPE_STATE_CNTL_INSTANCE_EN_LO(rb_mask));
555*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, PIXEL_PIPE_STATE_CNTL_INSTANCE_EN_HI(rb_mask));
556*61046927SAndroid Build Coastguard Worker }
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker static void
gfx12_init_graphics_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)560*61046927SAndroid Build Coastguard Worker gfx12_init_graphics_preamble_state(const struct ac_preamble_state *state,
561*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
562*61046927SAndroid Build Coastguard Worker {
563*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
564*61046927SAndroid Build Coastguard Worker unsigned color_write_policy, color_read_policy;
565*61046927SAndroid Build Coastguard Worker enum gfx12_store_temporal_hint color_write_temporal_hint, zs_write_temporal_hint;
566*61046927SAndroid Build Coastguard Worker enum gfx12_load_temporal_hint color_read_temporal_hint, zs_read_temporal_hint;
567*61046927SAndroid Build Coastguard Worker
568*61046927SAndroid Build Coastguard Worker if (state->gfx10.cache_rb_gl2) {
569*61046927SAndroid Build Coastguard Worker color_write_policy = V_028410_CACHE_LRU_WR;
570*61046927SAndroid Build Coastguard Worker color_read_policy = V_028410_CACHE_LRU_RD;
571*61046927SAndroid Build Coastguard Worker color_write_temporal_hint = gfx12_store_regular_temporal;
572*61046927SAndroid Build Coastguard Worker color_read_temporal_hint = gfx12_load_regular_temporal;
573*61046927SAndroid Build Coastguard Worker zs_write_temporal_hint = gfx12_store_regular_temporal;
574*61046927SAndroid Build Coastguard Worker zs_read_temporal_hint = gfx12_load_regular_temporal;
575*61046927SAndroid Build Coastguard Worker } else {
576*61046927SAndroid Build Coastguard Worker color_write_policy = V_028410_CACHE_STREAM;
577*61046927SAndroid Build Coastguard Worker color_read_policy = V_02807C_CACHE_NOA_GFX11;
578*61046927SAndroid Build Coastguard Worker color_write_temporal_hint = gfx12_store_near_non_temporal_far_regular_temporal;
579*61046927SAndroid Build Coastguard Worker color_read_temporal_hint = gfx12_load_near_non_temporal_far_regular_temporal;
580*61046927SAndroid Build Coastguard Worker zs_write_temporal_hint = gfx12_store_near_non_temporal_far_regular_temporal;
581*61046927SAndroid Build Coastguard Worker zs_read_temporal_hint = gfx12_load_near_non_temporal_far_regular_temporal;
582*61046927SAndroid Build Coastguard Worker }
583*61046927SAndroid Build Coastguard Worker
584*61046927SAndroid Build Coastguard Worker /* Shader registers - PS */
585*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B018_SPI_SHADER_PGM_RSRC3_PS,
586*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(S_00B018_CU_EN(0xffff),
587*61046927SAndroid Build Coastguard Worker C_00B018_CU_EN, 0, info));
588*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0C0_SPI_SHADER_REQ_CTRL_PS,
589*61046927SAndroid Build Coastguard Worker S_00B0C0_SOFT_GROUPING_EN(1) |
590*61046927SAndroid Build Coastguard Worker S_00B0C0_NUMBER_OF_REQUESTS_PER_CU(4 - 1));
591*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0C8_SPI_SHADER_USER_ACCUM_PS_0, 0);
592*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0CC_SPI_SHADER_USER_ACCUM_PS_1, 0);
593*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0D0_SPI_SHADER_USER_ACCUM_PS_2, 0);
594*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B0D4_SPI_SHADER_USER_ACCUM_PS_3, 0);
595*61046927SAndroid Build Coastguard Worker
596*61046927SAndroid Build Coastguard Worker /* Shader registers - GS */
597*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B218_SPI_SHADER_PGM_HI_ES,
598*61046927SAndroid Build Coastguard Worker S_00B324_MEM_BASE(info->address32_hi >> 8));
599*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B21C_SPI_SHADER_PGM_RSRC3_GS,
600*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(0xfffffdfd, 0, 0, info));
601*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2C8_SPI_SHADER_USER_ACCUM_ESGS_0, 0);
602*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2CC_SPI_SHADER_USER_ACCUM_ESGS_1, 0);
603*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2D0_SPI_SHADER_USER_ACCUM_ESGS_2, 0);
604*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B2D4_SPI_SHADER_USER_ACCUM_ESGS_3, 0);
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker /* Shader registers - HS */
607*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B418_SPI_SHADER_PGM_HI_LS,
608*61046927SAndroid Build Coastguard Worker S_00B524_MEM_BASE(info->address32_hi >> 8));
609*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg_idx3(pm4, R_00B41C_SPI_SHADER_PGM_RSRC3_HS,
610*61046927SAndroid Build Coastguard Worker ac_apply_cu_en(0xffffffff, 0, 0, info));
611*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4C8_SPI_SHADER_USER_ACCUM_LSHS_0, 0);
612*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4CC_SPI_SHADER_USER_ACCUM_LSHS_1, 0);
613*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4D0_SPI_SHADER_USER_ACCUM_LSHS_2, 0);
614*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_00B4D4_SPI_SHADER_USER_ACCUM_LSHS_3, 0);
615*61046927SAndroid Build Coastguard Worker
616*61046927SAndroid Build Coastguard Worker /* Context registers */
617*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, S_02800C_FORCE_STENCIL_READ(1));
618*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028040_DB_GL1_INTERFACE_CONTROL, 0);
619*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028048_DB_MEM_TEMPORAL,
620*61046927SAndroid Build Coastguard Worker S_028048_Z_TEMPORAL_READ(zs_read_temporal_hint) |
621*61046927SAndroid Build Coastguard Worker S_028048_Z_TEMPORAL_WRITE(zs_write_temporal_hint) |
622*61046927SAndroid Build Coastguard Worker S_028048_STENCIL_TEMPORAL_READ(zs_read_temporal_hint) |
623*61046927SAndroid Build Coastguard Worker S_028048_STENCIL_TEMPORAL_WRITE(zs_write_temporal_hint) |
624*61046927SAndroid Build Coastguard Worker S_028048_OCCLUSION_TEMPORAL_WRITE(gfx12_store_regular_temporal));
625*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028064_DB_VIEWPORT_CONTROL, 0);
626*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028068_DB_SPI_VRS_CENTER_LOCATION, 0);
627*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028080_TA_BC_BASE_ADDR, state->border_color_va >> 8);
628*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028084_TA_BC_BASE_ADDR_HI, S_028084_ADDRESS(state->border_color_va >> 40));
629*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02808C_DB_STENCIL_OPVAL, S_02808C_OPVAL(1) | S_02808C_OPVAL_BF(1));
630*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0280F8_SC_MEM_TEMPORAL,
631*61046927SAndroid Build Coastguard Worker S_0280F8_VRS_TEMPORAL_READ(gfx12_load_regular_temporal) |
632*61046927SAndroid Build Coastguard Worker S_0280F8_VRS_TEMPORAL_WRITE(gfx12_store_regular_temporal) |
633*61046927SAndroid Build Coastguard Worker S_0280F8_HIZ_TEMPORAL_READ(gfx12_load_regular_temporal) |
634*61046927SAndroid Build Coastguard Worker S_0280F8_HIZ_TEMPORAL_WRITE(gfx12_store_regular_temporal) |
635*61046927SAndroid Build Coastguard Worker S_0280F8_HIS_TEMPORAL_READ(gfx12_load_regular_temporal) |
636*61046927SAndroid Build Coastguard Worker S_0280F8_HIS_TEMPORAL_WRITE(gfx12_store_regular_temporal));
637*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0280FC_SC_MEM_SPEC_READ,
638*61046927SAndroid Build Coastguard Worker S_0280FC_VRS_SPECULATIVE_READ(gfx12_spec_read_force_on) |
639*61046927SAndroid Build Coastguard Worker S_0280FC_HIZ_SPECULATIVE_READ(gfx12_spec_read_force_on) |
640*61046927SAndroid Build Coastguard Worker S_0280FC_HIS_SPECULATIVE_READ(gfx12_spec_read_force_on));
641*61046927SAndroid Build Coastguard Worker
642*61046927SAndroid Build Coastguard Worker /* We don't need to initialize PA_SC_VPORT_* because we don't enable
643*61046927SAndroid Build Coastguard Worker * IMPLICIT_VPORT_SCISSOR_ENABLE, but it might be useful for Vulkan.
644*61046927SAndroid Build Coastguard Worker *
645*61046927SAndroid Build Coastguard Worker * If you set IMPLICIT_VPORT_SCISSOR_ENABLE, PA_SC_VPORT_* will take effect and allows
646*61046927SAndroid Build Coastguard Worker * setting a scissor that covers the whole viewport. If you set VPORT_SCISSOR_ENABLE,
647*61046927SAndroid Build Coastguard Worker * PA_SC_VPORT_SCISSOR_* will take effect and allows setting a user scissor. If you set
648*61046927SAndroid Build Coastguard Worker * both enable bits, the hw will use the intersection of both. It allows separating implicit
649*61046927SAndroid Build Coastguard Worker * viewport scissors from user scissors.
650*61046927SAndroid Build Coastguard Worker */
651*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028180_PA_SC_SCREEN_SCISSOR_TL, 0);
652*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028184_PA_SC_SCREEN_SCISSOR_BR,
653*61046927SAndroid Build Coastguard Worker S_028184_BR_X(65535) | S_028184_BR_Y(65535)); /* inclusive bounds */
654*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, 0);
655*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, 0);
656*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR,
657*61046927SAndroid Build Coastguard Worker S_028244_BR_X(65535) | S_028244_BR_Y(65535)); /* inclusive bounds */
658*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028358_PA_SC_SCREEN_EXTENT_CONTROL, 0);
659*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02835C_PA_SC_TILE_STEERING_OVERRIDE,
660*61046927SAndroid Build Coastguard Worker info->pa_sc_tile_steering_override);
661*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0283E0_PA_SC_VRS_INFO, 0);
662*61046927SAndroid Build Coastguard Worker
663*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028410_CB_RMI_GL2_CACHE_CONTROL,
664*61046927SAndroid Build Coastguard Worker S_028410_COLOR_WR_POLICY_GFX11(color_write_policy) |
665*61046927SAndroid Build Coastguard Worker S_028410_COLOR_RD_POLICY(color_read_policy));
666*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0286E4_SPI_BARYC_SSAA_CNTL, S_0286E4_COVERED_CENTROID_IS_CENTER(1));
667*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028750_SX_PS_DOWNCONVERT_CONTROL, 0xff);
668*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0287D4_PA_CL_POINT_X_RAD, 0);
669*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0287D8_PA_CL_POINT_Y_RAD, 0);
670*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0287DC_PA_CL_POINT_SIZE, 0);
671*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0287E0_PA_CL_POINT_CULL_RAD, 0);
672*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0);
673*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028824_PA_SU_LINE_STIPPLE_CNTL, 0);
674*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028828_PA_SU_LINE_STIPPLE_SCALE, 0);
675*61046927SAndroid Build Coastguard Worker /* If any sample location uses the -8 coordinate, the EXCLUSION fields should be set to 0. */
676*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02882C_PA_SU_PRIM_FILTER_CNTL,
677*61046927SAndroid Build Coastguard Worker S_02882C_XMAX_RIGHT_EXCLUSION(1) |
678*61046927SAndroid Build Coastguard Worker S_02882C_YMAX_BOTTOM_EXCLUSION(1));
679*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028830_PA_SU_SMALL_PRIM_FILTER_CNTL,
680*61046927SAndroid Build Coastguard Worker S_028830_SMALL_PRIM_FILTER_ENABLE(1) |
681*61046927SAndroid Build Coastguard Worker S_028830_SC_1XMSAA_COMPATIBLE_DISABLE(1) /* use sample locations even for MSAA 1x */);
682*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_02883C_PA_SU_OVER_RASTERIZATION_CNTL, 0);
683*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028840_PA_STEREO_CNTL, S_028840_STEREO_MODE(1));
684*61046927SAndroid Build Coastguard Worker
685*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, fui(64));
686*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, fui(0));
687*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A50_GE_SE_ENHANCE, 0);
688*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A70_GE_IA_ENHANCE, 0);
689*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A80_GE_WD_ENHANCE, 0);
690*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028A9C_VGT_REUSE_OFF, 0);
691*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028AA0_VGT_DRAW_PAYLOAD_CNTL, 0);
692*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028ABC_DB_HTILE_SURFACE, 0);
693*61046927SAndroid Build Coastguard Worker
694*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0);
695*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028B50_VGT_TESS_DISTRIBUTION,
696*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_ISOLINE(128) |
697*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_TRI(128) |
698*61046927SAndroid Build Coastguard Worker S_028B50_ACCUM_QUAD(128) |
699*61046927SAndroid Build Coastguard Worker S_028B50_DONUT_SPLIT_GFX9(24) |
700*61046927SAndroid Build Coastguard Worker S_028B50_TRAP_SPLIT(6));
701*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028BC0_PA_SC_HISZ_RENDER_OVERRIDE, 0);
702*61046927SAndroid Build Coastguard Worker
703*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C40_PA_SC_BINNER_OUTPUT_TIMEOUT_COUNTER, 0x800);
704*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C48_PA_SC_BINNER_CNTL_1,
705*61046927SAndroid Build Coastguard Worker S_028C48_MAX_ALLOC_COUNT(254) |
706*61046927SAndroid Build Coastguard Worker S_028C48_MAX_PRIM_PER_BATCH(511));
707*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C4C_PA_SC_BINNER_CNTL_2, S_028C4C_ENABLE_PING_PONG_BIN_ORDER(1));
708*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C50_PA_SC_NGG_MODE_CNTL, S_028C50_MAX_DEALLOCS_IN_WAVE(64));
709*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028C58_PA_SC_SHADER_CONTROL,
710*61046927SAndroid Build Coastguard Worker S_028C58_REALIGN_DQUADS_AFTER_N_WAVES(1));
711*61046927SAndroid Build Coastguard Worker
712*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 8; i++) {
713*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_028F00_CB_MEM0_INFO + i * 4,
714*61046927SAndroid Build Coastguard Worker S_028F00_TEMPORAL_READ(color_read_temporal_hint) |
715*61046927SAndroid Build Coastguard Worker S_028F00_TEMPORAL_WRITE(color_write_temporal_hint));
716*61046927SAndroid Build Coastguard Worker }
717*61046927SAndroid Build Coastguard Worker
718*61046927SAndroid Build Coastguard Worker /* Uconfig registers. */
719*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030924_GE_MIN_VTX_INDX, 0);
720*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030928_GE_INDX_OFFSET, 0);
721*61046927SAndroid Build Coastguard Worker /* This is changed by draws for indexed draws, but we need to set DISABLE_FOR_AUTO_INDEX
722*61046927SAndroid Build Coastguard Worker * here, which disables primitive restart for all non-indexed draws, so that those draws
723*61046927SAndroid Build Coastguard Worker * won't have to set this state.
724*61046927SAndroid Build Coastguard Worker */
725*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_03092C_GE_MULTI_PRIM_IB_RESET_EN, S_03092C_DISABLE_FOR_AUTO_INDEX(1));
726*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030950_GE_GS_THROTTLE,
727*61046927SAndroid Build Coastguard Worker S_030950_T0(0x1) |
728*61046927SAndroid Build Coastguard Worker S_030950_T1(0x4) |
729*61046927SAndroid Build Coastguard Worker S_030950_T2(0x3) |
730*61046927SAndroid Build Coastguard Worker S_030950_STALL_CYCLES(0x40) |
731*61046927SAndroid Build Coastguard Worker S_030950_FACTOR1(0x2) |
732*61046927SAndroid Build Coastguard Worker S_030950_FACTOR2(0x3) |
733*61046927SAndroid Build Coastguard Worker S_030950_ENABLE_THROTTLE(0) |
734*61046927SAndroid Build Coastguard Worker S_030950_NUM_INIT_GRPS(0xff));
735*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030964_GE_MAX_VTX_INDX, ~0);
736*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030968_VGT_INSTANCE_BASE_ID, 0);
737*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_03097C_GE_STEREO_CNTL, 0);
738*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030980_GE_USER_VGPR_EN, 0);
739*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_0309B4_VGT_PRIMITIVEID_RESET, 0);
740*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_03098C_GE_VRS_RATE, 0);
741*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030A00_PA_SU_LINE_STIPPLE_VALUE, 0);
742*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_030A04_PA_SC_LINE_STIPPLE_STATE, 0);
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_031128_SPI_GRP_LAUNCH_GUARANTEE_ENABLE, 0x8A4D);
745*61046927SAndroid Build Coastguard Worker ac_pm4_set_reg(pm4, R_03112C_SPI_GRP_LAUNCH_GUARANTEE_CTRL, 0x1123);
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker uint64_t rb_mask = BITFIELD64_MASK(info->max_render_backends);
748*61046927SAndroid Build Coastguard Worker
749*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, PKT3(PKT3_EVENT_WRITE, 2, 0));
750*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, EVENT_TYPE(V_028A90_PIXEL_PIPE_STAT_CONTROL) | EVENT_INDEX(1));
751*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, PIXEL_PIPE_STATE_CNTL_COUNTER_ID(0) |
752*61046927SAndroid Build Coastguard Worker PIXEL_PIPE_STATE_CNTL_STRIDE(2) |
753*61046927SAndroid Build Coastguard Worker PIXEL_PIPE_STATE_CNTL_INSTANCE_EN_LO(rb_mask));
754*61046927SAndroid Build Coastguard Worker ac_pm4_cmd_add(pm4, PIXEL_PIPE_STATE_CNTL_INSTANCE_EN_HI(rb_mask));
755*61046927SAndroid Build Coastguard Worker }
756*61046927SAndroid Build Coastguard Worker
757*61046927SAndroid Build Coastguard Worker void
ac_init_graphics_preamble_state(const struct ac_preamble_state * state,struct ac_pm4_state * pm4)758*61046927SAndroid Build Coastguard Worker ac_init_graphics_preamble_state(const struct ac_preamble_state *state,
759*61046927SAndroid Build Coastguard Worker struct ac_pm4_state *pm4)
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker const struct radeon_info *info = pm4->info;
762*61046927SAndroid Build Coastguard Worker
763*61046927SAndroid Build Coastguard Worker if (info->gfx_level >= GFX12) {
764*61046927SAndroid Build Coastguard Worker gfx12_init_graphics_preamble_state(state, pm4);
765*61046927SAndroid Build Coastguard Worker } else if (info->gfx_level >= GFX10) {
766*61046927SAndroid Build Coastguard Worker gfx10_init_graphics_preamble_state(state, pm4);
767*61046927SAndroid Build Coastguard Worker } else {
768*61046927SAndroid Build Coastguard Worker gfx6_init_graphics_preamble_state(state, pm4);
769*61046927SAndroid Build Coastguard Worker }
770*61046927SAndroid Build Coastguard Worker }
771