#include "radv_private.h"
#include "sid.h"
+
+static bool has_equal_immutable_samplers(const VkSampler *samplers, uint32_t count)
+{
+ if (!samplers)
+ return false;
+ for(uint32_t i = 1; i < count; ++i) {
+ if (memcmp(radv_sampler_from_handle(samplers[0])->state,
+ radv_sampler_from_handle(samplers[i])->state, 16)) {
+ return false;
+ }
+ }
+ return true;
+}
+
VkResult radv_CreateDescriptorSetLayout(
VkDevice _device,
const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
if (binding->pImmutableSamplers) {
set_layout->binding[b].immutable_samplers_offset = samplers_offset;
- set_layout->binding[b].immutable_samplers_equal = true;
+ set_layout->binding[b].immutable_samplers_equal =
+ has_equal_immutable_samplers(binding->pImmutableSamplers, binding->descriptorCount);
set_layout->has_immutable_samplers = true;
for (uint32_t i = 0; i < binding->descriptorCount; i++)
memcpy(samplers + 4 * i, &radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
- for (uint32_t i = 1; i < binding->descriptorCount; i++)
- if (memcmp(samplers + 4 * i, samplers, 16) != 0)
- set_layout->binding[b].immutable_samplers_equal = false;
/* Don't reserve space for the samplers if they're not accessed. */
if (set_layout->binding[b].immutable_samplers_equal) {
vk_free2(&device->alloc, pAllocator, set_layout);
}
+void radv_GetDescriptorSetLayoutSupport(VkDevice device,
+ const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+ VkDescriptorSetLayoutSupport* pSupport)
+{
+ bool supported = true;
+ uint64_t size = 0;
+ for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
+ const VkDescriptorSetLayoutBinding *binding = &pCreateInfo->pBindings[i];
+
+ if (binding->descriptorCount == 0)
+ continue;
+
+ uint64_t descriptor_size = 0;
+ uint64_t descriptor_alignment = 1;
+ switch (binding->descriptorType) {
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ descriptor_size = 16;
+ descriptor_alignment = 16;
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ descriptor_size = 64;
+ descriptor_alignment = 32;
+ break;
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ if (!has_equal_immutable_samplers(binding->pImmutableSamplers, binding->descriptorCount)) {
+ descriptor_size = 64;
+ } else {
+ descriptor_size = 96;
+ }
+ descriptor_alignment = 32;
+ break;
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ if (!has_equal_immutable_samplers(binding->pImmutableSamplers, binding->descriptorCount)) {
+ descriptor_size = 16;
+ descriptor_alignment = 16;
+ }
+ break;
+ default:
+ unreachable("unknown descriptor type\n");
+ break;
+ }
+
+ if (size && !align_u64(size, descriptor_alignment)) {
+ supported = false;
+ }
+ size = align_u64(size, descriptor_alignment);
+ if (descriptor_size && (UINT64_MAX - size) / descriptor_size < binding->descriptorCount) {
+ supported = false;
+ }
+ size += binding->descriptorCount * descriptor_size;
+ }
+
+ pSupport->supported = supported;
+}
+
/*
* Pipeline layouts. These have nothing to do with the pipeline. They are
* just muttiple descriptor set layouts pasted together
Extension('VK_KHR_incremental_present', 1, 'RADV_HAS_SURFACE'),
Extension('VK_KHR_maintenance1', 1, True),
Extension('VK_KHR_maintenance2', 1, True),
+ Extension('VK_KHR_maintenance3', 1, True),
Extension('VK_KHR_push_descriptor', 1, True),
Extension('VK_KHR_relaxed_block_layout', 1, True),
Extension('VK_KHR_sampler_mirror_clamp_to_edge', 1, True),