[Mesa-dev] [PATCH 2/3] radv: Only enter the immutable samplers init loop when we have some.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Sun Sep 17 10:59:24 UTC 2017


---
 src/amd/vulkan/radv_descriptor_set.c | 28 ++++++++++++++++------------
 src/amd/vulkan/radv_descriptor_set.h |  2 ++
 2 files changed, 18 insertions(+), 12 deletions(-)

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];
 };
-- 
2.14.1



More information about the mesa-dev mailing list