[Mesa-dev] [PATCH 2/5] anv/apply_pipeline_layout: Add to the bind map instead of replacing it
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Fri Aug 17 15:20:25 UTC 2018
On 08/08/18 09:12, Jason Ekstrand wrote:
> This commit makes three changes. One is to only walk the descriptors once
> and set bind map sizes at the same time as filling out the entries. The
> second is to make the pass additive so that we can put stuff in the bind
> map before applying the pipeline layout. Third, we switch to using
> designated initializers.
Nice cleanup :)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> ---
> src/intel/vulkan/anv_descriptor_set.c | 13 ----
> .../vulkan/anv_nir_apply_pipeline_layout.c | 64 ++++++-------------
> src/intel/vulkan/anv_private.h | 3 -
> 3 files changed, 21 insertions(+), 59 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c
> index 66ed28292b0..2bd1d86f4d4 100644
> --- a/src/intel/vulkan/anv_descriptor_set.c
> +++ b/src/intel/vulkan/anv_descriptor_set.c
> @@ -491,19 +491,6 @@ anv_descriptor_set_layout_size(const struct anv_descriptor_set_layout *layout)
> layout->buffer_count * sizeof(struct anv_buffer_view);
> }
>
> -size_t
> -anv_descriptor_set_binding_layout_get_hw_size(const struct anv_descriptor_set_binding_layout *binding)
> -{
> - if (!binding->immutable_samplers)
> - return binding->array_size;
> -
> - uint32_t total_plane_count = 0;
> - for (uint32_t i = 0; i < binding->array_size; i++)
> - total_plane_count += binding->immutable_samplers[i]->n_planes;
> -
> - return total_plane_count;
> -}
> -
> struct surface_state_free_list_entry {
> void *next;
> struct anv_state state;
> diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
> index c287a005bd6..67ebaa6ce6c 100644
> --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
> +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
> @@ -379,37 +379,11 @@ anv_nir_apply_pipeline_layout(struct anv_pipeline *pipeline,
> get_used_bindings_block(block, &state);
> }
>
> - if (state.uses_constants)
> - map->surface_count++;
> -
> - for (uint32_t set = 0; set < layout->num_sets; set++) {
> - struct anv_descriptor_set_layout *set_layout = layout->set[set].layout;
> -
> - BITSET_WORD b, _tmp;
> - BITSET_FOREACH_SET(b, _tmp, state.set[set].used,
> - set_layout->binding_count) {
> - if (set_layout->binding[b].stage[stage].surface_index >= 0) {
> - map->surface_count +=
> - anv_descriptor_set_binding_layout_get_hw_size(&set_layout->binding[b]);
> - }
> - if (set_layout->binding[b].stage[stage].sampler_index >= 0) {
> - map->sampler_count +=
> - anv_descriptor_set_binding_layout_get_hw_size(&set_layout->binding[b]);
> - }
> - if (set_layout->binding[b].stage[stage].image_index >= 0)
> - map->image_count += set_layout->binding[b].array_size;
> - }
> - }
> -
> - unsigned surface = 0;
> - unsigned sampler = 0;
> - unsigned image = 0;
> -
> if (state.uses_constants) {
> - state.constants_offset = surface;
> - map->surface_to_descriptor[surface].set =
> + state.constants_offset = map->surface_count;
> + map->surface_to_descriptor[map->surface_count].set =
> ANV_DESCRIPTOR_SET_SHADER_CONSTANTS;
> - surface++;
> + map->surface_count++;
> }
>
> for (uint32_t set = 0; set < layout->num_sets; set++) {
> @@ -422,38 +396,42 @@ anv_nir_apply_pipeline_layout(struct anv_pipeline *pipeline,
> &set_layout->binding[b];
>
> if (binding->stage[stage].surface_index >= 0) {
> - state.set[set].surface_offsets[b] = surface;
> + state.set[set].surface_offsets[b] = map->surface_count;
> struct anv_sampler **samplers = binding->immutable_samplers;
> for (unsigned i = 0; i < binding->array_size; i++) {
> uint8_t planes = samplers ? samplers[i]->n_planes : 1;
> for (uint8_t p = 0; p < planes; p++) {
> - map->surface_to_descriptor[surface].set = set;
> - map->surface_to_descriptor[surface].binding = b;
> - map->surface_to_descriptor[surface].index = i;
> - map->surface_to_descriptor[surface].plane = p;
> - surface++;
> + map->surface_to_descriptor[map->surface_count++] =
> + (struct anv_pipeline_binding) {
> + .set = set,
> + .binding = b,
> + .index = i,
> + .plane = p,
> + };
> }
> }
> }
>
> if (binding->stage[stage].sampler_index >= 0) {
> - state.set[set].sampler_offsets[b] = sampler;
> + state.set[set].sampler_offsets[b] = map->sampler_count;
> struct anv_sampler **samplers = binding->immutable_samplers;
> for (unsigned i = 0; i < binding->array_size; i++) {
> uint8_t planes = samplers ? samplers[i]->n_planes : 1;
> for (uint8_t p = 0; p < planes; p++) {
> - map->sampler_to_descriptor[sampler].set = set;
> - map->sampler_to_descriptor[sampler].binding = b;
> - map->sampler_to_descriptor[sampler].index = i;
> - map->sampler_to_descriptor[sampler].plane = p;
> - sampler++;
> + map->sampler_to_descriptor[map->sampler_count++] =
> + (struct anv_pipeline_binding) {
> + .set = set,
> + .binding = b,
> + .index = i,
> + .plane = p,
> + };
> }
> }
> }
>
> if (binding->stage[stage].image_index >= 0) {
> - state.set[set].image_offsets[b] = image;
> - image += binding->array_size;
> + state.set[set].image_offsets[b] = map->image_count;
> + map->image_count += binding->array_size;
> }
> }
> }
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index 410a148e423..2ced8afcabe 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1541,9 +1541,6 @@ struct anv_descriptor_update_template {
> struct anv_descriptor_template_entry entries[0];
> };
>
> -size_t
> -anv_descriptor_set_binding_layout_get_hw_size(const struct anv_descriptor_set_binding_layout *binding);
> -
> size_t
> anv_descriptor_set_layout_size(const struct anv_descriptor_set_layout *layout);
>
More information about the mesa-dev
mailing list