Optimize format flag fetch function
authorJari Komppa <jari.komppa@siru.fi>
Mon, 25 Feb 2019 13:07:45 +0000 (15:07 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 28 Mar 2019 11:17:31 +0000 (07:17 -0400)
This fixes one old TODO in vktApiFeatureInfo by optimizing several array
traversals into a single one.

Affects:

dEQP-VK.api.info.format_properties.*

Components: Vulkan

VK-GL-CTS issue: 1624

Change-Id: I2b0e603e20e8adb27620754e0ca9a0b9d102d01f

external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp

index 9356707..4020894 100644 (file)
@@ -1536,195 +1536,84 @@ tcu::TestStatus deviceGroupPeerMemoryFeatures (Context& context)
        return tcu::TestStatus::pass("Querying deviceGroup peer memory features succeeded");
 }
 
-// \todo [2016-01-22 pyry] Optimize by doing format -> flags mapping instead
-
 VkFormatFeatureFlags getRequiredOptimalTilingFeatures (VkFormat format)
 {
-       static const VkFormat s_requiredSampledImageBlitSrcFormats[] =
-       {
-               VK_FORMAT_B4G4R4A4_UNORM_PACK16,
-               VK_FORMAT_R5G6B5_UNORM_PACK16,
-               VK_FORMAT_A1R5G5B5_UNORM_PACK16,
-               VK_FORMAT_R8_UNORM,
-               VK_FORMAT_R8_SNORM,
-               VK_FORMAT_R8_UINT,
-               VK_FORMAT_R8_SINT,
-               VK_FORMAT_R8G8_UNORM,
-               VK_FORMAT_R8G8_SNORM,
-               VK_FORMAT_R8G8_UINT,
-               VK_FORMAT_R8G8_SINT,
-               VK_FORMAT_R8G8B8A8_UNORM,
-               VK_FORMAT_R8G8B8A8_SNORM,
-               VK_FORMAT_R8G8B8A8_UINT,
-               VK_FORMAT_R8G8B8A8_SINT,
-               VK_FORMAT_R8G8B8A8_SRGB,
-               VK_FORMAT_B8G8R8A8_UNORM,
-               VK_FORMAT_B8G8R8A8_SRGB,
-               VK_FORMAT_A8B8G8R8_UNORM_PACK32,
-               VK_FORMAT_A8B8G8R8_SNORM_PACK32,
-               VK_FORMAT_A8B8G8R8_UINT_PACK32,
-               VK_FORMAT_A8B8G8R8_SINT_PACK32,
-               VK_FORMAT_A8B8G8R8_SRGB_PACK32,
-               VK_FORMAT_A2B10G10R10_UNORM_PACK32,
-               VK_FORMAT_A2B10G10R10_UINT_PACK32,
-               VK_FORMAT_R16_UINT,
-               VK_FORMAT_R16_SINT,
-               VK_FORMAT_R16_SFLOAT,
-               VK_FORMAT_R16G16_UINT,
-               VK_FORMAT_R16G16_SINT,
-               VK_FORMAT_R16G16_SFLOAT,
-               VK_FORMAT_R16G16B16A16_UINT,
-               VK_FORMAT_R16G16B16A16_SINT,
-               VK_FORMAT_R16G16B16A16_SFLOAT,
-               VK_FORMAT_R32_UINT,
-               VK_FORMAT_R32_SINT,
-               VK_FORMAT_R32_SFLOAT,
-               VK_FORMAT_R32G32_UINT,
-               VK_FORMAT_R32G32_SINT,
-               VK_FORMAT_R32G32_SFLOAT,
-               VK_FORMAT_R32G32B32A32_UINT,
-               VK_FORMAT_R32G32B32A32_SINT,
-               VK_FORMAT_R32G32B32A32_SFLOAT,
-               VK_FORMAT_B10G11R11_UFLOAT_PACK32,
-               VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
-               VK_FORMAT_D16_UNORM,
-               VK_FORMAT_D32_SFLOAT
-       };
-       static const VkFormat s_requiredSampledImageFilterLinearFormats[] =
-       {
-               VK_FORMAT_B4G4R4A4_UNORM_PACK16,
-               VK_FORMAT_R5G6B5_UNORM_PACK16,
-               VK_FORMAT_A1R5G5B5_UNORM_PACK16,
-               VK_FORMAT_R8_UNORM,
-               VK_FORMAT_R8_SNORM,
-               VK_FORMAT_R8G8_UNORM,
-               VK_FORMAT_R8G8_SNORM,
-               VK_FORMAT_R8G8B8A8_UNORM,
-               VK_FORMAT_R8G8B8A8_SNORM,
-               VK_FORMAT_R8G8B8A8_SRGB,
-               VK_FORMAT_B8G8R8A8_UNORM,
-               VK_FORMAT_B8G8R8A8_SRGB,
-               VK_FORMAT_A8B8G8R8_UNORM_PACK32,
-               VK_FORMAT_A8B8G8R8_SNORM_PACK32,
-               VK_FORMAT_A8B8G8R8_SRGB_PACK32,
-               VK_FORMAT_A2B10G10R10_UNORM_PACK32,
-               VK_FORMAT_R16_SFLOAT,
-               VK_FORMAT_R16G16_SFLOAT,
-               VK_FORMAT_R16G16B16A16_SFLOAT,
-               VK_FORMAT_B10G11R11_UFLOAT_PACK32,
-               VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
-       };
-       static const VkFormat s_requiredStorageImageFormats[] =
-       {
-               VK_FORMAT_R8G8B8A8_UNORM,
-               VK_FORMAT_R8G8B8A8_SNORM,
-               VK_FORMAT_R8G8B8A8_UINT,
-               VK_FORMAT_R8G8B8A8_SINT,
-               VK_FORMAT_R16G16B16A16_UINT,
-               VK_FORMAT_R16G16B16A16_SINT,
-               VK_FORMAT_R16G16B16A16_SFLOAT,
-               VK_FORMAT_R32_UINT,
-               VK_FORMAT_R32_SINT,
-               VK_FORMAT_R32_SFLOAT,
-               VK_FORMAT_R32G32_UINT,
-               VK_FORMAT_R32G32_SINT,
-               VK_FORMAT_R32G32_SFLOAT,
-               VK_FORMAT_R32G32B32A32_UINT,
-               VK_FORMAT_R32G32B32A32_SINT,
-               VK_FORMAT_R32G32B32A32_SFLOAT
-       };
-       static const VkFormat s_requiredStorageImageAtomicFormats[] =
-       {
-               VK_FORMAT_R32_UINT,
-               VK_FORMAT_R32_SINT
-       };
-       static const VkFormat s_requiredColorAttachmentBlitDstFormats[] =
-       {
-               VK_FORMAT_R5G6B5_UNORM_PACK16,
-               VK_FORMAT_A1R5G5B5_UNORM_PACK16,
-               VK_FORMAT_R8_UNORM,
-               VK_FORMAT_R8_UINT,
-               VK_FORMAT_R8_SINT,
-               VK_FORMAT_R8G8_UNORM,
-               VK_FORMAT_R8G8_UINT,
-               VK_FORMAT_R8G8_SINT,
-               VK_FORMAT_R8G8B8A8_UNORM,
-               VK_FORMAT_R8G8B8A8_UINT,
-               VK_FORMAT_R8G8B8A8_SINT,
-               VK_FORMAT_R8G8B8A8_SRGB,
-               VK_FORMAT_B8G8R8A8_UNORM,
-               VK_FORMAT_B8G8R8A8_SRGB,
-               VK_FORMAT_A8B8G8R8_UNORM_PACK32,
-               VK_FORMAT_A8B8G8R8_UINT_PACK32,
-               VK_FORMAT_A8B8G8R8_SINT_PACK32,
-               VK_FORMAT_A8B8G8R8_SRGB_PACK32,
-               VK_FORMAT_A2B10G10R10_UNORM_PACK32,
-               VK_FORMAT_A2B10G10R10_UINT_PACK32,
-               VK_FORMAT_R16_UINT,
-               VK_FORMAT_R16_SINT,
-               VK_FORMAT_R16_SFLOAT,
-               VK_FORMAT_R16G16_UINT,
-               VK_FORMAT_R16G16_SINT,
-               VK_FORMAT_R16G16_SFLOAT,
-               VK_FORMAT_R16G16B16A16_UINT,
-               VK_FORMAT_R16G16B16A16_SINT,
-               VK_FORMAT_R16G16B16A16_SFLOAT,
-               VK_FORMAT_R32_UINT,
-               VK_FORMAT_R32_SINT,
-               VK_FORMAT_R32_SFLOAT,
-               VK_FORMAT_R32G32_UINT,
-               VK_FORMAT_R32G32_SINT,
-               VK_FORMAT_R32G32_SFLOAT,
-               VK_FORMAT_R32G32B32A32_UINT,
-               VK_FORMAT_R32G32B32A32_SINT,
-               VK_FORMAT_R32G32B32A32_SFLOAT
-       };
-       static const VkFormat s_requiredColorAttachmentBlendFormats[] =
+       struct Formatpair
        {
-               VK_FORMAT_R5G6B5_UNORM_PACK16,
-               VK_FORMAT_A1R5G5B5_UNORM_PACK16,
-               VK_FORMAT_R8_UNORM,
-               VK_FORMAT_R8G8_UNORM,
-               VK_FORMAT_R8G8B8A8_UNORM,
-               VK_FORMAT_R8G8B8A8_SRGB,
-               VK_FORMAT_B8G8R8A8_UNORM,
-               VK_FORMAT_B8G8R8A8_SRGB,
-               VK_FORMAT_A8B8G8R8_UNORM_PACK32,
-               VK_FORMAT_A8B8G8R8_SRGB_PACK32,
-               VK_FORMAT_A2B10G10R10_UNORM_PACK32,
-               VK_FORMAT_R16_SFLOAT,
-               VK_FORMAT_R16G16_SFLOAT,
-               VK_FORMAT_R16G16B16A16_SFLOAT
-       };
-       static const VkFormat s_requiredDepthStencilAttachmentFormats[] =
-       {
-               VK_FORMAT_D16_UNORM
+               VkFormat                                format;
+               VkFormatFeatureFlags    flags;
        };
 
-       VkFormatFeatureFlags    flags   = (VkFormatFeatureFlags)0;
-
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageBlitSrcFormats), DE_ARRAY_END(s_requiredSampledImageBlitSrcFormats), format))
-               flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_BLIT_SRC_BIT;
-
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageFilterLinearFormats), DE_ARRAY_END(s_requiredSampledImageFilterLinearFormats), format))
-               flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
-
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageImageFormats), DE_ARRAY_END(s_requiredStorageImageFormats), format))
-               flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
-
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageImageAtomicFormats), DE_ARRAY_END(s_requiredStorageImageAtomicFormats), format))
-               flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
-
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredColorAttachmentBlitDstFormats), DE_ARRAY_END(s_requiredColorAttachmentBlitDstFormats), format))
-               flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_BLIT_DST_BIT;
+       enum
+       {
+               SAIM = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
+               BLSR = VK_FORMAT_FEATURE_BLIT_SRC_BIT,
+               SIFL = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT,
+               COAT = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,
+               BLDS = VK_FORMAT_FEATURE_BLIT_DST_BIT,
+               CABL = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,
+               STIM = VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT,
+               STIA = VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT,
+               DSAT = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
+       };
 
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredColorAttachmentBlendFormats), DE_ARRAY_END(s_requiredColorAttachmentBlendFormats), format))
-               flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
+       static const Formatpair formatflags[] =
+       {
+               { VK_FORMAT_B4G4R4A4_UNORM_PACK16,              SAIM | BLSR |               SIFL },
+               { VK_FORMAT_R5G6B5_UNORM_PACK16,                SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_A1R5G5B5_UNORM_PACK16,              SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_R8_UNORM,                                   SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_R8_SNORM,                                   SAIM | BLSR |               SIFL },
+               { VK_FORMAT_R8_UINT,                                    SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R8_SINT,                                    SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R8G8_UNORM,                                 SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_R8G8_SNORM,                                 SAIM | BLSR |               SIFL },
+               { VK_FORMAT_R8G8_UINT,                                  SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R8G8_SINT,                                  SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R8G8B8A8_UNORM,                             SAIM | BLSR | COAT | BLDS | SIFL | STIM | CABL },
+               { VK_FORMAT_R8G8B8A8_SNORM,                             SAIM | BLSR |               SIFL | STIM },
+               { VK_FORMAT_R8G8B8A8_UINT,                              SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R8G8B8A8_SINT,                              SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R8G8B8A8_SRGB,                              SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_B8G8R8A8_UNORM,                             SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_B8G8R8A8_SRGB,                              SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_A8B8G8R8_UNORM_PACK32,              SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_A8B8G8R8_SNORM_PACK32,              SAIM | BLSR |               SIFL },
+               { VK_FORMAT_A8B8G8R8_UINT_PACK32,               SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_A8B8G8R8_SINT_PACK32,               SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_A8B8G8R8_SRGB_PACK32,               SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_A2B10G10R10_UNORM_PACK32,   SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_A2B10G10R10_UINT_PACK32,    SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R16_UINT,                                   SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R16_SINT,                                   SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R16_SFLOAT,                                 SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_R16G16_UINT,                                SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R16G16_SINT,                                SAIM | BLSR | COAT | BLDS },
+               { VK_FORMAT_R16G16_SFLOAT,                              SAIM | BLSR | COAT | BLDS | SIFL |        CABL },
+               { VK_FORMAT_R16G16B16A16_UINT,                  SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R16G16B16A16_SINT,                  SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R16G16B16A16_SFLOAT,                SAIM | BLSR | COAT | BLDS | SIFL | STIM | CABL },
+               { VK_FORMAT_R32_UINT,                                   SAIM | BLSR | COAT | BLDS |        STIM |        STIA },
+               { VK_FORMAT_R32_SINT,                                   SAIM | BLSR | COAT | BLDS |        STIM |        STIA },
+               { VK_FORMAT_R32_SFLOAT,                                 SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R32G32_UINT,                                SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R32G32_SINT,                                SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R32G32_SFLOAT,                              SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R32G32B32A32_UINT,                  SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R32G32B32A32_SINT,                  SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_R32G32B32A32_SFLOAT,                SAIM | BLSR | COAT | BLDS |        STIM },
+               { VK_FORMAT_B10G11R11_UFLOAT_PACK32,    SAIM | BLSR |               SIFL },
+               { VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,             SAIM | BLSR |               SIFL },
+               { VK_FORMAT_D16_UNORM,                                  SAIM | BLSR |                                           DSAT },
+               { VK_FORMAT_D32_SFLOAT,                                 SAIM | BLSR }
+       };
 
-       if (de::contains(DE_ARRAY_BEGIN(s_requiredDepthStencilAttachmentFormats), DE_ARRAY_END(s_requiredDepthStencilAttachmentFormats), format))
-               flags |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
+       size_t formatpairs = sizeof(formatflags) / sizeof(Formatpair);
 
-       return flags;
+       for (unsigned int i = 0; i < formatpairs; i++)
+               if (formatflags[i].format == format)
+                       return formatflags[i].flags;
+       return 0;
 }
 
 VkFormatFeatureFlags getRequiredOptimalExtendedTilingFeatures (Context& context, VkFormat format, VkFormatFeatureFlags queriedFlags)