radv/ac: mark used descriptor sets in shader info.
authorDave Airlie <airlied@redhat.com>
Mon, 17 Apr 2017 19:44:46 +0000 (05:44 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 18 Apr 2017 23:00:43 +0000 (09:00 +1000)
This pre calculates the used descriptor sets.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_shader_info.c
src/amd/common/ac_shader_info.h

index 79c13767f67ec60cf6ea00a6b6ae43a1f1a93aa9..33f68550bbcc22fa26a43eaae5dbef2069a5553b 100644 (file)
 #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)
 {
@@ -36,11 +42,36 @@ 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)
 {
@@ -49,6 +80,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;
                }
index 32153fb67fce0410063570ace4ae6f25d8c7c905..3a3d2c471a447aa954e5d60eff78db1a7e2bf632 100644 (file)
@@ -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_draw_id;