From 37aa92a3cd88c84b3372094b3d1a35daa36b7dd9 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 16 Aug 2022 13:07:14 -0400 Subject: [PATCH] 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 Part-of: --- src/compiler/nir/nir_gather_info.c | 53 ++++++++++++++++++++++++++++++ src/compiler/shader_info.h | 3 ++ 2 files changed, 56 insertions(+) diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index d1086d86d3e..7ac1d2afd43 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -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; diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index b8c0e8f2aa9..c0396c8c2a5 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -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.