aco: use binding chasing helpers

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7291>
This commit is contained in:
Rhys Perry 2020-10-23 11:54:08 +01:00 committed by Marge Bot
parent e732bea536
commit 5cf41814cd
2 changed files with 19 additions and 35 deletions

View file

@ -5215,13 +5215,11 @@ void visit_load_ubo(isel_context *ctx, nir_intrinsic_instr *instr)
Builder bld(ctx->program, ctx->block);
nir_alu_instr* mov_instr = nir_instr_as_alu(instr->src[0].ssa->parent_instr);
nir_intrinsic_instr* idx_instr = nir_instr_as_intrinsic(mov_instr->src[0].src.ssa->parent_instr);
unsigned desc_set = nir_intrinsic_desc_set(idx_instr);
unsigned binding = nir_intrinsic_binding(idx_instr);
radv_descriptor_set_layout *layout = ctx->options->layout->set[desc_set].layout;
nir_binding binding = nir_chase_binding(instr->src[0]);
assert(binding.success);
radv_descriptor_set_layout *layout = ctx->options->layout->set[binding.desc_set].layout;
if (layout->binding[binding].type == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) {
if (layout->binding[binding.binding].type == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) {
uint32_t desc_type = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |

View file

@ -133,48 +133,34 @@ inline Temp get_arg(isel_context *ctx, struct ac_arg arg)
}
inline void get_buffer_resource_flags(isel_context *ctx, nir_ssa_def *def, unsigned access,
uint8_t **flags, uint32_t *count)
uint8_t **flags, uint32_t *count)
{
int desc_set = -1;
unsigned binding = 0;
nir_binding binding = {0};
/* global resources (def=NULL) are considered aliasing with all other buffers and
* buffer images */
// TODO: only merge flags of resources which can really alias.
if (def)
binding = nir_chase_binding(nir_src_for_ssa(def));
if (!def) {
/* global resources are considered aliasing with all other buffers and
* buffer images */
// TODO: only merge flags of resources which can really alias.
} else if (def->parent_instr->type == nir_instr_type_alu) {
nir_alu_instr* mov_instr = nir_instr_as_alu(def->parent_instr);
if (mov_instr->op == nir_op_mov && mov_instr->src[0].swizzle[0] == 0 &&
mov_instr->src[0].src.ssa->parent_instr->type == nir_instr_type_intrinsic) {
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(mov_instr->src[0].src.ssa->parent_instr);
if (intrin->intrinsic == nir_intrinsic_vulkan_resource_index) {
desc_set = nir_intrinsic_desc_set(intrin);
binding = nir_intrinsic_binding(intrin);
}
}
} else if (def->parent_instr->type == nir_instr_type_deref) {
nir_deref_instr *deref = nir_instr_as_deref(def->parent_instr);
assert(deref->type->is_image());
if (deref->type->sampler_dimensionality != GLSL_SAMPLER_DIM_BUF) {
if (binding.var) {
const glsl_type *type = binding.var->type->without_array();
assert(type->is_image());
if (type->sampler_dimensionality != GLSL_SAMPLER_DIM_BUF) {
*flags = NULL;
*count = 0;
return;
}
nir_variable *var = nir_deref_instr_get_variable(deref);
desc_set = var->data.descriptor_set;
binding = var->data.binding;
}
if (desc_set < 0) {
if (!binding.success) {
*flags = ctx->buffer_resource_flags.data();
*count = ctx->buffer_resource_flags.size();
return;
}
unsigned set_offset = ctx->resource_flag_offsets[desc_set];
unsigned set_offset = ctx->resource_flag_offsets[binding.desc_set];
if (!(ctx->buffer_resource_flags[set_offset + binding] & buffer_is_restrict)) {
if (!(ctx->buffer_resource_flags[set_offset + binding.binding] & buffer_is_restrict)) {
/* Non-restrict buffers alias only with other non-restrict buffers.
* We reserve flags[0] for these. */
*flags = ctx->buffer_resource_flags.data();
@ -182,7 +168,7 @@ inline void get_buffer_resource_flags(isel_context *ctx, nir_ssa_def *def, unsig
return;
}
*flags = ctx->buffer_resource_flags.data() + set_offset + binding;
*flags = ctx->buffer_resource_flags.data() + set_offset + binding.binding;
*count = 1;
}