Reviewed-by: Bas Nieuwenhuizen <[email protected]>

On Tue, Jan 22, 2019 at 7:27 PM Samuel Pitoiset
<[email protected]> wrote:
>
> For example, if a pipeline has two stages VS and FS. And if only
> the fragment stage needs dynamic bindings, we shouldn't allocate
> an extra user SGPR for the vertex stage. Of course, if the vertex
> stage loads constants, it needs an user SGPR.
>
> This should reduce the number of SET_SH_REG packets that are emitted.
>
> Signed-off-by: Samuel Pitoiset <[email protected]>
> ---
>  src/amd/vulkan/radv_descriptor_set.c | 3 +++
>  src/amd/vulkan/radv_descriptor_set.h | 1 +
>  src/amd/vulkan/radv_shader_info.c    | 4 +++-
>  3 files changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/src/amd/vulkan/radv_descriptor_set.c 
> b/src/amd/vulkan/radv_descriptor_set.c
> index 526bb77a553..30f982252bb 100644
> --- a/src/amd/vulkan/radv_descriptor_set.c
> +++ b/src/amd/vulkan/radv_descriptor_set.c
> @@ -345,6 +345,7 @@ VkResult radv_CreatePipelineLayout(
>         layout->num_sets = pCreateInfo->setLayoutCount;
>
>         unsigned dynamic_offset_count = 0;
> +       uint16_t dynamic_shader_stages = 0;
>
>
>         _mesa_sha1_init(&ctx);
> @@ -356,6 +357,7 @@ VkResult radv_CreatePipelineLayout(
>                 layout->set[set].dynamic_offset_start = dynamic_offset_count;
>                 for (uint32_t b = 0; b < set_layout->binding_count; b++) {
>                         dynamic_offset_count += 
> set_layout->binding[b].array_size * 
> set_layout->binding[b].dynamic_offset_count;
> +                       dynamic_shader_stages |= 
> set_layout->dynamic_shader_stages;
>                         if (set_layout->binding[b].immutable_samplers_offset)
>                                 _mesa_sha1_update(&ctx, 
> radv_immutable_samplers(set_layout, set_layout->binding + b),
>                                                   
> set_layout->binding[b].array_size * 4 * sizeof(uint32_t));
> @@ -365,6 +367,7 @@ VkResult radv_CreatePipelineLayout(
>         }
>
>         layout->dynamic_offset_count = dynamic_offset_count;
> +       layout->dynamic_shader_stages = dynamic_shader_stages;
>         layout->push_constant_size = 0;
>
>         for (unsigned i = 0; i < pCreateInfo->pushConstantRangeCount; ++i) {
> diff --git a/src/amd/vulkan/radv_descriptor_set.h 
> b/src/amd/vulkan/radv_descriptor_set.h
> index d8431241fd9..7b13c6fb621 100644
> --- a/src/amd/vulkan/radv_descriptor_set.h
> +++ b/src/amd/vulkan/radv_descriptor_set.h
> @@ -85,6 +85,7 @@ struct radv_pipeline_layout {
>     uint32_t num_sets;
>     uint32_t push_constant_size;
>     uint32_t dynamic_offset_count;
> +   uint16_t dynamic_shader_stages;
>
>     unsigned char sha1[20];
>  };
> diff --git a/src/amd/vulkan/radv_shader_info.c 
> b/src/amd/vulkan/radv_shader_info.c
> index c2e005e63dd..7e5a3789af2 100644
> --- a/src/amd/vulkan/radv_shader_info.c
> +++ b/src/amd/vulkan/radv_shader_info.c
> @@ -512,8 +512,10 @@ radv_nir_shader_info_pass(const struct nir_shader *nir,
>         struct nir_function *func =
>                 (struct nir_function 
> *)exec_list_get_head_const(&nir->functions);
>
> -       if (options->layout && options->layout->dynamic_offset_count)
> +       if (options->layout && options->layout->dynamic_offset_count &&
> +           (options->layout->dynamic_shader_stages & 
> mesa_to_vk_shader_stage(nir->info.stage))) {
>                 info->loads_push_constants = true;
> +       }
>
>         nir_foreach_variable(variable, &nir->inputs)
>                 gather_info_input_decl(nir, variable, info);
> --
> 2.20.1
>
> _______________________________________________
> mesa-dev mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to