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:

committed by
Marge Bot

parent
aaeb5bea29
commit
37aa92a3cd
@@ -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;
|
||||
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user