From: Bas Nieuwenhuizen Date: Sun, 17 Sep 2017 10:59:24 +0000 (+0200) Subject: radv: Only enter the immutable samplers init loop when we have some. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ef721c77f12b7a8e6281fb56c85d4e09b14aeca8;p=mesa.git radv: Only enter the immutable samplers init loop when we have some. Reviewed-by: Dave Airlie Reviewed-by: Samuel Pitoiset --- diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index 314ab5a96d0..5b9cfe66331 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -67,6 +67,7 @@ VkResult radv_CreateDescriptorSetLayout( set_layout->binding_count = max_binding + 1; set_layout->shader_stages = 0; set_layout->dynamic_shader_stages = 0; + set_layout->has_immutable_samplers = false; set_layout->size = 0; memset(set_layout->binding, 0, size - sizeof(struct radv_descriptor_set_layout)); @@ -132,6 +133,7 @@ VkResult radv_CreateDescriptorSetLayout( if (binding->pImmutableSamplers) { set_layout->binding[b].immutable_samplers_offset = samplers_offset; set_layout->binding[b].immutable_samplers_equal = true; + set_layout->has_immutable_samplers = true; for (uint32_t i = 0; i < binding->descriptorCount; i++) @@ -329,21 +331,23 @@ radv_descriptor_set_create(struct radv_device *device, return vk_error(VK_ERROR_OUT_OF_POOL_MEMORY_KHR); } - for (unsigned i = 0; i < layout->binding_count; ++i) { - if (!layout->binding[i].immutable_samplers_offset || - layout->binding[i].immutable_samplers_equal) - continue; + if (layout->has_immutable_samplers) { + for (unsigned i = 0; i < layout->binding_count; ++i) { + if (!layout->binding[i].immutable_samplers_offset || + layout->binding[i].immutable_samplers_equal) + continue; - unsigned offset = layout->binding[i].offset / 4; - if (layout->binding[i].type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) - offset += 16; + unsigned offset = layout->binding[i].offset / 4; + if (layout->binding[i].type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) + offset += 16; - const uint32_t *samplers = (const uint32_t*)((const char*)layout + layout->binding[i].immutable_samplers_offset); - for (unsigned j = 0; j < layout->binding[i].array_size; ++j) { - memcpy(set->mapped_ptr + offset, samplers + 4 * j, 16); - offset += layout->binding[i].size / 4; - } + const uint32_t *samplers = (const uint32_t*)((const char*)layout + layout->binding[i].immutable_samplers_offset); + for (unsigned j = 0; j < layout->binding[i].array_size; ++j) { + memcpy(set->mapped_ptr + offset, samplers + 4 * j, 16); + offset += layout->binding[i].size / 4; + } + } } *out_set = set; return VK_SUCCESS; diff --git a/src/amd/vulkan/radv_descriptor_set.h b/src/amd/vulkan/radv_descriptor_set.h index 4b63992b2bb..7fa79186a17 100644 --- a/src/amd/vulkan/radv_descriptor_set.h +++ b/src/amd/vulkan/radv_descriptor_set.h @@ -68,6 +68,8 @@ struct radv_descriptor_set_layout { /* Number of dynamic offsets used by this descriptor set */ uint16_t dynamic_offset_count; + bool has_immutable_samplers; + /* Bindings in this descriptor set */ struct radv_descriptor_set_binding_layout binding[0]; };