32
32
anv_nir_compute_push_layout(nir_shader *nir,
33
33
const struct anv_physical_device *pdevice,
34
34
bool robust_buffer_access,
35
bool fragment_dynamic,
35
36
struct brw_stage_prog_data *prog_data,
36
37
struct anv_pipeline_bind_map *map,
38
const struct anv_pipeline_push_map *push_map,
39
41
const struct brw_compiler *compiler = pdevice->compiler;
43
45
bool has_const_ubo = false;
44
46
unsigned push_start = UINT_MAX, push_end = 0;
45
nir_foreach_function(function, nir) {
49
nir_foreach_block(block, function->impl) {
47
nir_foreach_function_impl(impl, nir) {
48
nir_foreach_block(block, impl) {
50
49
nir_foreach_instr(instr, block) {
51
50
if (instr->type != nir_instr_type_intrinsic)
54
53
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
55
54
switch (intrin->intrinsic) {
56
55
case nir_intrinsic_load_ubo:
57
if (nir_src_is_const(intrin->src[0]) &&
56
if (brw_nir_ubo_surface_index_is_pushable(intrin->src[0]) &&
58
57
nir_src_is_const(intrin->src[1]))
59
58
has_const_ubo = true;
70
case nir_intrinsic_load_desc_set_address_intel: {
71
unsigned base = offsetof(struct anv_push_constants, desc_sets);
69
case nir_intrinsic_load_desc_set_address_intel:
70
case nir_intrinsic_load_desc_set_dynamic_index_intel: {
71
unsigned base = offsetof(struct anv_push_constants, desc_offsets);
72
72
push_start = MIN2(push_start, base);
73
73
push_end = MAX2(push_end, base +
74
sizeof_field(struct anv_push_constants, desc_sets));
74
sizeof_field(struct anv_push_constants, desc_offsets));
102
102
push_end = MAX2(push_end, push_reg_mask_end);
105
if (nir->info.stage == MESA_SHADER_FRAGMENT && fragment_dynamic) {
106
const uint32_t fs_msaa_flags_start =
107
offsetof(struct anv_push_constants, gfx.fs_msaa_flags);
108
const uint32_t fs_msaa_flags_end = fs_msaa_flags_start + sizeof(uint32_t);
109
push_start = MIN2(push_start, fs_msaa_flags_start);
110
push_end = MAX2(push_end, fs_msaa_flags_end);
105
113
if (nir->info.stage == MESA_SHADER_COMPUTE && devinfo->verx10 < 125) {
106
114
/* For compute shaders, we always have to have the subgroup ID. The
107
115
* back-end compiler will "helpfully" add it for us in the last push
137
145
if (has_push_intrinsic) {
138
nir_foreach_function(function, nir) {
142
nir_builder build, *b = &build;
143
nir_builder_init(b, function->impl);
145
nir_foreach_block(block, function->impl) {
146
nir_foreach_function_impl(impl, nir) {
147
nir_builder build = nir_builder_create(impl);
148
nir_builder *b = &build;
150
nir_foreach_block(block, impl) {
146
151
nir_foreach_instr_safe(instr, block) {
147
152
if (instr->type != nir_instr_type_intrinsic)
168
173
case nir_intrinsic_load_desc_set_address_intel: {
169
b->cursor = nir_before_instr(&intrin->instr);
170
nir_ssa_def *pc_load = nir_load_uniform(b, 1, 64,
171
nir_imul_imm(b, intrin->src[0].ssa, sizeof(uint64_t)),
172
.base = offsetof(struct anv_push_constants, desc_sets),
173
.range = sizeof_field(struct anv_push_constants, desc_sets),
174
.dest_type = nir_type_uint64);
174
assert(brw_shader_stage_requires_bindless_resources(nir->info.stage));
175
b->cursor = nir_before_instr(&intrin->instr);
176
nir_ssa_def *pc_load = nir_load_uniform(b, 1, 32,
177
nir_imul_imm(b, intrin->src[0].ssa, sizeof(uint32_t)),
178
.base = offsetof(struct anv_push_constants, desc_offsets),
179
.range = sizeof_field(struct anv_push_constants, desc_offsets),
180
.dest_type = nir_type_uint32);
181
pc_load = nir_iand_imm(b, pc_load, ANV_DESCRIPTOR_SET_OFFSET_MASK);
182
nir_ssa_def *desc_addr =
183
nir_pack_64_2x32_split(
185
nir_load_reloc_const_intel(
186
b, BRW_SHADER_RELOC_DESCRIPTORS_ADDR_HIGH));
187
nir_ssa_def_rewrite_uses(&intrin->dest.ssa, desc_addr);
191
case nir_intrinsic_load_desc_set_dynamic_index_intel: {
192
b->cursor = nir_before_instr(&intrin->instr);
193
nir_ssa_def *pc_load = nir_load_uniform(b, 1, 32,
194
nir_imul_imm(b, intrin->src[0].ssa, sizeof(uint32_t)),
195
.base = offsetof(struct anv_push_constants, desc_offsets),
196
.range = sizeof_field(struct anv_push_constants, desc_offsets),
197
.dest_type = nir_type_uint32);
198
pc_load = nir_iand_imm(
199
b, pc_load, ANV_DESCRIPTOR_SET_DYNAMIC_INDEX_MASK);
175
200
nir_ssa_def_rewrite_uses(&intrin->dest.ssa, pc_load);
223
248
if (ubo_range->length == 0)
226
if (n >= 4 || (n == 3 && compiler->constant_buffer_0_is_relative)) {
227
252
memset(ubo_range, 0, sizeof(*ubo_range));
256
assert(ubo_range->block < push_map->block_count);
231
257
const struct anv_pipeline_binding *binding =
232
&map->surface_to_descriptor[ubo_range->block];
258
&push_map->block_to_descriptor[ubo_range->block];
234
260
map->push_ranges[n++] = (struct anv_push_range) {
235
261
.set = binding->set,
259
285
map->push_ranges[0] = push_constant_range;
288
if (nir->info.stage == MESA_SHADER_FRAGMENT && fragment_dynamic) {
289
struct brw_wm_prog_data *wm_prog_data =
290
container_of(prog_data, struct brw_wm_prog_data, base);
292
const uint32_t fs_msaa_flags_offset =
293
offsetof(struct anv_push_constants, gfx.fs_msaa_flags);
294
assert(fs_msaa_flags_offset >= push_start);
295
wm_prog_data->msaa_flags_param =
296
(fs_msaa_flags_offset - push_start) / 4;
300
fprintf(stderr, "stage=%s push ranges:\n", gl_shader_stage_name(nir->info.stage));
301
for (unsigned i = 0; i < ARRAY_SIZE(map->push_ranges); i++)
302
fprintf(stderr, " range%i: %03u-%03u set=%u index=%u\n", i,
303
map->push_ranges[i].start,
304
map->push_ranges[i].length,
305
map->push_ranges[i].set,
306
map->push_ranges[i].index);
262
309
/* Now that we're done computing the push constant portion of the
263
310
* bind map, hash it. This lets us quickly determine if the actual
264
311
* mapping has changed and not just a no-op pipeline change.