diff options
author | Dave Airlie <[email protected]> | 2017-04-18 05:44:46 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-04-19 09:00:43 +1000 |
commit | 4087eaecd081856ace5c4a161a6dd3ea69194650 (patch) | |
tree | ed42bf3d325ef58f589179acfed353cf6dff31cf /src/amd | |
parent | 0b62669c8d8f01c68e22e0ef380cdd606c9045dc (diff) |
radv/ac: mark used descriptor sets in shader info.
This pre calculates the used descriptor sets.
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/common/ac_shader_info.c | 34 | ||||
-rw-r--r-- | src/amd/common/ac_shader_info.h | 1 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/amd/common/ac_shader_info.c b/src/amd/common/ac_shader_info.c index 79c13767f67..33f68550bbc 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) { @@ -36,12 +42,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) { @@ -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; } diff --git a/src/amd/common/ac_shader_info.h b/src/amd/common/ac_shader_info.h index 32153fb67fc..3a3d2c471a4 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_draw_id; |