[Mesa-dev] [PATCH] radv: improve gathering of load_push_constants with dynamic bindings
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Tue Jan 22 21:51:31 UTC 2019
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
On Tue, Jan 22, 2019 at 7:27 PM Samuel Pitoiset
<samuel.pitoiset at gmail.com> 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 <samuel.pitoiset at gmail.com>
> ---
> 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
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list