2018-03-07 15:47 GMT+01:00 Bas Nieuwenhuizen <[email protected]>:
> Reviewed-by: Dave Airlie <[email protected]> > --- > src/amd/vulkan/radv_descriptor_set.c | 82 ++++++++++++++++++++++++++++++ > ++++-- > src/amd/vulkan/radv_device.c | 10 +++++ > src/amd/vulkan/radv_extensions.py | 1 + > 3 files changed, 89 insertions(+), 4 deletions(-) > > diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_ > descriptor_set.c > index 38b8dc78e1..265028df2b 100644 > --- a/src/amd/vulkan/radv_descriptor_set.c > +++ b/src/amd/vulkan/radv_descriptor_set.c > @@ -31,6 +31,20 @@ > #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, > @@ -132,15 +146,13 @@ 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->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) > { > @@ -182,6 +194,68 @@ void radv_DestroyDescriptorSetLayout( > 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; > + 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 > diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c > index 00bb70612e..593cfc9a36 100644 > --- a/src/amd/vulkan/radv_device.c > +++ b/src/amd/vulkan/radv_device.c > @@ -875,6 +875,16 @@ void radv_GetPhysicalDeviceProperties2( > properties->quadOperationsInAllStages = false; > break; > } > + case > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: > { > + VkPhysicalDeviceMaintenance3Properties > *properties = > + (VkPhysicalDeviceMaintenance3Properties*)ext; > + /* Make sure evrything is addressable by a signed > 32-bit int, and our > > Typo: everything > > Regards, > Gustaw Smolarczyk > > + * largest descriptors are 96 bytes. */ > + properties->maxPerSetDescriptors = (1ull << 31) / > 96; > + /* Our buffer size fields allow only this much */ > + properties->maxMemoryAllocationSize = > 0xFFFFFFFFull; > + break; > + } > default: > break; > } > diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_ > extensions.py > index 6fa553e589..3b4f75bff6 100644 > --- a/src/amd/vulkan/radv_extensions.py > +++ b/src/amd/vulkan/radv_extensions.py > @@ -70,6 +70,7 @@ EXTENSIONS = [ > Extension('VK_KHR_incremental_present', 1, True), > 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), > -- > 2.16.1 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
