[Mesa-dev] [PATCH] anv: Only parse pImmutableSamplers if the descriptor has samplers
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Mon Jan 21 10:49:48 UTC 2019
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
On 19/01/2019 19:04, Jason Ekstrand wrote:
> ---
> src/intel/vulkan/anv_descriptor_set.c | 43 +++++++++++++++++++--------
> 1 file changed, 31 insertions(+), 12 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c
> index a308fbf8540..a4e466cf3dd 100644
> --- a/src/intel/vulkan/anv_descriptor_set.c
> +++ b/src/intel/vulkan/anv_descriptor_set.c
> @@ -94,7 +94,22 @@ VkResult anv_CreateDescriptorSetLayout(
> uint32_t immutable_sampler_count = 0;
> for (uint32_t j = 0; j < pCreateInfo->bindingCount; j++) {
> max_binding = MAX2(max_binding, pCreateInfo->pBindings[j].binding);
> - if (pCreateInfo->pBindings[j].pImmutableSamplers)
> +
> + /* From the Vulkan 1.1.97 spec for VkDescriptorSetLayoutBinding:
> + *
> + * "If descriptorType specifies a VK_DESCRIPTOR_TYPE_SAMPLER or
> + * VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER type descriptor, then
> + * pImmutableSamplers can be used to initialize a set of immutable
> + * samplers. [...] If descriptorType is not one of these descriptor
> + * types, then pImmutableSamplers is ignored.
> + *
> + * We need to be careful here and only parse pImmutableSamplers if we
> + * have one of the right descriptor types.
> + */
> + VkDescriptorType desc_type = pCreateInfo->pBindings[j].descriptorType;
> + if ((desc_type == VK_DESCRIPTOR_TYPE_SAMPLER ||
> + desc_type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) &&
> + pCreateInfo->pBindings[j].pImmutableSamplers)
> immutable_sampler_count += pCreateInfo->pBindings[j].descriptorCount;
> }
>
> @@ -153,6 +168,12 @@ VkResult anv_CreateDescriptorSetLayout(
> if (binding == NULL)
> continue;
>
> + /* We temporarily stashed the pointer to the binding in the
> + * immutable_samplers pointer. Now that we've pulled it back out
> + * again, we reset immutable_samplers to NULL.
> + */
> + set_layout->binding[b].immutable_samplers = NULL;
> +
> if (binding->descriptorCount == 0)
> continue;
>
> @@ -170,6 +191,15 @@ VkResult anv_CreateDescriptorSetLayout(
> set_layout->binding[b].stage[s].sampler_index = sampler_count[s];
> sampler_count[s] += binding->descriptorCount;
> }
> +
> + if (binding->pImmutableSamplers) {
> + set_layout->binding[b].immutable_samplers = samplers;
> + samplers += binding->descriptorCount;
> +
> + for (uint32_t i = 0; i < binding->descriptorCount; i++)
> + set_layout->binding[b].immutable_samplers[i] =
> + anv_sampler_from_handle(binding->pImmutableSamplers[i]);
> + }
> break;
> default:
> break;
> @@ -221,17 +251,6 @@ VkResult anv_CreateDescriptorSetLayout(
> break;
> }
>
> - if (binding->pImmutableSamplers) {
> - set_layout->binding[b].immutable_samplers = samplers;
> - samplers += binding->descriptorCount;
> -
> - for (uint32_t i = 0; i < binding->descriptorCount; i++)
> - set_layout->binding[b].immutable_samplers[i] =
> - anv_sampler_from_handle(binding->pImmutableSamplers[i]);
> - } else {
> - set_layout->binding[b].immutable_samplers = NULL;
> - }
> -
> set_layout->shader_stages |= binding->stageFlags;
> }
>
More information about the mesa-dev
mailing list