set_layout->dynamic_offset_count = dynamic_offset_count;
set_layout->descriptor_buffer_size = descriptor_buffer_size;
+ if (pCreateInfo->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT)
+ set_layout->type = ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_BUFFER;
+ else if (device->physical->indirect_descriptors)
+ set_layout->type = ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_INDIRECT;
+ else
+ set_layout->type = ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_DIRECT;
+
*pSetLayout = anv_descriptor_set_layout_to_handle(set_layout);
return VK_SUCCESS;
if (layout->independent_sets && anv_descriptor_set_layout_empty(set_layout))
return;
+ if (layout->type == ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_UNKNOWN)
+ layout->type = set_layout->type;
+ else
+ assert(layout->type == set_layout->type);
+
layout->num_sets = MAX2(set_idx + 1, layout->num_sets);
layout->set[set_idx].layout =
struct anv_sampler **immutable_samplers;
};
+enum anv_descriptor_set_layout_type {
+ ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_UNKNOWN,
+ ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_INDIRECT,
+ ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_DIRECT,
+ ANV_PIPELINE_DESCRIPTOR_SET_LAYOUT_TYPE_BUFFER,
+};
+
bool anv_descriptor_supports_bindless(const struct anv_physical_device *pdevice,
const struct anv_descriptor_set_binding_layout *binding,
bool sampler);
VkDescriptorSetLayoutCreateFlags flags;
+ /* Type of descriptor set layout */
+ enum anv_descriptor_set_layout_type type;
+
/* Descriptor set layouts can be destroyed at almost any time */
uint32_t ref_cnt;
uint32_t dynamic_offset_start;
} set[MAX_SETS];
+ enum anv_descriptor_set_layout_type type;
+
uint32_t num_sets;
uint32_t num_dynamic_buffers;