nir: add uses_bindless flag for shader_info

this is cumbersome to detect, so detect it here

the flag denotes the use of either bindless texture operations
or shader variables such that drivers can infer the use of bindless
descriptor management functionality

Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18088>
This commit is contained in:
Mike Blumenkrantz
2022-08-16 13:07:14 -04:00
committed by Marge Bot
parent aaeb5bea29
commit 37aa92a3cd
2 changed files with 56 additions and 0 deletions

View File

@@ -463,6 +463,44 @@ nir_intrinsic_writes_external_memory(const nir_intrinsic_instr *instr)
}
}
static bool
intrinsic_is_bindless(nir_intrinsic_instr *instr)
{
switch (instr->intrinsic) {
case nir_intrinsic_bindless_image_atomic_add:
case nir_intrinsic_bindless_image_atomic_and:
case nir_intrinsic_bindless_image_atomic_comp_swap:
case nir_intrinsic_bindless_image_atomic_dec_wrap:
case nir_intrinsic_bindless_image_atomic_exchange:
case nir_intrinsic_bindless_image_atomic_fadd:
case nir_intrinsic_bindless_image_atomic_fmax:
case nir_intrinsic_bindless_image_atomic_fmin:
case nir_intrinsic_bindless_image_atomic_imax:
case nir_intrinsic_bindless_image_atomic_imin:
case nir_intrinsic_bindless_image_atomic_inc_wrap:
case nir_intrinsic_bindless_image_atomic_or:
case nir_intrinsic_bindless_image_atomic_umax:
case nir_intrinsic_bindless_image_atomic_umin:
case nir_intrinsic_bindless_image_atomic_xor:
case nir_intrinsic_bindless_image_descriptor_amd:
case nir_intrinsic_bindless_image_format:
case nir_intrinsic_bindless_image_load:
case nir_intrinsic_bindless_image_load_raw_intel:
case nir_intrinsic_bindless_image_order:
case nir_intrinsic_bindless_image_samples:
case nir_intrinsic_bindless_image_samples_identical:
case nir_intrinsic_bindless_image_size:
case nir_intrinsic_bindless_image_sparse_load:
case nir_intrinsic_bindless_image_store:
case nir_intrinsic_bindless_image_store_raw_intel:
case nir_intrinsic_bindless_resource_ir3:
return true;
default:
break;
}
return false;
}
static void
gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
void *dead_ctx)
@@ -834,6 +872,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
break;
default:
shader->info.uses_bindless |= intrinsic_is_bindless(instr);
if (nir_intrinsic_writes_external_memory(instr))
shader->info.writes_memory = true;
@@ -855,6 +894,10 @@ gather_tex_info(nir_tex_instr *instr, nir_shader *shader)
nir_tex_instr_has_implicit_derivative(instr))
shader->info.fs.needs_quad_helper_invocations = true;
if (nir_tex_instr_src_index(instr, nir_tex_src_texture_handle) != -1 ||
nir_tex_instr_src_index(instr, nir_tex_src_sampler_handle) != -1)
shader->info.uses_bindless = true;
switch (instr->op) {
case nir_texop_tg4:
shader->info.uses_texture_gather = true;
@@ -945,8 +988,11 @@ nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint)
shader->info.num_images = 0;
shader->info.bit_sizes_float = 0;
shader->info.bit_sizes_int = 0;
shader->info.uses_bindless = false;
nir_foreach_variable_with_modes(var, shader, nir_var_image | nir_var_uniform) {
if (var->data.bindless)
shader->info.uses_bindless = true;
/* Bindless textures and images don't use non-bindless slots.
* Interface blocks imply inputs, outputs, UBO, or SSBO, which can only
* mean bindless.
@@ -958,6 +1004,13 @@ nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint)
shader->info.num_images += glsl_type_get_image_count(var->type);
}
/* these types may not initially be marked bindless */
nir_foreach_variable_with_modes(var, shader, nir_var_shader_in | nir_var_shader_out) {
const struct glsl_type *type = glsl_without_array(var->type);
if (glsl_type_is_sampler(type) || glsl_type_is_image(type))
shader->info.uses_bindless = true;
}
shader->info.inputs_read = 0;
shader->info.outputs_written = 0;
shader->info.outputs_read = 0;

View File

@@ -298,6 +298,9 @@ typedef struct shader_info {
bool uses_control_barrier : 1;
bool uses_memory_barrier : 1;
/* Whether ARB_bindless_texture ops or variables are used */
bool uses_bindless : 1;
/**
* Shared memory types have explicit layout set. Used for
* SPV_KHR_workgroup_storage_explicit_layout.