[Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.
Gustaw Smolarczyk
wielkiegie at gmail.com
Wed Mar 7 17:54:02 UTC 2018
2018-03-07 15:47 GMT+01:00 Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>:
> Reviewed-by: Dave Airlie <airlied at redhat.com>
> ---
> 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
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180307/df21a2b1/attachment-0001.html>
More information about the mesa-dev
mailing list