From: Dave Airlie <airl...@redhat.com>

This pre calculates the used descriptor sets.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/amd/common/ac_shader_info.c | 34 ++++++++++++++++++++++++++++++++++
 src/amd/common/ac_shader_info.h |  1 +
 2 files changed, 35 insertions(+)

diff --git a/src/amd/common/ac_shader_info.c b/src/amd/common/ac_shader_info.c
index b319bb1..e1732f2 100644
--- a/src/amd/common/ac_shader_info.c
+++ b/src/amd/common/ac_shader_info.c
@@ -23,6 +23,12 @@
 #include "nir.h"
 #include "ac_shader_info.h"
 #include "ac_nir_to_llvm.h"
+
+static void mark_sampler_desc(nir_variable *var, struct ac_shader_info *info)
+{
+       info->desc_set_used_mask = (1 << var->data.descriptor_set);
+}
+
 static void
 gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info)
 {
@@ -40,12 +46,37 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, struct 
ac_shader_info *info)
        case nir_intrinsic_load_num_work_groups:
                info->cs.grid_components_used = instr->num_components;
                break;
+       case nir_intrinsic_vulkan_resource_index:
+               info->desc_set_used_mask |= (1 << 
nir_intrinsic_desc_set(instr));
+               break;
+       case nir_intrinsic_image_load:
+       case nir_intrinsic_image_store:
+       case nir_intrinsic_image_atomic_add:
+       case nir_intrinsic_image_atomic_min:
+       case nir_intrinsic_image_atomic_max:
+       case nir_intrinsic_image_atomic_and:
+       case nir_intrinsic_image_atomic_or:
+       case nir_intrinsic_image_atomic_xor:
+       case nir_intrinsic_image_atomic_exchange:
+       case nir_intrinsic_image_atomic_comp_swap:
+       case nir_intrinsic_image_size:
+               mark_sampler_desc(instr->variables[0]->var, info);
+               break;
        default:
                break;
        }
 }
 
 static void
+gather_tex_info(nir_tex_instr *instr, struct ac_shader_info *info)
+{
+       if (instr->sampler)
+               mark_sampler_desc(instr->sampler->var, info);
+       if (instr->texture)
+               mark_sampler_desc(instr->texture->var, info);
+}
+
+static void
 gather_info_block(nir_block *block, struct ac_shader_info *info)
 {
        nir_foreach_instr(instr, block) {
@@ -53,6 +84,9 @@ gather_info_block(nir_block *block, struct ac_shader_info 
*info)
                case nir_instr_type_intrinsic:
                        gather_intrinsic_info(nir_instr_as_intrinsic(instr), 
info);
                        break;
+               case nir_instr_type_tex:
+                       gather_tex_info(nir_instr_as_tex(instr), info);
+                       break;
                default:
                        break;
                }
diff --git a/src/amd/common/ac_shader_info.h b/src/amd/common/ac_shader_info.h
index 3d644ab..ddfa175 100644
--- a/src/amd/common/ac_shader_info.h
+++ b/src/amd/common/ac_shader_info.h
@@ -29,6 +29,7 @@ struct ac_nir_compiler_options;
 
 struct ac_shader_info {
        bool needs_push_constants;
+       uint32_t desc_set_used_mask;
        struct {
                bool has_vertex_buffers; /* needs vertex buffers and base/start 
*/
                bool needs_base_vertex_start_instance;
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to