Home | History | Annotate | Download | only in layers
      1 /* Copyright (c) 2015-2016 The Khronos Group Inc.
      2  * Copyright (c) 2015-2016 Valve Corporation
      3  * Copyright (c) 2015-2016 LunarG, Inc.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  * Author: Mark Lobodzinski <mark (at) lunarg.com>
     18  * Author: Dave Houlton <daveh (at) lunarg.com>
     19  *
     20  */
     21 
     22 #include <string.h>
     23 #include <string>
     24 #include <vector>
     25 #include <map>
     26 #include "vulkan/vulkan.h"
     27 #include "vk_format_utils.h"
     28 
     29 struct VULKAN_FORMAT_INFO {
     30     size_t size;
     31     uint32_t channel_count;
     32     VkFormatCompatibilityClass format_class;
     33 };
     34 
     35 // Disable auto-formatting for this large table
     36 // clang-format off
     37 
     38 // Set up data structure with number of bytes and number of channels for each Vulkan format
     39 const std::map<VkFormat, VULKAN_FORMAT_INFO> vk_format_table = {
     40     {VK_FORMAT_UNDEFINED,                   {0, 0, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }},
     41     {VK_FORMAT_R4G4_UNORM_PACK8,            {1, 2, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     42     {VK_FORMAT_R4G4B4A4_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     43     {VK_FORMAT_B4G4R4A4_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     44     {VK_FORMAT_R5G6B5_UNORM_PACK16,         {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     45     {VK_FORMAT_B5G6R5_UNORM_PACK16,         {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     46     {VK_FORMAT_R5G5B5A1_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     47     {VK_FORMAT_B5G5R5A1_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     48     {VK_FORMAT_A1R5G5B5_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     49     {VK_FORMAT_R8_UNORM,                    {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     50     {VK_FORMAT_R8_SNORM,                    {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     51     {VK_FORMAT_R8_USCALED,                  {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     52     {VK_FORMAT_R8_SSCALED,                  {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     53     {VK_FORMAT_R8_UINT,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     54     {VK_FORMAT_R8_SINT,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     55     {VK_FORMAT_R8_SRGB,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
     56     {VK_FORMAT_R8G8_UNORM,                  {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     57     {VK_FORMAT_R8G8_SNORM,                  {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     58     {VK_FORMAT_R8G8_USCALED,                {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     59     {VK_FORMAT_R8G8_SSCALED,                {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     60     {VK_FORMAT_R8G8_UINT,                   {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     61     {VK_FORMAT_R8G8_SINT,                   {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     62     {VK_FORMAT_R8G8_SRGB,                   {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
     63     {VK_FORMAT_R8G8B8_UNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     64     {VK_FORMAT_R8G8B8_SNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     65     {VK_FORMAT_R8G8B8_USCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     66     {VK_FORMAT_R8G8B8_SSCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     67     {VK_FORMAT_R8G8B8_UINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     68     {VK_FORMAT_R8G8B8_SINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     69     {VK_FORMAT_R8G8B8_SRGB,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     70     {VK_FORMAT_B8G8R8_UNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     71     {VK_FORMAT_B8G8R8_SNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     72     {VK_FORMAT_B8G8R8_USCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     73     {VK_FORMAT_B8G8R8_SSCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     74     {VK_FORMAT_B8G8R8_UINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     75     {VK_FORMAT_B8G8R8_SINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     76     {VK_FORMAT_B8G8R8_SRGB,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
     77     {VK_FORMAT_R8G8B8A8_UNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     78     {VK_FORMAT_R8G8B8A8_SNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     79     {VK_FORMAT_R8G8B8A8_USCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     80     {VK_FORMAT_R8G8B8A8_SSCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     81     {VK_FORMAT_R8G8B8A8_UINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     82     {VK_FORMAT_R8G8B8A8_SINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     83     {VK_FORMAT_R8G8B8A8_SRGB,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     84     {VK_FORMAT_B8G8R8A8_UNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     85     {VK_FORMAT_B8G8R8A8_SNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     86     {VK_FORMAT_B8G8R8A8_USCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     87     {VK_FORMAT_B8G8R8A8_SSCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     88     {VK_FORMAT_B8G8R8A8_UINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     89     {VK_FORMAT_B8G8R8A8_SINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     90     {VK_FORMAT_B8G8R8A8_SRGB,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     91     {VK_FORMAT_A8B8G8R8_UNORM_PACK32,       {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     92     {VK_FORMAT_A8B8G8R8_SNORM_PACK32,       {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     93     {VK_FORMAT_A8B8G8R8_USCALED_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     94     {VK_FORMAT_A8B8G8R8_SSCALED_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     95     {VK_FORMAT_A8B8G8R8_UINT_PACK32,        {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     96     {VK_FORMAT_A8B8G8R8_SINT_PACK32,        {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     97     {VK_FORMAT_A8B8G8R8_SRGB_PACK32,        {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     98     {VK_FORMAT_A2R10G10B10_UNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
     99     {VK_FORMAT_A2R10G10B10_SNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    100     {VK_FORMAT_A2R10G10B10_USCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    101     {VK_FORMAT_A2R10G10B10_SSCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    102     {VK_FORMAT_A2R10G10B10_UINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    103     {VK_FORMAT_A2R10G10B10_SINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    104     {VK_FORMAT_A2B10G10R10_UNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    105     {VK_FORMAT_A2B10G10R10_SNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    106     {VK_FORMAT_A2B10G10R10_USCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    107     {VK_FORMAT_A2B10G10R10_SSCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    108     {VK_FORMAT_A2B10G10R10_UINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    109     {VK_FORMAT_A2B10G10R10_SINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    110     {VK_FORMAT_R16_UNORM,                   {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    111     {VK_FORMAT_R16_SNORM,                   {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    112     {VK_FORMAT_R16_USCALED,                 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    113     {VK_FORMAT_R16_SSCALED,                 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    114     {VK_FORMAT_R16_UINT,                    {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    115     {VK_FORMAT_R16_SINT,                    {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    116     {VK_FORMAT_R16_SFLOAT,                  {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
    117     {VK_FORMAT_R16G16_UNORM,                {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    118     {VK_FORMAT_R16G16_SNORM,                {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    119     {VK_FORMAT_R16G16_USCALED,              {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    120     {VK_FORMAT_R16G16_SSCALED,              {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    121     {VK_FORMAT_R16G16_UINT,                 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    122     {VK_FORMAT_R16G16_SINT,                 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    123     {VK_FORMAT_R16G16_SFLOAT,               {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    124     {VK_FORMAT_R16G16B16_UNORM,             {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    125     {VK_FORMAT_R16G16B16_SNORM,             {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    126     {VK_FORMAT_R16G16B16_USCALED,           {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    127     {VK_FORMAT_R16G16B16_SSCALED,           {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    128     {VK_FORMAT_R16G16B16_UINT,              {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    129     {VK_FORMAT_R16G16B16_SINT,              {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    130     {VK_FORMAT_R16G16B16_SFLOAT,            {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
    131     {VK_FORMAT_R16G16B16A16_UNORM,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    132     {VK_FORMAT_R16G16B16A16_SNORM,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    133     {VK_FORMAT_R16G16B16A16_USCALED,        {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    134     {VK_FORMAT_R16G16B16A16_SSCALED,        {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    135     {VK_FORMAT_R16G16B16A16_UINT,           {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    136     {VK_FORMAT_R16G16B16A16_SINT,           {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    137     {VK_FORMAT_R16G16B16A16_SFLOAT,         {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    138     {VK_FORMAT_R32_UINT,                    {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    139     {VK_FORMAT_R32_SINT,                    {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    140     {VK_FORMAT_R32_SFLOAT,                  {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    141     {VK_FORMAT_R32G32_UINT,                 {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    142     {VK_FORMAT_R32G32_SINT,                 {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    143     {VK_FORMAT_R32G32_SFLOAT,               {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    144     {VK_FORMAT_R32G32B32_UINT,              {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
    145     {VK_FORMAT_R32G32B32_SINT,              {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
    146     {VK_FORMAT_R32G32B32_SFLOAT,            {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
    147     {VK_FORMAT_R32G32B32A32_UINT,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
    148     {VK_FORMAT_R32G32B32A32_SINT,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
    149     {VK_FORMAT_R32G32B32A32_SFLOAT,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
    150     {VK_FORMAT_R64_UINT,                    {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    151     {VK_FORMAT_R64_SINT,                    {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    152     {VK_FORMAT_R64_SFLOAT,                  {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
    153     {VK_FORMAT_R64G64_UINT,                 {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
    154     {VK_FORMAT_R64G64_SINT,                 {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
    155     {VK_FORMAT_R64G64_SFLOAT,               {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
    156     {VK_FORMAT_R64G64B64_UINT,              {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
    157     {VK_FORMAT_R64G64B64_SINT,              {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
    158     {VK_FORMAT_R64G64B64_SFLOAT,            {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
    159     {VK_FORMAT_R64G64B64A64_UINT,           {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
    160     {VK_FORMAT_R64G64B64A64_SINT,           {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
    161     {VK_FORMAT_R64G64B64A64_SFLOAT,         {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
    162     {VK_FORMAT_B10G11R11_UFLOAT_PACK32,     {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    163     {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,      {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
    164     {VK_FORMAT_D16_UNORM,                   {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    165     {VK_FORMAT_X8_D24_UNORM_PACK32,         {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    166     {VK_FORMAT_D32_SFLOAT,                  {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    167     {VK_FORMAT_S8_UINT,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    168     {VK_FORMAT_D16_UNORM_S8_UINT,           {3, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    169     {VK_FORMAT_D24_UNORM_S8_UINT,           {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    170     {VK_FORMAT_D32_SFLOAT_S8_UINT,          {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
    171     {VK_FORMAT_BC1_RGB_UNORM_BLOCK,         {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
    172     {VK_FORMAT_BC1_RGB_SRGB_BLOCK,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
    173     {VK_FORMAT_BC1_RGBA_UNORM_BLOCK,        {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
    174     {VK_FORMAT_BC1_RGBA_SRGB_BLOCK,         {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
    175     {VK_FORMAT_BC2_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
    176     {VK_FORMAT_BC2_SRGB_BLOCK,              {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
    177     {VK_FORMAT_BC3_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
    178     {VK_FORMAT_BC3_SRGB_BLOCK,              {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
    179     {VK_FORMAT_BC4_UNORM_BLOCK,             {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
    180     {VK_FORMAT_BC4_SNORM_BLOCK,             {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
    181     {VK_FORMAT_BC5_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
    182     {VK_FORMAT_BC5_SNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
    183     {VK_FORMAT_BC6H_UFLOAT_BLOCK,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
    184     {VK_FORMAT_BC6H_SFLOAT_BLOCK,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
    185     {VK_FORMAT_BC7_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
    186     {VK_FORMAT_BC7_SRGB_BLOCK,              {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
    187     {VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,     {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
    188     {VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,      {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
    189     {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,   {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
    190     {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,    {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
    191     {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,   {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
    192     {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,    {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
    193     {VK_FORMAT_EAC_R11_UNORM_BLOCK,         {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
    194     {VK_FORMAT_EAC_R11_SNORM_BLOCK,         {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
    195     {VK_FORMAT_EAC_R11G11_UNORM_BLOCK,      {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
    196     {VK_FORMAT_EAC_R11G11_SNORM_BLOCK,      {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
    197     {VK_FORMAT_ASTC_4x4_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
    198     {VK_FORMAT_ASTC_4x4_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
    199     {VK_FORMAT_ASTC_5x4_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
    200     {VK_FORMAT_ASTC_5x4_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
    201     {VK_FORMAT_ASTC_5x5_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
    202     {VK_FORMAT_ASTC_5x5_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
    203     {VK_FORMAT_ASTC_6x5_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
    204     {VK_FORMAT_ASTC_6x5_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
    205     {VK_FORMAT_ASTC_6x6_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
    206     {VK_FORMAT_ASTC_6x6_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
    207     {VK_FORMAT_ASTC_8x5_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
    208     {VK_FORMAT_ASTC_8x5_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
    209     {VK_FORMAT_ASTC_8x6_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
    210     {VK_FORMAT_ASTC_8x6_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
    211     {VK_FORMAT_ASTC_8x8_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
    212     {VK_FORMAT_ASTC_8x8_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
    213     {VK_FORMAT_ASTC_10x5_UNORM_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
    214     {VK_FORMAT_ASTC_10x5_SRGB_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
    215     {VK_FORMAT_ASTC_10x6_UNORM_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
    216     {VK_FORMAT_ASTC_10x6_SRGB_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
    217     {VK_FORMAT_ASTC_10x8_UNORM_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
    218     {VK_FORMAT_ASTC_10x8_SRGB_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
    219     {VK_FORMAT_ASTC_10x10_UNORM_BLOCK,      {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
    220     {VK_FORMAT_ASTC_10x10_SRGB_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
    221     {VK_FORMAT_ASTC_12x10_UNORM_BLOCK,      {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
    222     {VK_FORMAT_ASTC_12x10_SRGB_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
    223     {VK_FORMAT_ASTC_12x12_UNORM_BLOCK,      {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
    224     {VK_FORMAT_ASTC_12x12_SRGB_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
    225     {VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
    226     {VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
    227     {VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
    228     {VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
    229     {VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
    230     {VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
    231     {VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
    232     {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}}
    233 };
    234 
    235 // Renable formatting
    236 // clang-format on
    237 
    238 // Return true if format is an ETC2 or EAC compressed texture format
    239 VK_LAYER_EXPORT bool FormatIsCompressed_ETC2_EAC(VkFormat format) {
    240     bool found = false;
    241 
    242     switch (format) {
    243         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
    244         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
    245         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
    246         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
    247         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
    248         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
    249         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
    250         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
    251         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
    252         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
    253             found = true;
    254             break;
    255         default:
    256             break;
    257     }
    258     return found;
    259 }
    260 
    261 // Return true if format is an ASTC compressed texture format
    262 VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format) {
    263     bool found = false;
    264 
    265     switch (format) {
    266         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
    267         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
    268         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
    269         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
    270         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
    271         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
    272         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
    273         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
    274         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
    275         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
    276         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
    277         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
    278         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
    279         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
    280         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
    281         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
    282         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
    283         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
    284         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
    285         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
    286         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
    287         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
    288         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
    289         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
    290         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
    291         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
    292         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
    293         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
    294             found = true;
    295             break;
    296         default:
    297             break;
    298     }
    299     return found;
    300 }
    301 
    302 // Return true if format is a BC compressed texture format
    303 VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format) {
    304     bool found = false;
    305 
    306     switch (format) {
    307         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
    308         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
    309         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
    310         case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
    311         case VK_FORMAT_BC2_UNORM_BLOCK:
    312         case VK_FORMAT_BC2_SRGB_BLOCK:
    313         case VK_FORMAT_BC3_UNORM_BLOCK:
    314         case VK_FORMAT_BC3_SRGB_BLOCK:
    315         case VK_FORMAT_BC4_UNORM_BLOCK:
    316         case VK_FORMAT_BC4_SNORM_BLOCK:
    317         case VK_FORMAT_BC5_UNORM_BLOCK:
    318         case VK_FORMAT_BC5_SNORM_BLOCK:
    319         case VK_FORMAT_BC6H_UFLOAT_BLOCK:
    320         case VK_FORMAT_BC6H_SFLOAT_BLOCK:
    321         case VK_FORMAT_BC7_UNORM_BLOCK:
    322         case VK_FORMAT_BC7_SRGB_BLOCK:
    323             found = true;
    324             break;
    325         default:
    326             break;
    327     }
    328     return found;
    329 }
    330 
    331 // Return true if format is a PVRTC compressed texture format
    332 VK_LAYER_EXPORT bool FormatIsCompressed_PVRTC(VkFormat format) {
    333     bool found = false;
    334 
    335     switch (format) {
    336         case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
    337         case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
    338         case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
    339         case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
    340         case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
    341         case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
    342         case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
    343         case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
    344             found = true;
    345             break;
    346         default:
    347             break;
    348     }
    349     return found;
    350 }
    351 
    352 // Return true if format is compressed
    353 VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
    354     return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
    355             FormatIsCompressed_PVRTC(format));
    356 }
    357 
    358 // Return true if format is a depth or stencil format
    359 VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format) {
    360     return (FormatIsDepthAndStencil(format) || FormatIsDepthOnly(format) || FormatIsStencilOnly(format));
    361 }
    362 
    363 // Return true if format contains depth and stencil information
    364 VK_LAYER_EXPORT bool FormatIsDepthAndStencil(VkFormat format) {
    365     bool is_ds = false;
    366 
    367     switch (format) {
    368         case VK_FORMAT_D16_UNORM_S8_UINT:
    369         case VK_FORMAT_D24_UNORM_S8_UINT:
    370         case VK_FORMAT_D32_SFLOAT_S8_UINT:
    371             is_ds = true;
    372             break;
    373         default:
    374             break;
    375     }
    376     return is_ds;
    377 }
    378 
    379 // Return true if format is a stencil-only format
    380 VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format) { return (format == VK_FORMAT_S8_UINT); }
    381 
    382 // Return true if format is a depth-only format
    383 VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format) {
    384     bool is_depth = false;
    385 
    386     switch (format) {
    387         case VK_FORMAT_D16_UNORM:
    388         case VK_FORMAT_X8_D24_UNORM_PACK32:
    389         case VK_FORMAT_D32_SFLOAT:
    390             is_depth = true;
    391             break;
    392         default:
    393             break;
    394     }
    395 
    396     return is_depth;
    397 }
    398 
    399 // Return true if format is of type NORM
    400 VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format) {
    401     bool is_norm = false;
    402 
    403     switch (format) {
    404         case VK_FORMAT_R4G4_UNORM_PACK8:
    405         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
    406         case VK_FORMAT_R5G6B5_UNORM_PACK16:
    407         case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
    408         case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
    409         case VK_FORMAT_R8_UNORM:
    410         case VK_FORMAT_R8_SNORM:
    411         case VK_FORMAT_R8G8_UNORM:
    412         case VK_FORMAT_R8G8_SNORM:
    413         case VK_FORMAT_R8G8B8_UNORM:
    414         case VK_FORMAT_R8G8B8_SNORM:
    415         case VK_FORMAT_R8G8B8A8_UNORM:
    416         case VK_FORMAT_R8G8B8A8_SNORM:
    417         case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
    418         case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
    419         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
    420         case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
    421         case VK_FORMAT_R16_UNORM:
    422         case VK_FORMAT_R16_SNORM:
    423         case VK_FORMAT_R16G16_UNORM:
    424         case VK_FORMAT_R16G16_SNORM:
    425         case VK_FORMAT_R16G16B16_UNORM:
    426         case VK_FORMAT_R16G16B16_SNORM:
    427         case VK_FORMAT_R16G16B16A16_UNORM:
    428         case VK_FORMAT_R16G16B16A16_SNORM:
    429         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
    430         case VK_FORMAT_BC2_UNORM_BLOCK:
    431         case VK_FORMAT_BC3_UNORM_BLOCK:
    432         case VK_FORMAT_BC4_UNORM_BLOCK:
    433         case VK_FORMAT_BC4_SNORM_BLOCK:
    434         case VK_FORMAT_BC5_UNORM_BLOCK:
    435         case VK_FORMAT_BC5_SNORM_BLOCK:
    436         case VK_FORMAT_BC7_UNORM_BLOCK:
    437         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
    438         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
    439         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
    440         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
    441         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
    442         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
    443         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
    444         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
    445         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
    446         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
    447         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
    448         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
    449         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
    450         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
    451         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
    452         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
    453         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
    454         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
    455         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
    456         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
    457         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
    458         case VK_FORMAT_B5G6R5_UNORM_PACK16:
    459         case VK_FORMAT_B8G8R8_UNORM:
    460         case VK_FORMAT_B8G8R8_SNORM:
    461         case VK_FORMAT_B8G8R8A8_UNORM:
    462         case VK_FORMAT_B8G8R8A8_SNORM:
    463         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
    464         case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
    465             is_norm = true;
    466             break;
    467         default:
    468             break;
    469     }
    470 
    471     return is_norm;
    472 }
    473 
    474 // Return true if format is of type UNORM
    475 VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format) {
    476     bool is_unorm = false;
    477 
    478     switch (format) {
    479         case VK_FORMAT_R4G4_UNORM_PACK8:
    480         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
    481         case VK_FORMAT_R5G6B5_UNORM_PACK16:
    482         case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
    483         case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
    484         case VK_FORMAT_R8_UNORM:
    485         case VK_FORMAT_R8G8_UNORM:
    486         case VK_FORMAT_R8G8B8_UNORM:
    487         case VK_FORMAT_R8G8B8A8_UNORM:
    488         case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
    489         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
    490         case VK_FORMAT_R16_UNORM:
    491         case VK_FORMAT_R16G16_UNORM:
    492         case VK_FORMAT_R16G16B16_UNORM:
    493         case VK_FORMAT_R16G16B16A16_UNORM:
    494         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
    495         case VK_FORMAT_BC2_UNORM_BLOCK:
    496         case VK_FORMAT_BC3_UNORM_BLOCK:
    497         case VK_FORMAT_BC4_UNORM_BLOCK:
    498         case VK_FORMAT_BC5_UNORM_BLOCK:
    499         case VK_FORMAT_BC7_UNORM_BLOCK:
    500         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
    501         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
    502         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
    503         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
    504         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
    505         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
    506         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
    507         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
    508         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
    509         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
    510         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
    511         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
    512         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
    513         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
    514         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
    515         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
    516         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
    517         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
    518         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
    519         case VK_FORMAT_B5G6R5_UNORM_PACK16:
    520         case VK_FORMAT_B8G8R8_UNORM:
    521         case VK_FORMAT_B8G8R8A8_UNORM:
    522         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
    523             is_unorm = true;
    524             break;
    525         default:
    526             break;
    527     }
    528 
    529     return is_unorm;
    530 }
    531 
    532 // Return true if format is of type SNORM
    533 VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format) {
    534     bool is_snorm = false;
    535 
    536     switch (format) {
    537         case VK_FORMAT_R8_SNORM:
    538         case VK_FORMAT_R8G8_SNORM:
    539         case VK_FORMAT_R8G8B8_SNORM:
    540         case VK_FORMAT_R8G8B8A8_SNORM:
    541         case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
    542         case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
    543         case VK_FORMAT_R16_SNORM:
    544         case VK_FORMAT_R16G16_SNORM:
    545         case VK_FORMAT_R16G16B16_SNORM:
    546         case VK_FORMAT_R16G16B16A16_SNORM:
    547         case VK_FORMAT_BC4_SNORM_BLOCK:
    548         case VK_FORMAT_BC5_SNORM_BLOCK:
    549         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
    550         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
    551         case VK_FORMAT_B8G8R8_SNORM:
    552         case VK_FORMAT_B8G8R8A8_SNORM:
    553         case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
    554             is_snorm = true;
    555             break;
    556         default:
    557             break;
    558     }
    559 
    560     return is_snorm;
    561 }
    562 
    563 // Return true if format is an integer format
    564 VK_LAYER_EXPORT bool FormatIsInt(VkFormat format) { return (FormatIsSInt(format) || FormatIsUInt(format)); }
    565 
    566 // Return true if format is an unsigned integer format
    567 VK_LAYER_EXPORT bool FormatIsUInt(VkFormat format) {
    568     bool is_uint = false;
    569 
    570     switch (format) {
    571         case VK_FORMAT_R8_UINT:
    572         case VK_FORMAT_S8_UINT:
    573         case VK_FORMAT_R8G8_UINT:
    574         case VK_FORMAT_R8G8B8_UINT:
    575         case VK_FORMAT_R8G8B8A8_UINT:
    576         case VK_FORMAT_A8B8G8R8_UINT_PACK32:
    577         case VK_FORMAT_A2B10G10R10_UINT_PACK32:
    578         case VK_FORMAT_R16_UINT:
    579         case VK_FORMAT_R16G16_UINT:
    580         case VK_FORMAT_R16G16B16_UINT:
    581         case VK_FORMAT_R16G16B16A16_UINT:
    582         case VK_FORMAT_R32_UINT:
    583         case VK_FORMAT_R32G32_UINT:
    584         case VK_FORMAT_R32G32B32_UINT:
    585         case VK_FORMAT_R32G32B32A32_UINT:
    586         case VK_FORMAT_R64_UINT:
    587         case VK_FORMAT_R64G64_UINT:
    588         case VK_FORMAT_R64G64B64_UINT:
    589         case VK_FORMAT_R64G64B64A64_UINT:
    590         case VK_FORMAT_B8G8R8_UINT:
    591         case VK_FORMAT_B8G8R8A8_UINT:
    592         case VK_FORMAT_A2R10G10B10_UINT_PACK32:
    593             is_uint = true;
    594             break;
    595         default:
    596             break;
    597     }
    598 
    599     return is_uint;
    600 }
    601 
    602 // Return true if format is a signed integer format
    603 VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
    604     bool is_sint = false;
    605 
    606     switch (format) {
    607         case VK_FORMAT_R8_SINT:
    608         case VK_FORMAT_R8G8_SINT:
    609         case VK_FORMAT_R8G8B8_SINT:
    610         case VK_FORMAT_R8G8B8A8_SINT:
    611         case VK_FORMAT_A8B8G8R8_SINT_PACK32:
    612         case VK_FORMAT_A2B10G10R10_SINT_PACK32:
    613         case VK_FORMAT_R16_SINT:
    614         case VK_FORMAT_R16G16_SINT:
    615         case VK_FORMAT_R16G16B16_SINT:
    616         case VK_FORMAT_R16G16B16A16_SINT:
    617         case VK_FORMAT_R32_SINT:
    618         case VK_FORMAT_R32G32_SINT:
    619         case VK_FORMAT_R32G32B32_SINT:
    620         case VK_FORMAT_R32G32B32A32_SINT:
    621         case VK_FORMAT_R64_SINT:
    622         case VK_FORMAT_R64G64_SINT:
    623         case VK_FORMAT_R64G64B64_SINT:
    624         case VK_FORMAT_R64G64B64A64_SINT:
    625         case VK_FORMAT_B8G8R8_SINT:
    626         case VK_FORMAT_B8G8R8A8_SINT:
    627         case VK_FORMAT_A2R10G10B10_SINT_PACK32:
    628             is_sint = true;
    629             break;
    630         default:
    631             break;
    632     }
    633 
    634     return is_sint;
    635 }
    636 
    637 // Return true if format is a floating-point format
    638 VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
    639     bool is_float = false;
    640 
    641     switch (format) {
    642         case VK_FORMAT_R16_SFLOAT:
    643         case VK_FORMAT_R16G16_SFLOAT:
    644         case VK_FORMAT_R16G16B16_SFLOAT:
    645         case VK_FORMAT_R16G16B16A16_SFLOAT:
    646         case VK_FORMAT_R32_SFLOAT:
    647         case VK_FORMAT_R32G32_SFLOAT:
    648         case VK_FORMAT_R32G32B32_SFLOAT:
    649         case VK_FORMAT_R32G32B32A32_SFLOAT:
    650         case VK_FORMAT_R64_SFLOAT:
    651         case VK_FORMAT_R64G64_SFLOAT:
    652         case VK_FORMAT_R64G64B64_SFLOAT:
    653         case VK_FORMAT_R64G64B64A64_SFLOAT:
    654         case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
    655         case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
    656         case VK_FORMAT_BC6H_UFLOAT_BLOCK:
    657         case VK_FORMAT_BC6H_SFLOAT_BLOCK:
    658             is_float = true;
    659             break;
    660         default:
    661             break;
    662     }
    663 
    664     return is_float;
    665 }
    666 
    667 // Return true if format is in the SRGB colorspace
    668 VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
    669     bool is_srgb = false;
    670 
    671     switch (format) {
    672         case VK_FORMAT_R8_SRGB:
    673         case VK_FORMAT_R8G8_SRGB:
    674         case VK_FORMAT_R8G8B8_SRGB:
    675         case VK_FORMAT_R8G8B8A8_SRGB:
    676         case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
    677         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
    678         case VK_FORMAT_BC2_SRGB_BLOCK:
    679         case VK_FORMAT_BC3_SRGB_BLOCK:
    680         case VK_FORMAT_BC7_SRGB_BLOCK:
    681         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
    682         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
    683         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
    684         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
    685         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
    686         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
    687         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
    688         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
    689         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
    690         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
    691         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
    692         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
    693         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
    694         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
    695         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
    696         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
    697         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
    698         case VK_FORMAT_B8G8R8_SRGB:
    699         case VK_FORMAT_B8G8R8A8_SRGB:
    700             is_srgb = true;
    701             break;
    702         default:
    703             break;
    704     }
    705 
    706     return is_srgb;
    707 }
    708 
    709 // Return true if format is a USCALED format
    710 VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
    711     bool is_uscaled = false;
    712 
    713     switch (format) {
    714         case VK_FORMAT_R8_USCALED:
    715         case VK_FORMAT_R8G8_USCALED:
    716         case VK_FORMAT_R8G8B8_USCALED:
    717         case VK_FORMAT_B8G8R8_USCALED:
    718         case VK_FORMAT_R8G8B8A8_USCALED:
    719         case VK_FORMAT_B8G8R8A8_USCALED:
    720         case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
    721         case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
    722         case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
    723         case VK_FORMAT_R16_USCALED:
    724         case VK_FORMAT_R16G16_USCALED:
    725         case VK_FORMAT_R16G16B16_USCALED:
    726         case VK_FORMAT_R16G16B16A16_USCALED:
    727             is_uscaled = true;
    728             break;
    729         default:
    730             break;
    731     }
    732 
    733     return is_uscaled;
    734 }
    735 
    736 // Return true if format is a SSCALED format
    737 VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
    738     bool is_sscaled = false;
    739 
    740     switch (format) {
    741         case VK_FORMAT_R8_SSCALED:
    742         case VK_FORMAT_R8G8_SSCALED:
    743         case VK_FORMAT_R8G8B8_SSCALED:
    744         case VK_FORMAT_B8G8R8_SSCALED:
    745         case VK_FORMAT_R8G8B8A8_SSCALED:
    746         case VK_FORMAT_B8G8R8A8_SSCALED:
    747         case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
    748         case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
    749         case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
    750         case VK_FORMAT_R16_SSCALED:
    751         case VK_FORMAT_R16G16_SSCALED:
    752         case VK_FORMAT_R16G16B16_SSCALED:
    753         case VK_FORMAT_R16G16B16A16_SSCALED:
    754             is_sscaled = true;
    755             break;
    756         default:
    757             break;
    758     }
    759 
    760     return is_sscaled;
    761 }
    762 
    763 // Return compressed texel block sizes for block compressed formats
    764 VK_LAYER_EXPORT VkExtent3D FormatCompressedTexelBlockExtent(VkFormat format) {
    765     VkExtent3D block_size = {1, 1, 1};
    766     switch (format) {
    767         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
    768         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
    769         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
    770         case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
    771         case VK_FORMAT_BC2_UNORM_BLOCK:
    772         case VK_FORMAT_BC2_SRGB_BLOCK:
    773         case VK_FORMAT_BC3_UNORM_BLOCK:
    774         case VK_FORMAT_BC3_SRGB_BLOCK:
    775         case VK_FORMAT_BC4_UNORM_BLOCK:
    776         case VK_FORMAT_BC4_SNORM_BLOCK:
    777         case VK_FORMAT_BC5_UNORM_BLOCK:
    778         case VK_FORMAT_BC5_SNORM_BLOCK:
    779         case VK_FORMAT_BC6H_UFLOAT_BLOCK:
    780         case VK_FORMAT_BC6H_SFLOAT_BLOCK:
    781         case VK_FORMAT_BC7_UNORM_BLOCK:
    782         case VK_FORMAT_BC7_SRGB_BLOCK:
    783         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
    784         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
    785         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
    786         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
    787         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
    788         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
    789         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
    790         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
    791         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
    792         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
    793         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
    794         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
    795             block_size = {4, 4, 1};
    796             break;
    797         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
    798         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
    799             block_size = {5, 4, 1};
    800             break;
    801         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
    802         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
    803             block_size = {5, 5, 1};
    804             break;
    805         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
    806         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
    807             block_size = {6, 5, 1};
    808             break;
    809         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
    810         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
    811             block_size = {6, 6, 1};
    812             break;
    813         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
    814         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
    815             block_size = {8, 5, 1};
    816             break;
    817         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
    818         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
    819             block_size = {8, 6, 1};
    820             break;
    821         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
    822         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
    823             block_size = {8, 8, 1};
    824             break;
    825         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
    826         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
    827             block_size = {10, 5, 1};
    828             break;
    829         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
    830         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
    831             block_size = {10, 6, 1};
    832             break;
    833         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
    834         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
    835             block_size = {10, 8, 1};
    836             break;
    837         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
    838         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
    839             block_size = {10, 10, 1};
    840             break;
    841         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
    842         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
    843             block_size = {12, 10, 1};
    844             break;
    845         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
    846         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
    847             block_size = {12, 12, 1};
    848             break;
    849         case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
    850         case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
    851         case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
    852         case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
    853             block_size = {8, 4, 1};
    854             break;
    855         case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
    856         case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
    857         case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
    858         case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
    859             block_size = {4, 4, 1};
    860             break;
    861         default:
    862             break;
    863     }
    864     return block_size;
    865 }
    866 
    867 VK_LAYER_EXPORT uint32_t FormatPlaneCount(VkFormat format) {
    868     switch (format) {
    869         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
    870         case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
    871         case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
    872         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
    873         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
    874         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
    875         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
    876         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
    877         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
    878         case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
    879         case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
    880         case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
    881             return 3u;
    882             break;
    883         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
    884         case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
    885         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
    886         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
    887         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
    888         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
    889         case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
    890         case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
    891             return 2u;
    892             break;
    893         default:
    894             return 1u;
    895             break;
    896     }
    897 }
    898 
    899 // Return format class of the specified format
    900 VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
    901     auto item = vk_format_table.find(format);
    902     if (item != vk_format_table.end()) {
    903         return item->second.format_class;
    904     }
    905     return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
    906 }
    907 
    908 // Return size, in bytes, of a pixel of the specified format
    909 VK_LAYER_EXPORT size_t FormatSize(VkFormat format) {
    910     auto item = vk_format_table.find(format);
    911     if (item != vk_format_table.end()) {
    912         return item->second.size;
    913     }
    914     return 0;
    915 }
    916 
    917 // Return the number of channels for a given format
    918 uint32_t FormatChannelCount(VkFormat format) {
    919     auto item = vk_format_table.find(format);
    920     if (item != vk_format_table.end()) {
    921         return item->second.channel_count;
    922     }
    923     return 0;
    924 }
    925 
    926 // Perform a zero-tolerant modulo operation
    927 VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
    928     VkDeviceSize result = 0;
    929     if (divisor != 0) {
    930         result = dividend % divisor;
    931     }
    932     return result;
    933 }
    934