xref: /aosp_15_r20/external/vulkan-validation-layers/layers/vk_format_utils.cpp (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi /* Copyright (c) 2015-2019 The Khronos Group Inc.
2*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 Valve Corporation
3*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 LunarG, Inc.
4*b7893ccfSSadaf Ebrahimi  *
5*b7893ccfSSadaf Ebrahimi  * Licensed under the Apache License, Version 2.0 (the "License");
6*b7893ccfSSadaf Ebrahimi  * you may not use this file except in compliance with the License.
7*b7893ccfSSadaf Ebrahimi  * You may obtain a copy of the License at
8*b7893ccfSSadaf Ebrahimi  *
9*b7893ccfSSadaf Ebrahimi  *     http://www.apache.org/licenses/LICENSE-2.0
10*b7893ccfSSadaf Ebrahimi  *
11*b7893ccfSSadaf Ebrahimi  * Unless required by applicable law or agreed to in writing, software
12*b7893ccfSSadaf Ebrahimi  * distributed under the License is distributed on an "AS IS" BASIS,
13*b7893ccfSSadaf Ebrahimi  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*b7893ccfSSadaf Ebrahimi  * See the License for the specific language governing permissions and
15*b7893ccfSSadaf Ebrahimi  * limitations under the License.
16*b7893ccfSSadaf Ebrahimi  *
17*b7893ccfSSadaf Ebrahimi  * Author: Mark Lobodzinski <[email protected]>
18*b7893ccfSSadaf Ebrahimi  * Author: Dave Houlton <[email protected]>
19*b7893ccfSSadaf Ebrahimi  *
20*b7893ccfSSadaf Ebrahimi  */
21*b7893ccfSSadaf Ebrahimi 
22*b7893ccfSSadaf Ebrahimi #include <string.h>
23*b7893ccfSSadaf Ebrahimi #include <string>
24*b7893ccfSSadaf Ebrahimi #include <vector>
25*b7893ccfSSadaf Ebrahimi #include <map>
26*b7893ccfSSadaf Ebrahimi #include "vulkan/vulkan.h"
27*b7893ccfSSadaf Ebrahimi #include "vk_format_utils.h"
28*b7893ccfSSadaf Ebrahimi 
29*b7893ccfSSadaf Ebrahimi struct VULKAN_FORMAT_INFO {
30*b7893ccfSSadaf Ebrahimi     uint32_t size;
31*b7893ccfSSadaf Ebrahimi     uint32_t channel_count;
32*b7893ccfSSadaf Ebrahimi     VkFormatCompatibilityClass format_class;
33*b7893ccfSSadaf Ebrahimi };
34*b7893ccfSSadaf Ebrahimi 
35*b7893ccfSSadaf Ebrahimi // Disable auto-formatting for this large table
36*b7893ccfSSadaf Ebrahimi // clang-format off
37*b7893ccfSSadaf Ebrahimi 
38*b7893ccfSSadaf Ebrahimi // Set up data structure with size(bytes) and number of channels for each Vulkan format
39*b7893ccfSSadaf Ebrahimi // For compressed and multi-plane formats, size is bytes per compressed or shared block
40*b7893ccfSSadaf Ebrahimi const std::map<VkFormat, VULKAN_FORMAT_INFO> vk_format_table = {
41*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_UNDEFINED,                   {0, 0, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT }},
42*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R4G4_UNORM_PACK8,            {1, 2, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
43*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R4G4B4A4_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
44*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B4G4R4A4_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
45*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R5G6B5_UNORM_PACK16,         {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
46*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B5G6R5_UNORM_PACK16,         {2, 3, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
47*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R5G5B5A1_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
48*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B5G5R5A1_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
49*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A1R5G5B5_UNORM_PACK16,       {2, 4, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
50*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_UNORM,                    {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
51*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_SNORM,                    {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
52*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_USCALED,                  {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
53*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_SSCALED,                  {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
54*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_UINT,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
55*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_SINT,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
56*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8_SRGB,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_8_BIT}},
57*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_UNORM,                  {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
58*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_SNORM,                  {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
59*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_USCALED,                {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
60*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_SSCALED,                {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
61*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_UINT,                   {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
62*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_SINT,                   {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
63*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8_SRGB,                   {2, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
64*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_UNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
65*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_SNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
66*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_USCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
67*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_SSCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
68*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_UINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
69*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_SINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
70*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8_SRGB,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
71*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_UNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
72*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_SNORM,                {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
73*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_USCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
74*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_SSCALED,              {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
75*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_UINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
76*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_SINT,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
77*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8_SRGB,                 {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_24_BIT}},
78*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_UNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
79*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_SNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
80*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_USCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
81*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_SSCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
82*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_UINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
83*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_SINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
84*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R8G8B8A8_SRGB,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
85*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_UNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
86*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_SNORM,              {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
87*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_USCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
88*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_SSCALED,            {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
89*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_UINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
90*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_SINT,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
91*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8A8_SRGB,               {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
92*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_UNORM_PACK32,       {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
93*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_SNORM_PACK32,       {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
94*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_USCALED_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
95*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_SSCALED_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
96*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_UINT_PACK32,        {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
97*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_SINT_PACK32,        {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
98*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A8B8G8R8_SRGB_PACK32,        {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
99*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2R10G10B10_UNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
100*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2R10G10B10_SNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
101*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2R10G10B10_USCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
102*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2R10G10B10_SSCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
103*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2R10G10B10_UINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
104*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2R10G10B10_SINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
105*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2B10G10R10_UNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
106*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2B10G10R10_SNORM_PACK32,    {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
107*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2B10G10R10_USCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
108*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2B10G10R10_SSCALED_PACK32,  {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
109*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2B10G10R10_UINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
110*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_A2B10G10R10_SINT_PACK32,     {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
111*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_UNORM,                   {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
112*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_SNORM,                   {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
113*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_USCALED,                 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
114*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_SSCALED,                 {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
115*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_UINT,                    {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
116*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_SINT,                    {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
117*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16_SFLOAT,                  {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
118*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_UNORM,                {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
119*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_SNORM,                {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
120*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_USCALED,              {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
121*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_SSCALED,              {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
122*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_UINT,                 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
123*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_SINT,                 {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
124*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16_SFLOAT,               {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
125*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_UNORM,             {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
126*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_SNORM,             {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
127*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_USCALED,           {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
128*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_SSCALED,           {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
129*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_UINT,              {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
130*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_SINT,              {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
131*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16_SFLOAT,            {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_48_BIT}},
132*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_UNORM,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
133*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_SNORM,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
134*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_USCALED,        {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
135*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_SSCALED,        {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
136*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_UINT,           {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
137*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_SINT,           {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
138*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R16G16B16A16_SFLOAT,         {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
139*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32_UINT,                    {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
140*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32_SINT,                    {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
141*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32_SFLOAT,                  {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
142*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32_UINT,                 {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
143*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32_SINT,                 {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
144*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32_SFLOAT,               {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
145*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32B32_UINT,              {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
146*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32B32_SINT,              {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
147*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32B32_SFLOAT,            {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_96_BIT}},
148*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32B32A32_UINT,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
149*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32B32A32_SINT,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
150*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R32G32B32A32_SFLOAT,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
151*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64_UINT,                    {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
152*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64_SINT,                    {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
153*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64_SFLOAT,                  {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_64_BIT}},
154*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64_UINT,                 {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
155*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64_SINT,                 {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
156*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64_SFLOAT,               {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_128_BIT}},
157*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64B64_UINT,              {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
158*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64B64_SINT,              {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
159*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64B64_SFLOAT,            {24, 3, VK_FORMAT_COMPATIBILITY_CLASS_192_BIT}},
160*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64B64A64_UINT,           {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
161*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64B64A64_SINT,           {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
162*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R64G64B64A64_SFLOAT,         {32, 4, VK_FORMAT_COMPATIBILITY_CLASS_256_BIT}},
163*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B10G11R11_UFLOAT_PACK32,     {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
164*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,      {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
165*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_D16_UNORM,                   {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
166*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_X8_D24_UNORM_PACK32,         {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
167*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_D32_SFLOAT,                  {4, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
168*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_S8_UINT,                     {1, 1, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
169*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_D16_UNORM_S8_UINT,           {3, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
170*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_D24_UNORM_S8_UINT,           {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
171*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_D32_SFLOAT_S8_UINT,          {8, 2, VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT}},
172*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC1_RGB_UNORM_BLOCK,         {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
173*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC1_RGB_SRGB_BLOCK,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGB_BIT}},
174*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC1_RGBA_UNORM_BLOCK,        {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
175*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC1_RGBA_SRGB_BLOCK,         {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC1_RGBA_BIT}},
176*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC2_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
177*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC2_SRGB_BLOCK,              {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC2_BIT}},
178*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC3_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
179*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC3_SRGB_BLOCK,              {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC3_BIT}},
180*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC4_UNORM_BLOCK,             {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
181*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC4_SNORM_BLOCK,             {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC4_BIT}},
182*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC5_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
183*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC5_SNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC5_BIT}},
184*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC6H_UFLOAT_BLOCK,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
185*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC6H_SFLOAT_BLOCK,           {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC6H_BIT}},
186*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC7_UNORM_BLOCK,             {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
187*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_BC7_SRGB_BLOCK,              {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_BC7_BIT}},
188*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,     {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
189*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,      {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGB_BIT}},
190*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,   {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
191*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,    {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_RGBA_BIT}},
192*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,   {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
193*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,    {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ETC2_EAC_RGBA_BIT}},
194*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_EAC_R11_UNORM_BLOCK,         {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
195*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_EAC_R11_SNORM_BLOCK,         {8, 1, VK_FORMAT_COMPATIBILITY_CLASS_EAC_R_BIT}},
196*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_EAC_R11G11_UNORM_BLOCK,      {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
197*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_EAC_R11G11_SNORM_BLOCK,      {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
198*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_4x4_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
199*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_4x4_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
200*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_5x4_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
201*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_5x4_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
202*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_5x5_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
203*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_5x5_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
204*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_6x5_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
205*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_6x5_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
206*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_6x6_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
207*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_6x6_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
208*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_8x5_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
209*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_8x5_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
210*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_8x6_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
211*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_8x6_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
212*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_8x8_UNORM_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
213*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_8x8_SRGB_BLOCK,         {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
214*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x5_UNORM_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
215*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x5_SRGB_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
216*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x6_UNORM_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
217*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x6_SRGB_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
218*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x8_UNORM_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
219*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x8_SRGB_BLOCK,        {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
220*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x10_UNORM_BLOCK,      {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
221*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_10x10_SRGB_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
222*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_12x10_UNORM_BLOCK,      {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
223*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_12x10_SRGB_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
224*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_12x12_UNORM_BLOCK,      {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
225*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_ASTC_12x12_SRGB_BLOCK,       {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
226*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
227*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
228*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
229*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
230*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
231*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
232*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
233*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,  {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_4BPP_BIT}},
234*b7893ccfSSadaf Ebrahimi     // KHR_sampler_YCbCr_conversion extension - single-plane variants
235*b7893ccfSSadaf Ebrahimi     // 'PACK' formats are normal, uncompressed
236*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R10X6_UNORM_PACK16,                          {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
237*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R10X6G10X6_UNORM_2PACK16,                    {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_32_BIT}},
238*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R10G10B10A10}},
239*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R12X4_UNORM_PACK16,                          {2, 1, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
240*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R12X4G12X4_UNORM_2PACK16,                    {4, 2, VK_FORMAT_COMPATIBILITY_CLASS_16_BIT}},
241*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,          {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_R12G12B12A12}},
242*b7893ccfSSadaf Ebrahimi     // _422 formats encode 2 texels per entry with B, R components shared - treated as compressed w/ 2x1 block size
243*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G8B8G8R8_422_UNORM,                          {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_G8B8G8R8}},
244*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B8G8R8G8_422_UNORM,                          {4, 4, VK_FORMAT_COMPATIBILITY_CLASS_32BIT_B8G8R8G8}},
245*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,      {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G10B10G10R10}},
246*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,      {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B10G10R10G10}},
247*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,      {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G12B12G12R12}},
248*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,      {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B12G12R12G12}},
249*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G16B16G16R16_422_UNORM,                      {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_G16B16G16R16}},
250*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_B16G16R16G16_422_UNORM,                      {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_64BIT_B16G16R16G16}},
251*b7893ccfSSadaf Ebrahimi     // KHR_sampler_YCbCr_conversion extension - multi-plane variants
252*b7893ccfSSadaf Ebrahimi     // Formats that 'share' components among texels (_420 and _422), size represents total bytes for the smallest possible texel block
253*b7893ccfSSadaf Ebrahimi     // _420 share B, R components within a 2x2 texel block
254*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,                   {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_420}},
255*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,                    {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_420}},
256*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,  {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_420}},
257*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,   {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_420}},
258*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16,  {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_420}},
259*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,   {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_420}},
260*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,                {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_420}},
261*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,                 {12, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_420}},
262*b7893ccfSSadaf Ebrahimi     // _422 share B, R components within a 2x1 texel block
263*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,                   {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_422}},
264*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,                    {4, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_2PLANE_422}},
265*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16,  {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_422}},
266*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,   {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_2PLANE_422}},
267*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16,  {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_422}},
268*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,   {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_2PLANE_422}},
269*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,                {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_422}},
270*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,                 {8, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_2PLANE_422}},
271*b7893ccfSSadaf Ebrahimi     // _444 do not share
272*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,                   {3, 3, VK_FORMAT_COMPATIBILITY_CLASS_8BIT_3PLANE_444}},
273*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,  {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_10BIT_3PLANE_444}},
274*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,  {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_12BIT_3PLANE_444}},
275*b7893ccfSSadaf Ebrahimi     {VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,                {6, 3, VK_FORMAT_COMPATIBILITY_CLASS_16BIT_3PLANE_444}}
276*b7893ccfSSadaf Ebrahimi };
277*b7893ccfSSadaf Ebrahimi 
278*b7893ccfSSadaf Ebrahimi // Renable formatting
279*b7893ccfSSadaf Ebrahimi // clang-format on
280*b7893ccfSSadaf Ebrahimi 
281*b7893ccfSSadaf Ebrahimi // Return true if format is an ETC2 or EAC compressed texture format
FormatIsCompressed_ETC2_EAC(VkFormat format)282*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsCompressed_ETC2_EAC(VkFormat format) {
283*b7893ccfSSadaf Ebrahimi     bool found = false;
284*b7893ccfSSadaf Ebrahimi 
285*b7893ccfSSadaf Ebrahimi     switch (format) {
286*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
287*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
288*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
289*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
290*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
291*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
292*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
293*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
294*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
295*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
296*b7893ccfSSadaf Ebrahimi             found = true;
297*b7893ccfSSadaf Ebrahimi             break;
298*b7893ccfSSadaf Ebrahimi         default:
299*b7893ccfSSadaf Ebrahimi             break;
300*b7893ccfSSadaf Ebrahimi     }
301*b7893ccfSSadaf Ebrahimi     return found;
302*b7893ccfSSadaf Ebrahimi }
303*b7893ccfSSadaf Ebrahimi 
304*b7893ccfSSadaf Ebrahimi // Return true if format is an ASTC compressed texture format
FormatIsCompressed_ASTC_LDR(VkFormat format)305*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format) {
306*b7893ccfSSadaf Ebrahimi     bool found = false;
307*b7893ccfSSadaf Ebrahimi 
308*b7893ccfSSadaf Ebrahimi     switch (format) {
309*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
310*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
311*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
312*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
313*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
314*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
315*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
316*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
317*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
318*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
319*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
320*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
321*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
322*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
323*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
324*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
325*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
326*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
327*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
328*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
329*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
330*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
331*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
332*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
333*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
334*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
335*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
336*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
337*b7893ccfSSadaf Ebrahimi             found = true;
338*b7893ccfSSadaf Ebrahimi             break;
339*b7893ccfSSadaf Ebrahimi         default:
340*b7893ccfSSadaf Ebrahimi             break;
341*b7893ccfSSadaf Ebrahimi     }
342*b7893ccfSSadaf Ebrahimi     return found;
343*b7893ccfSSadaf Ebrahimi }
344*b7893ccfSSadaf Ebrahimi 
345*b7893ccfSSadaf Ebrahimi // Return true if format is a BC compressed texture format
FormatIsCompressed_BC(VkFormat format)346*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format) {
347*b7893ccfSSadaf Ebrahimi     bool found = false;
348*b7893ccfSSadaf Ebrahimi 
349*b7893ccfSSadaf Ebrahimi     switch (format) {
350*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
351*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
352*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
353*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
354*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_UNORM_BLOCK:
355*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_SRGB_BLOCK:
356*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_UNORM_BLOCK:
357*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_SRGB_BLOCK:
358*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_UNORM_BLOCK:
359*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_SNORM_BLOCK:
360*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_UNORM_BLOCK:
361*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_SNORM_BLOCK:
362*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC6H_UFLOAT_BLOCK:
363*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC6H_SFLOAT_BLOCK:
364*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_UNORM_BLOCK:
365*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_SRGB_BLOCK:
366*b7893ccfSSadaf Ebrahimi             found = true;
367*b7893ccfSSadaf Ebrahimi             break;
368*b7893ccfSSadaf Ebrahimi         default:
369*b7893ccfSSadaf Ebrahimi             break;
370*b7893ccfSSadaf Ebrahimi     }
371*b7893ccfSSadaf Ebrahimi     return found;
372*b7893ccfSSadaf Ebrahimi }
373*b7893ccfSSadaf Ebrahimi 
374*b7893ccfSSadaf Ebrahimi // Return true if format is a PVRTC compressed texture format
FormatIsCompressed_PVRTC(VkFormat format)375*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsCompressed_PVRTC(VkFormat format) {
376*b7893ccfSSadaf Ebrahimi     bool found = false;
377*b7893ccfSSadaf Ebrahimi 
378*b7893ccfSSadaf Ebrahimi     switch (format) {
379*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
380*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
381*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
382*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
383*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
384*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
385*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
386*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
387*b7893ccfSSadaf Ebrahimi             found = true;
388*b7893ccfSSadaf Ebrahimi             break;
389*b7893ccfSSadaf Ebrahimi         default:
390*b7893ccfSSadaf Ebrahimi             break;
391*b7893ccfSSadaf Ebrahimi     }
392*b7893ccfSSadaf Ebrahimi     return found;
393*b7893ccfSSadaf Ebrahimi }
394*b7893ccfSSadaf Ebrahimi 
395*b7893ccfSSadaf Ebrahimi // Single-plane "_422" formats are treated as 2x1 compressed (for copies)
FormatIsSinglePlane_422(VkFormat format)396*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsSinglePlane_422(VkFormat format) {
397*b7893ccfSSadaf Ebrahimi     bool found = false;
398*b7893ccfSSadaf Ebrahimi 
399*b7893ccfSSadaf Ebrahimi     switch (format) {
400*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
401*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
402*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
403*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
404*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
405*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
406*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
407*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
408*b7893ccfSSadaf Ebrahimi             found = true;
409*b7893ccfSSadaf Ebrahimi             break;
410*b7893ccfSSadaf Ebrahimi         default:
411*b7893ccfSSadaf Ebrahimi             break;
412*b7893ccfSSadaf Ebrahimi     }
413*b7893ccfSSadaf Ebrahimi     return found;
414*b7893ccfSSadaf Ebrahimi }
415*b7893ccfSSadaf Ebrahimi 
416*b7893ccfSSadaf Ebrahimi // Return true if format is compressed
FormatIsCompressed(VkFormat format)417*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
418*b7893ccfSSadaf Ebrahimi     return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
419*b7893ccfSSadaf Ebrahimi             FormatIsCompressed_PVRTC(format));
420*b7893ccfSSadaf Ebrahimi }
421*b7893ccfSSadaf Ebrahimi // Return true if format is packed
FormatIsPacked(VkFormat format)422*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsPacked(VkFormat format) {
423*b7893ccfSSadaf Ebrahimi     bool found = false;
424*b7893ccfSSadaf Ebrahimi 
425*b7893ccfSSadaf Ebrahimi     switch (format) {
426*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R4G4_UNORM_PACK8:
427*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
428*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
429*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R5G6B5_UNORM_PACK16:
430*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B5G6R5_UNORM_PACK16:
431*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
432*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
433*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
434*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
435*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
436*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
437*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
438*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_UINT_PACK32:
439*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SINT_PACK32:
440*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
441*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
442*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
443*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
444*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
445*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_UINT_PACK32:
446*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SINT_PACK32:
447*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
448*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
449*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
450*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
451*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_UINT_PACK32:
452*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SINT_PACK32:
453*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
454*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
455*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_X8_D24_UNORM_PACK32:
456*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R10X6_UNORM_PACK16:
457*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
458*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
459*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
460*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
461*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R12X4_UNORM_PACK16:
462*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
463*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
464*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
465*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
466*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
467*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
468*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
469*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
470*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
471*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
472*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
473*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
474*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
475*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
476*b7893ccfSSadaf Ebrahimi             found = true;
477*b7893ccfSSadaf Ebrahimi             break;
478*b7893ccfSSadaf Ebrahimi         default:
479*b7893ccfSSadaf Ebrahimi             break;
480*b7893ccfSSadaf Ebrahimi     }
481*b7893ccfSSadaf Ebrahimi     return found;
482*b7893ccfSSadaf Ebrahimi }
483*b7893ccfSSadaf Ebrahimi 
484*b7893ccfSSadaf Ebrahimi // Return true if format is 'normal', with one texel per format element
FormatElementIsTexel(VkFormat format)485*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatElementIsTexel(VkFormat format) {
486*b7893ccfSSadaf Ebrahimi     if (FormatIsPacked(format) || FormatIsCompressed(format) || FormatIsSinglePlane_422(format) || FormatIsMultiplane(format)) {
487*b7893ccfSSadaf Ebrahimi         return false;
488*b7893ccfSSadaf Ebrahimi     } else {
489*b7893ccfSSadaf Ebrahimi         return true;
490*b7893ccfSSadaf Ebrahimi     }
491*b7893ccfSSadaf Ebrahimi }
492*b7893ccfSSadaf Ebrahimi 
493*b7893ccfSSadaf Ebrahimi // Return true if format is a depth or stencil format
FormatIsDepthOrStencil(VkFormat format)494*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsDepthOrStencil(VkFormat format) {
495*b7893ccfSSadaf Ebrahimi     return (FormatIsDepthAndStencil(format) || FormatIsDepthOnly(format) || FormatIsStencilOnly(format));
496*b7893ccfSSadaf Ebrahimi }
497*b7893ccfSSadaf Ebrahimi 
498*b7893ccfSSadaf Ebrahimi // Return true if format contains depth and stencil information
FormatIsDepthAndStencil(VkFormat format)499*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsDepthAndStencil(VkFormat format) {
500*b7893ccfSSadaf Ebrahimi     bool is_ds = false;
501*b7893ccfSSadaf Ebrahimi 
502*b7893ccfSSadaf Ebrahimi     switch (format) {
503*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM_S8_UINT:
504*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D24_UNORM_S8_UINT:
505*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT_S8_UINT:
506*b7893ccfSSadaf Ebrahimi             is_ds = true;
507*b7893ccfSSadaf Ebrahimi             break;
508*b7893ccfSSadaf Ebrahimi         default:
509*b7893ccfSSadaf Ebrahimi             break;
510*b7893ccfSSadaf Ebrahimi     }
511*b7893ccfSSadaf Ebrahimi     return is_ds;
512*b7893ccfSSadaf Ebrahimi }
513*b7893ccfSSadaf Ebrahimi 
514*b7893ccfSSadaf Ebrahimi // Return true if format is a stencil-only format
FormatIsStencilOnly(VkFormat format)515*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format) { return (format == VK_FORMAT_S8_UINT); }
516*b7893ccfSSadaf Ebrahimi 
517*b7893ccfSSadaf Ebrahimi // Return true if format is a depth-only format
FormatIsDepthOnly(VkFormat format)518*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format) {
519*b7893ccfSSadaf Ebrahimi     bool is_depth = false;
520*b7893ccfSSadaf Ebrahimi 
521*b7893ccfSSadaf Ebrahimi     switch (format) {
522*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM:
523*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_X8_D24_UNORM_PACK32:
524*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT:
525*b7893ccfSSadaf Ebrahimi             is_depth = true;
526*b7893ccfSSadaf Ebrahimi             break;
527*b7893ccfSSadaf Ebrahimi         default:
528*b7893ccfSSadaf Ebrahimi             break;
529*b7893ccfSSadaf Ebrahimi     }
530*b7893ccfSSadaf Ebrahimi 
531*b7893ccfSSadaf Ebrahimi     return is_depth;
532*b7893ccfSSadaf Ebrahimi }
533*b7893ccfSSadaf Ebrahimi 
534*b7893ccfSSadaf Ebrahimi // Return true if format is of type NORM
FormatIsNorm(VkFormat format)535*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsNorm(VkFormat format) {
536*b7893ccfSSadaf Ebrahimi     bool is_norm = false;
537*b7893ccfSSadaf Ebrahimi 
538*b7893ccfSSadaf Ebrahimi     switch (format) {
539*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R4G4_UNORM_PACK8:
540*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
541*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R5G6B5_UNORM_PACK16:
542*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
543*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
544*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_UNORM:
545*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_SNORM:
546*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_UNORM:
547*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_SNORM:
548*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_UNORM:
549*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_SNORM:
550*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_UNORM:
551*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_SNORM:
552*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
553*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
554*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
555*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
556*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_UNORM:
557*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_SNORM:
558*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_UNORM:
559*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_SNORM:
560*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_UNORM:
561*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_SNORM:
562*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_UNORM:
563*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_SNORM:
564*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
565*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_UNORM_BLOCK:
566*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_UNORM_BLOCK:
567*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_UNORM_BLOCK:
568*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_SNORM_BLOCK:
569*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_UNORM_BLOCK:
570*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_SNORM_BLOCK:
571*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_UNORM_BLOCK:
572*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
573*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
574*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
575*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
576*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
577*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
578*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
579*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
580*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
581*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
582*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
583*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
584*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
585*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
586*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
587*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
588*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
589*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
590*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
591*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
592*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
593*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B5G6R5_UNORM_PACK16:
594*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_UNORM:
595*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_SNORM:
596*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_UNORM:
597*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_SNORM:
598*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
599*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
600*b7893ccfSSadaf Ebrahimi             is_norm = true;
601*b7893ccfSSadaf Ebrahimi             break;
602*b7893ccfSSadaf Ebrahimi         default:
603*b7893ccfSSadaf Ebrahimi             break;
604*b7893ccfSSadaf Ebrahimi     }
605*b7893ccfSSadaf Ebrahimi 
606*b7893ccfSSadaf Ebrahimi     return is_norm;
607*b7893ccfSSadaf Ebrahimi }
608*b7893ccfSSadaf Ebrahimi 
609*b7893ccfSSadaf Ebrahimi // Return true if format is of type UNORM
FormatIsUNorm(VkFormat format)610*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsUNorm(VkFormat format) {
611*b7893ccfSSadaf Ebrahimi     bool is_unorm = false;
612*b7893ccfSSadaf Ebrahimi 
613*b7893ccfSSadaf Ebrahimi     switch (format) {
614*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R4G4_UNORM_PACK8:
615*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
616*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R5G6B5_UNORM_PACK16:
617*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
618*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
619*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_UNORM:
620*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_UNORM:
621*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_UNORM:
622*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_UNORM:
623*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
624*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
625*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_UNORM:
626*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_UNORM:
627*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_UNORM:
628*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_UNORM:
629*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
630*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_UNORM_BLOCK:
631*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_UNORM_BLOCK:
632*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_UNORM_BLOCK:
633*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_UNORM_BLOCK:
634*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_UNORM_BLOCK:
635*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
636*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
637*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
638*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
639*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
640*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
641*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
642*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
643*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
644*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
645*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
646*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
647*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
648*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
649*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
650*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
651*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
652*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
653*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
654*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B5G6R5_UNORM_PACK16:
655*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_UNORM:
656*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_UNORM:
657*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
658*b7893ccfSSadaf Ebrahimi             is_unorm = true;
659*b7893ccfSSadaf Ebrahimi             break;
660*b7893ccfSSadaf Ebrahimi         default:
661*b7893ccfSSadaf Ebrahimi             break;
662*b7893ccfSSadaf Ebrahimi     }
663*b7893ccfSSadaf Ebrahimi 
664*b7893ccfSSadaf Ebrahimi     return is_unorm;
665*b7893ccfSSadaf Ebrahimi }
666*b7893ccfSSadaf Ebrahimi 
667*b7893ccfSSadaf Ebrahimi // Return true if format is of type SNORM
FormatIsSNorm(VkFormat format)668*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsSNorm(VkFormat format) {
669*b7893ccfSSadaf Ebrahimi     bool is_snorm = false;
670*b7893ccfSSadaf Ebrahimi 
671*b7893ccfSSadaf Ebrahimi     switch (format) {
672*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_SNORM:
673*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_SNORM:
674*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_SNORM:
675*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_SNORM:
676*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
677*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
678*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_SNORM:
679*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_SNORM:
680*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_SNORM:
681*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_SNORM:
682*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_SNORM_BLOCK:
683*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_SNORM_BLOCK:
684*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
685*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
686*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_SNORM:
687*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_SNORM:
688*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
689*b7893ccfSSadaf Ebrahimi             is_snorm = true;
690*b7893ccfSSadaf Ebrahimi             break;
691*b7893ccfSSadaf Ebrahimi         default:
692*b7893ccfSSadaf Ebrahimi             break;
693*b7893ccfSSadaf Ebrahimi     }
694*b7893ccfSSadaf Ebrahimi 
695*b7893ccfSSadaf Ebrahimi     return is_snorm;
696*b7893ccfSSadaf Ebrahimi }
697*b7893ccfSSadaf Ebrahimi 
698*b7893ccfSSadaf Ebrahimi // Return true if format is an integer format
FormatIsInt(VkFormat format)699*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsInt(VkFormat format) { return (FormatIsSInt(format) || FormatIsUInt(format)); }
700*b7893ccfSSadaf Ebrahimi 
701*b7893ccfSSadaf Ebrahimi // Return true if format is an unsigned integer format
FormatIsUInt(VkFormat format)702*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsUInt(VkFormat format) {
703*b7893ccfSSadaf Ebrahimi     bool is_uint = false;
704*b7893ccfSSadaf Ebrahimi 
705*b7893ccfSSadaf Ebrahimi     switch (format) {
706*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_UINT:
707*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_S8_UINT:
708*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_UINT:
709*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_UINT:
710*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_UINT:
711*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_UINT_PACK32:
712*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_UINT_PACK32:
713*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_UINT:
714*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_UINT:
715*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_UINT:
716*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_UINT:
717*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32_UINT:
718*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32_UINT:
719*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32B32_UINT:
720*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32B32A32_UINT:
721*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64_UINT:
722*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64_UINT:
723*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64B64_UINT:
724*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64B64A64_UINT:
725*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_UINT:
726*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_UINT:
727*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_UINT_PACK32:
728*b7893ccfSSadaf Ebrahimi             is_uint = true;
729*b7893ccfSSadaf Ebrahimi             break;
730*b7893ccfSSadaf Ebrahimi         default:
731*b7893ccfSSadaf Ebrahimi             break;
732*b7893ccfSSadaf Ebrahimi     }
733*b7893ccfSSadaf Ebrahimi 
734*b7893ccfSSadaf Ebrahimi     return is_uint;
735*b7893ccfSSadaf Ebrahimi }
736*b7893ccfSSadaf Ebrahimi 
737*b7893ccfSSadaf Ebrahimi // Return true if format is a signed integer format
FormatIsSInt(VkFormat format)738*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsSInt(VkFormat format) {
739*b7893ccfSSadaf Ebrahimi     bool is_sint = false;
740*b7893ccfSSadaf Ebrahimi 
741*b7893ccfSSadaf Ebrahimi     switch (format) {
742*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_SINT:
743*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_SINT:
744*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_SINT:
745*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_SINT:
746*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SINT_PACK32:
747*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SINT_PACK32:
748*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_SINT:
749*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_SINT:
750*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_SINT:
751*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_SINT:
752*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32_SINT:
753*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32_SINT:
754*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32B32_SINT:
755*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32B32A32_SINT:
756*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64_SINT:
757*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64_SINT:
758*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64B64_SINT:
759*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64B64A64_SINT:
760*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_SINT:
761*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_SINT:
762*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SINT_PACK32:
763*b7893ccfSSadaf Ebrahimi             is_sint = true;
764*b7893ccfSSadaf Ebrahimi             break;
765*b7893ccfSSadaf Ebrahimi         default:
766*b7893ccfSSadaf Ebrahimi             break;
767*b7893ccfSSadaf Ebrahimi     }
768*b7893ccfSSadaf Ebrahimi 
769*b7893ccfSSadaf Ebrahimi     return is_sint;
770*b7893ccfSSadaf Ebrahimi }
771*b7893ccfSSadaf Ebrahimi 
772*b7893ccfSSadaf Ebrahimi // Return true if format is a floating-point format
FormatIsFloat(VkFormat format)773*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsFloat(VkFormat format) {
774*b7893ccfSSadaf Ebrahimi     bool is_float = false;
775*b7893ccfSSadaf Ebrahimi 
776*b7893ccfSSadaf Ebrahimi     switch (format) {
777*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_SFLOAT:
778*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_SFLOAT:
779*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_SFLOAT:
780*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_SFLOAT:
781*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32_SFLOAT:
782*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32_SFLOAT:
783*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32B32_SFLOAT:
784*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R32G32B32A32_SFLOAT:
785*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64_SFLOAT:
786*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64_SFLOAT:
787*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64B64_SFLOAT:
788*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R64G64B64A64_SFLOAT:
789*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
790*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
791*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC6H_UFLOAT_BLOCK:
792*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC6H_SFLOAT_BLOCK:
793*b7893ccfSSadaf Ebrahimi             is_float = true;
794*b7893ccfSSadaf Ebrahimi             break;
795*b7893ccfSSadaf Ebrahimi         default:
796*b7893ccfSSadaf Ebrahimi             break;
797*b7893ccfSSadaf Ebrahimi     }
798*b7893ccfSSadaf Ebrahimi 
799*b7893ccfSSadaf Ebrahimi     return is_float;
800*b7893ccfSSadaf Ebrahimi }
801*b7893ccfSSadaf Ebrahimi 
802*b7893ccfSSadaf Ebrahimi // Return true if format is in the SRGB colorspace
FormatIsSRGB(VkFormat format)803*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format) {
804*b7893ccfSSadaf Ebrahimi     bool is_srgb = false;
805*b7893ccfSSadaf Ebrahimi 
806*b7893ccfSSadaf Ebrahimi     switch (format) {
807*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_SRGB:
808*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_SRGB:
809*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_SRGB:
810*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_SRGB:
811*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
812*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
813*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_SRGB_BLOCK:
814*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_SRGB_BLOCK:
815*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_SRGB_BLOCK:
816*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
817*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
818*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
819*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
820*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
821*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
822*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
823*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
824*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
825*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
826*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
827*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
828*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
829*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
830*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
831*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
832*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
833*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_SRGB:
834*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_SRGB:
835*b7893ccfSSadaf Ebrahimi             is_srgb = true;
836*b7893ccfSSadaf Ebrahimi             break;
837*b7893ccfSSadaf Ebrahimi         default:
838*b7893ccfSSadaf Ebrahimi             break;
839*b7893ccfSSadaf Ebrahimi     }
840*b7893ccfSSadaf Ebrahimi 
841*b7893ccfSSadaf Ebrahimi     return is_srgb;
842*b7893ccfSSadaf Ebrahimi }
843*b7893ccfSSadaf Ebrahimi 
844*b7893ccfSSadaf Ebrahimi // Return true if format is a USCALED format
FormatIsUScaled(VkFormat format)845*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format) {
846*b7893ccfSSadaf Ebrahimi     bool is_uscaled = false;
847*b7893ccfSSadaf Ebrahimi 
848*b7893ccfSSadaf Ebrahimi     switch (format) {
849*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_USCALED:
850*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_USCALED:
851*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_USCALED:
852*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_USCALED:
853*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_USCALED:
854*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_USCALED:
855*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
856*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
857*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
858*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_USCALED:
859*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_USCALED:
860*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_USCALED:
861*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_USCALED:
862*b7893ccfSSadaf Ebrahimi             is_uscaled = true;
863*b7893ccfSSadaf Ebrahimi             break;
864*b7893ccfSSadaf Ebrahimi         default:
865*b7893ccfSSadaf Ebrahimi             break;
866*b7893ccfSSadaf Ebrahimi     }
867*b7893ccfSSadaf Ebrahimi 
868*b7893ccfSSadaf Ebrahimi     return is_uscaled;
869*b7893ccfSSadaf Ebrahimi }
870*b7893ccfSSadaf Ebrahimi 
871*b7893ccfSSadaf Ebrahimi // Return true if format is a SSCALED format
FormatIsSScaled(VkFormat format)872*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format) {
873*b7893ccfSSadaf Ebrahimi     bool is_sscaled = false;
874*b7893ccfSSadaf Ebrahimi 
875*b7893ccfSSadaf Ebrahimi     switch (format) {
876*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8_SSCALED:
877*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8_SSCALED:
878*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8_SSCALED:
879*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8_SSCALED:
880*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R8G8B8A8_SSCALED:
881*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8A8_SSCALED:
882*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
883*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
884*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
885*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16_SSCALED:
886*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16_SSCALED:
887*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16_SSCALED:
888*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_R16G16B16A16_SSCALED:
889*b7893ccfSSadaf Ebrahimi             is_sscaled = true;
890*b7893ccfSSadaf Ebrahimi             break;
891*b7893ccfSSadaf Ebrahimi         default:
892*b7893ccfSSadaf Ebrahimi             break;
893*b7893ccfSSadaf Ebrahimi     }
894*b7893ccfSSadaf Ebrahimi 
895*b7893ccfSSadaf Ebrahimi     return is_sscaled;
896*b7893ccfSSadaf Ebrahimi }
897*b7893ccfSSadaf Ebrahimi 
898*b7893ccfSSadaf Ebrahimi // Return texel block sizes for all formats
899*b7893ccfSSadaf Ebrahimi // Uncompressed formats return {1, 1, 1}
900*b7893ccfSSadaf Ebrahimi // Compressed formats return the compression block extents
901*b7893ccfSSadaf Ebrahimi // Multiplane formats return the 'shared' extent of their low-res channel(s)
FormatTexelBlockExtent(VkFormat format)902*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkExtent3D FormatTexelBlockExtent(VkFormat format) {
903*b7893ccfSSadaf Ebrahimi     VkExtent3D block_size = {1, 1, 1};
904*b7893ccfSSadaf Ebrahimi     switch (format) {
905*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
906*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
907*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
908*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
909*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_UNORM_BLOCK:
910*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC2_SRGB_BLOCK:
911*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_UNORM_BLOCK:
912*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC3_SRGB_BLOCK:
913*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_UNORM_BLOCK:
914*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC4_SNORM_BLOCK:
915*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_UNORM_BLOCK:
916*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC5_SNORM_BLOCK:
917*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC6H_UFLOAT_BLOCK:
918*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC6H_SFLOAT_BLOCK:
919*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_UNORM_BLOCK:
920*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_BC7_SRGB_BLOCK:
921*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
922*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
923*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
924*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
925*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
926*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
927*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_UNORM_BLOCK:
928*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11_SNORM_BLOCK:
929*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
930*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
931*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
932*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
933*b7893ccfSSadaf Ebrahimi             block_size = {4, 4, 1};
934*b7893ccfSSadaf Ebrahimi             break;
935*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
936*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
937*b7893ccfSSadaf Ebrahimi             block_size = {5, 4, 1};
938*b7893ccfSSadaf Ebrahimi             break;
939*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
940*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
941*b7893ccfSSadaf Ebrahimi             block_size = {5, 5, 1};
942*b7893ccfSSadaf Ebrahimi             break;
943*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
944*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
945*b7893ccfSSadaf Ebrahimi             block_size = {6, 5, 1};
946*b7893ccfSSadaf Ebrahimi             break;
947*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
948*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
949*b7893ccfSSadaf Ebrahimi             block_size = {6, 6, 1};
950*b7893ccfSSadaf Ebrahimi             break;
951*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
952*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
953*b7893ccfSSadaf Ebrahimi             block_size = {8, 5, 1};
954*b7893ccfSSadaf Ebrahimi             break;
955*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
956*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
957*b7893ccfSSadaf Ebrahimi             block_size = {8, 6, 1};
958*b7893ccfSSadaf Ebrahimi             break;
959*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
960*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
961*b7893ccfSSadaf Ebrahimi             block_size = {8, 8, 1};
962*b7893ccfSSadaf Ebrahimi             break;
963*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
964*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
965*b7893ccfSSadaf Ebrahimi             block_size = {10, 5, 1};
966*b7893ccfSSadaf Ebrahimi             break;
967*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
968*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
969*b7893ccfSSadaf Ebrahimi             block_size = {10, 6, 1};
970*b7893ccfSSadaf Ebrahimi             break;
971*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
972*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
973*b7893ccfSSadaf Ebrahimi             block_size = {10, 8, 1};
974*b7893ccfSSadaf Ebrahimi             break;
975*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
976*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
977*b7893ccfSSadaf Ebrahimi             block_size = {10, 10, 1};
978*b7893ccfSSadaf Ebrahimi             break;
979*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
980*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
981*b7893ccfSSadaf Ebrahimi             block_size = {12, 10, 1};
982*b7893ccfSSadaf Ebrahimi             break;
983*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
984*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
985*b7893ccfSSadaf Ebrahimi             block_size = {12, 12, 1};
986*b7893ccfSSadaf Ebrahimi             break;
987*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
988*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
989*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
990*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
991*b7893ccfSSadaf Ebrahimi             block_size = {8, 4, 1};
992*b7893ccfSSadaf Ebrahimi             break;
993*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
994*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
995*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
996*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
997*b7893ccfSSadaf Ebrahimi             block_size = {4, 4, 1};
998*b7893ccfSSadaf Ebrahimi             break;
999*b7893ccfSSadaf Ebrahimi         // (KHR_sampler_ycbcr_conversion) _422 single-plane formats are treated as 2x1 compressed (for copies)
1000*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8B8G8R8_422_UNORM:
1001*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B8G8R8G8_422_UNORM:
1002*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
1003*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
1004*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
1005*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
1006*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16B16G16R16_422_UNORM:
1007*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_B16G16R16G16_422_UNORM:
1008*b7893ccfSSadaf Ebrahimi             block_size = {2, 1, 1};
1009*b7893ccfSSadaf Ebrahimi             break;
1010*b7893ccfSSadaf Ebrahimi         // _422 multi-plane formats are not considered compressed, but shared components form a logical 2x1 block
1011*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
1012*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
1013*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
1014*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
1015*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
1016*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
1017*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
1018*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
1019*b7893ccfSSadaf Ebrahimi             block_size = {2, 1, 1};
1020*b7893ccfSSadaf Ebrahimi             break;
1021*b7893ccfSSadaf Ebrahimi         // _420 formats are not considered compressed, but shared components form a logical 2x2 block
1022*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
1023*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
1024*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
1025*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
1026*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
1027*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
1028*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
1029*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
1030*b7893ccfSSadaf Ebrahimi             block_size = {2, 2, 1};
1031*b7893ccfSSadaf Ebrahimi             break;
1032*b7893ccfSSadaf Ebrahimi         // _444 multi-plane formats do not share components, default to 1x1
1033*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
1034*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
1035*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
1036*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
1037*b7893ccfSSadaf Ebrahimi         default:
1038*b7893ccfSSadaf Ebrahimi             break;
1039*b7893ccfSSadaf Ebrahimi     }
1040*b7893ccfSSadaf Ebrahimi     return block_size;
1041*b7893ccfSSadaf Ebrahimi }
1042*b7893ccfSSadaf Ebrahimi 
FormatDepthSize(VkFormat format)1043*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT uint32_t FormatDepthSize(VkFormat format) {
1044*b7893ccfSSadaf Ebrahimi     uint32_t depth_size = 0;
1045*b7893ccfSSadaf Ebrahimi     switch (format) {
1046*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM:
1047*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM_S8_UINT:
1048*b7893ccfSSadaf Ebrahimi             depth_size = 16;
1049*b7893ccfSSadaf Ebrahimi             break;
1050*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_X8_D24_UNORM_PACK32:
1051*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D24_UNORM_S8_UINT:
1052*b7893ccfSSadaf Ebrahimi             depth_size = 24;
1053*b7893ccfSSadaf Ebrahimi             break;
1054*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT:
1055*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT_S8_UINT:
1056*b7893ccfSSadaf Ebrahimi             depth_size = 32;
1057*b7893ccfSSadaf Ebrahimi             break;
1058*b7893ccfSSadaf Ebrahimi 
1059*b7893ccfSSadaf Ebrahimi         default:
1060*b7893ccfSSadaf Ebrahimi             break;
1061*b7893ccfSSadaf Ebrahimi     }
1062*b7893ccfSSadaf Ebrahimi     return depth_size;
1063*b7893ccfSSadaf Ebrahimi }
1064*b7893ccfSSadaf Ebrahimi 
FormatDepthNumericalType(VkFormat format)1065*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkFormatNumericalType FormatDepthNumericalType(VkFormat format) {
1066*b7893ccfSSadaf Ebrahimi     VkFormatNumericalType numerical_type = VK_FORMAT_NUMERICAL_TYPE_NONE;
1067*b7893ccfSSadaf Ebrahimi     switch (format) {
1068*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM:
1069*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM_S8_UINT:
1070*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_X8_D24_UNORM_PACK32:
1071*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D24_UNORM_S8_UINT:
1072*b7893ccfSSadaf Ebrahimi             numerical_type = VK_FORMAT_NUMERICAL_TYPE_UNORM;
1073*b7893ccfSSadaf Ebrahimi             break;
1074*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT:
1075*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT_S8_UINT:
1076*b7893ccfSSadaf Ebrahimi             numerical_type = VK_FORMAT_NUMERICAL_TYPE_SFLOAT;
1077*b7893ccfSSadaf Ebrahimi             break;
1078*b7893ccfSSadaf Ebrahimi 
1079*b7893ccfSSadaf Ebrahimi         default:
1080*b7893ccfSSadaf Ebrahimi             break;
1081*b7893ccfSSadaf Ebrahimi     }
1082*b7893ccfSSadaf Ebrahimi     return numerical_type;
1083*b7893ccfSSadaf Ebrahimi }
1084*b7893ccfSSadaf Ebrahimi 
FormatStencilSize(VkFormat format)1085*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT uint32_t FormatStencilSize(VkFormat format) {
1086*b7893ccfSSadaf Ebrahimi     uint32_t stencil_size = 0;
1087*b7893ccfSSadaf Ebrahimi     switch (format) {
1088*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_S8_UINT:
1089*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM_S8_UINT:
1090*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D24_UNORM_S8_UINT:
1091*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT_S8_UINT:
1092*b7893ccfSSadaf Ebrahimi             stencil_size = 8;
1093*b7893ccfSSadaf Ebrahimi             break;
1094*b7893ccfSSadaf Ebrahimi 
1095*b7893ccfSSadaf Ebrahimi         default:
1096*b7893ccfSSadaf Ebrahimi             break;
1097*b7893ccfSSadaf Ebrahimi     }
1098*b7893ccfSSadaf Ebrahimi     return stencil_size;
1099*b7893ccfSSadaf Ebrahimi }
1100*b7893ccfSSadaf Ebrahimi 
FormatStencilNumericalType(VkFormat format)1101*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkFormatNumericalType FormatStencilNumericalType(VkFormat format) {
1102*b7893ccfSSadaf Ebrahimi     VkFormatNumericalType numerical_type = VK_FORMAT_NUMERICAL_TYPE_NONE;
1103*b7893ccfSSadaf Ebrahimi     switch (format) {
1104*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_S8_UINT:
1105*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D16_UNORM_S8_UINT:
1106*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D24_UNORM_S8_UINT:
1107*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_D32_SFLOAT_S8_UINT:
1108*b7893ccfSSadaf Ebrahimi             numerical_type = VK_FORMAT_NUMERICAL_TYPE_UINT;
1109*b7893ccfSSadaf Ebrahimi             break;
1110*b7893ccfSSadaf Ebrahimi 
1111*b7893ccfSSadaf Ebrahimi         default:
1112*b7893ccfSSadaf Ebrahimi             break;
1113*b7893ccfSSadaf Ebrahimi     }
1114*b7893ccfSSadaf Ebrahimi     return numerical_type;
1115*b7893ccfSSadaf Ebrahimi }
1116*b7893ccfSSadaf Ebrahimi 
FormatPlaneCount(VkFormat format)1117*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT uint32_t FormatPlaneCount(VkFormat format) {
1118*b7893ccfSSadaf Ebrahimi     switch (format) {
1119*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
1120*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
1121*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
1122*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
1123*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
1124*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
1125*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
1126*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
1127*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
1128*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
1129*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
1130*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
1131*b7893ccfSSadaf Ebrahimi             return 3;
1132*b7893ccfSSadaf Ebrahimi             break;
1133*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
1134*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
1135*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
1136*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
1137*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
1138*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
1139*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
1140*b7893ccfSSadaf Ebrahimi         case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
1141*b7893ccfSSadaf Ebrahimi             return 2;
1142*b7893ccfSSadaf Ebrahimi             break;
1143*b7893ccfSSadaf Ebrahimi         default:
1144*b7893ccfSSadaf Ebrahimi             return 1;
1145*b7893ccfSSadaf Ebrahimi             break;
1146*b7893ccfSSadaf Ebrahimi     }
1147*b7893ccfSSadaf Ebrahimi }
1148*b7893ccfSSadaf Ebrahimi 
1149*b7893ccfSSadaf Ebrahimi // Return format class of the specified format
FormatCompatibilityClass(VkFormat format)1150*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format) {
1151*b7893ccfSSadaf Ebrahimi     auto item = vk_format_table.find(format);
1152*b7893ccfSSadaf Ebrahimi     if (item != vk_format_table.end()) {
1153*b7893ccfSSadaf Ebrahimi         return item->second.format_class;
1154*b7893ccfSSadaf Ebrahimi     }
1155*b7893ccfSSadaf Ebrahimi     return VK_FORMAT_COMPATIBILITY_CLASS_NONE_BIT;
1156*b7893ccfSSadaf Ebrahimi }
1157*b7893ccfSSadaf Ebrahimi 
1158*b7893ccfSSadaf Ebrahimi // Return size, in bytes, of one element of the specified format
1159*b7893ccfSSadaf Ebrahimi // For uncompressed this is one texel, for compressed it is one block
FormatElementSize(VkFormat format,VkImageAspectFlags aspectMask)1160*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT uint32_t FormatElementSize(VkFormat format, VkImageAspectFlags aspectMask) {
1161*b7893ccfSSadaf Ebrahimi     // Handle special buffer packing rules for specific depth/stencil formats
1162*b7893ccfSSadaf Ebrahimi     if (aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
1163*b7893ccfSSadaf Ebrahimi         format = VK_FORMAT_S8_UINT;
1164*b7893ccfSSadaf Ebrahimi     } else if (aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
1165*b7893ccfSSadaf Ebrahimi         switch (format) {
1166*b7893ccfSSadaf Ebrahimi             case VK_FORMAT_D16_UNORM_S8_UINT:
1167*b7893ccfSSadaf Ebrahimi                 format = VK_FORMAT_D16_UNORM;
1168*b7893ccfSSadaf Ebrahimi                 break;
1169*b7893ccfSSadaf Ebrahimi             case VK_FORMAT_D32_SFLOAT_S8_UINT:
1170*b7893ccfSSadaf Ebrahimi                 format = VK_FORMAT_D32_SFLOAT;
1171*b7893ccfSSadaf Ebrahimi                 break;
1172*b7893ccfSSadaf Ebrahimi             default:
1173*b7893ccfSSadaf Ebrahimi                 break;
1174*b7893ccfSSadaf Ebrahimi         }
1175*b7893ccfSSadaf Ebrahimi     } else if (FormatIsMultiplane(format)) {
1176*b7893ccfSSadaf Ebrahimi         format = FindMultiplaneCompatibleFormat(format, aspectMask);
1177*b7893ccfSSadaf Ebrahimi     }
1178*b7893ccfSSadaf Ebrahimi 
1179*b7893ccfSSadaf Ebrahimi     auto item = vk_format_table.find(format);
1180*b7893ccfSSadaf Ebrahimi     if (item != vk_format_table.end()) {
1181*b7893ccfSSadaf Ebrahimi         return item->second.size;
1182*b7893ccfSSadaf Ebrahimi     }
1183*b7893ccfSSadaf Ebrahimi     return 0;
1184*b7893ccfSSadaf Ebrahimi }
1185*b7893ccfSSadaf Ebrahimi 
1186*b7893ccfSSadaf Ebrahimi // Return the size in bytes of one texel of given foramt
1187*b7893ccfSSadaf Ebrahimi // For compressed or multi-plane, this may be a fractional number
FormatTexelSize(VkFormat format)1188*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT double FormatTexelSize(VkFormat format) {
1189*b7893ccfSSadaf Ebrahimi     double texel_size = static_cast<double>(FormatElementSize(format));
1190*b7893ccfSSadaf Ebrahimi     VkExtent3D block_extent = FormatTexelBlockExtent(format);
1191*b7893ccfSSadaf Ebrahimi     uint32_t texels_per_block = block_extent.width * block_extent.height * block_extent.depth;
1192*b7893ccfSSadaf Ebrahimi     if (1 < texels_per_block) {
1193*b7893ccfSSadaf Ebrahimi         texel_size /= static_cast<double>(texels_per_block);
1194*b7893ccfSSadaf Ebrahimi     }
1195*b7893ccfSSadaf Ebrahimi     return texel_size;
1196*b7893ccfSSadaf Ebrahimi }
1197*b7893ccfSSadaf Ebrahimi 
1198*b7893ccfSSadaf Ebrahimi // Return the number of channels for a given format
FormatChannelCount(VkFormat format)1199*b7893ccfSSadaf Ebrahimi uint32_t FormatChannelCount(VkFormat format) {
1200*b7893ccfSSadaf Ebrahimi     auto item = vk_format_table.find(format);
1201*b7893ccfSSadaf Ebrahimi     if (item != vk_format_table.end()) {
1202*b7893ccfSSadaf Ebrahimi         return item->second.channel_count;
1203*b7893ccfSSadaf Ebrahimi     }
1204*b7893ccfSSadaf Ebrahimi     return 0;
1205*b7893ccfSSadaf Ebrahimi }
1206*b7893ccfSSadaf Ebrahimi 
1207*b7893ccfSSadaf Ebrahimi // Perform a zero-tolerant modulo operation
SafeModulo(VkDeviceSize dividend,VkDeviceSize divisor)1208*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor) {
1209*b7893ccfSSadaf Ebrahimi     VkDeviceSize result = 0;
1210*b7893ccfSSadaf Ebrahimi     if (divisor != 0) {
1211*b7893ccfSSadaf Ebrahimi         result = dividend % divisor;
1212*b7893ccfSSadaf Ebrahimi     }
1213*b7893ccfSSadaf Ebrahimi     return result;
1214*b7893ccfSSadaf Ebrahimi }
1215*b7893ccfSSadaf Ebrahimi 
SafeDivision(VkDeviceSize dividend,VkDeviceSize divisor)1216*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkDeviceSize SafeDivision(VkDeviceSize dividend, VkDeviceSize divisor) {
1217*b7893ccfSSadaf Ebrahimi     VkDeviceSize result = 0;
1218*b7893ccfSSadaf Ebrahimi     if (divisor != 0) {
1219*b7893ccfSSadaf Ebrahimi         result = dividend / divisor;
1220*b7893ccfSSadaf Ebrahimi     }
1221*b7893ccfSSadaf Ebrahimi     return result;
1222*b7893ccfSSadaf Ebrahimi }
1223*b7893ccfSSadaf Ebrahimi 
1224*b7893ccfSSadaf Ebrahimi struct VULKAN_PER_PLANE_COMPATIBILITY {
1225*b7893ccfSSadaf Ebrahimi     uint32_t width_divisor;
1226*b7893ccfSSadaf Ebrahimi     uint32_t height_divisor;
1227*b7893ccfSSadaf Ebrahimi     VkFormat compatible_format;
1228*b7893ccfSSadaf Ebrahimi };
1229*b7893ccfSSadaf Ebrahimi 
1230*b7893ccfSSadaf Ebrahimi struct VULKAN_MULTIPLANE_COMPATIBILITY {
1231*b7893ccfSSadaf Ebrahimi     VULKAN_PER_PLANE_COMPATIBILITY per_plane[VK_MULTIPLANE_FORMAT_MAX_PLANES];
1232*b7893ccfSSadaf Ebrahimi };
1233*b7893ccfSSadaf Ebrahimi 
1234*b7893ccfSSadaf Ebrahimi // Source: Vulkan spec Table 45. Plane Format Compatibility Table
1235*b7893ccfSSadaf Ebrahimi // clang-format off
1236*b7893ccfSSadaf Ebrahimi const std::map<VkFormat, VULKAN_MULTIPLANE_COMPATIBILITY> vk_multiplane_compatibility_map {
1237*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,                  { { { 1, 1, VK_FORMAT_R8_UNORM },
1238*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R8_UNORM },
1239*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R8_UNORM } } } },
1240*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,                   { { { 1, 1, VK_FORMAT_R8_UNORM },
1241*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R8G8_UNORM },
1242*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1243*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,                  { { { 1, 1, VK_FORMAT_R8_UNORM },
1244*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R8_UNORM },
1245*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R8_UNORM } } } },
1246*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,                   { { { 1, 1, VK_FORMAT_R8_UNORM },
1247*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R8G8_UNORM },
1248*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1249*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,                  { { { 1, 1, VK_FORMAT_R8_UNORM },
1250*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R8_UNORM },
1251*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R8_UNORM } } } },
1252*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1253*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16 },
1254*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R10X6_UNORM_PACK16 } } } },
1255*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,  { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1256*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 },
1257*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1258*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1259*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1260*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R10X6_UNORM_PACK16 } } } },
1261*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,  { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1262*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 },
1263*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1264*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, { { { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1265*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
1266*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 } } } },
1267*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1268*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16 },
1269*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R12X4_UNORM_PACK16 } } } },
1270*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,  { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1271*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 },
1272*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1273*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1274*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1275*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R12X4_UNORM_PACK16 } } } },
1276*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,  { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1277*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 },
1278*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1279*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, { { { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1280*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
1281*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 } } } },
1282*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,               { { { 1, 1, VK_FORMAT_R16_UNORM },
1283*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R16_UNORM },
1284*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R16_UNORM } } } },
1285*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,                { { { 1, 1, VK_FORMAT_R16_UNORM },
1286*b7893ccfSSadaf Ebrahimi                                                                 { 2, 2, VK_FORMAT_R16G16_UNORM },
1287*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1288*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,               { { { 1, 1, VK_FORMAT_R16_UNORM },
1289*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R16_UNORM },
1290*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R16_UNORM } } } },
1291*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,                { { { 1, 1, VK_FORMAT_R16_UNORM },
1292*b7893ccfSSadaf Ebrahimi                                                                 { 2, 1, VK_FORMAT_R16G16_UNORM },
1293*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_UNDEFINED } } } },
1294*b7893ccfSSadaf Ebrahimi     { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,               { { { 1, 1, VK_FORMAT_R16_UNORM },
1295*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R16_UNORM },
1296*b7893ccfSSadaf Ebrahimi                                                                 { 1, 1, VK_FORMAT_R16_UNORM } } } }
1297*b7893ccfSSadaf Ebrahimi };
1298*b7893ccfSSadaf Ebrahimi // clang-format on
1299*b7893ccfSSadaf Ebrahimi 
GetPlaneIndex(VkImageAspectFlags aspect)1300*b7893ccfSSadaf Ebrahimi uint32_t GetPlaneIndex(VkImageAspectFlags aspect) {
1301*b7893ccfSSadaf Ebrahimi     // Returns an out of bounds index on error
1302*b7893ccfSSadaf Ebrahimi     switch (aspect) {
1303*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_PLANE_0_BIT:
1304*b7893ccfSSadaf Ebrahimi             return 0;
1305*b7893ccfSSadaf Ebrahimi             break;
1306*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_PLANE_1_BIT:
1307*b7893ccfSSadaf Ebrahimi             return 1;
1308*b7893ccfSSadaf Ebrahimi             break;
1309*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_PLANE_2_BIT:
1310*b7893ccfSSadaf Ebrahimi             return 2;
1311*b7893ccfSSadaf Ebrahimi             break;
1312*b7893ccfSSadaf Ebrahimi         default:
1313*b7893ccfSSadaf Ebrahimi             // If more than one plane bit is set, return error condition
1314*b7893ccfSSadaf Ebrahimi             return VK_MULTIPLANE_FORMAT_MAX_PLANES;
1315*b7893ccfSSadaf Ebrahimi             break;
1316*b7893ccfSSadaf Ebrahimi     }
1317*b7893ccfSSadaf Ebrahimi }
1318*b7893ccfSSadaf Ebrahimi 
FindMultiplaneCompatibleFormat(VkFormat mp_fmt,VkImageAspectFlags plane_aspect)1319*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkFormat FindMultiplaneCompatibleFormat(VkFormat mp_fmt, VkImageAspectFlags plane_aspect) {
1320*b7893ccfSSadaf Ebrahimi     uint32_t plane_idx = GetPlaneIndex(plane_aspect);
1321*b7893ccfSSadaf Ebrahimi     auto it = vk_multiplane_compatibility_map.find(mp_fmt);
1322*b7893ccfSSadaf Ebrahimi     if ((it == vk_multiplane_compatibility_map.end()) || (plane_idx >= VK_MULTIPLANE_FORMAT_MAX_PLANES)) {
1323*b7893ccfSSadaf Ebrahimi         return VK_FORMAT_UNDEFINED;
1324*b7893ccfSSadaf Ebrahimi     }
1325*b7893ccfSSadaf Ebrahimi 
1326*b7893ccfSSadaf Ebrahimi     return it->second.per_plane[plane_idx].compatible_format;
1327*b7893ccfSSadaf Ebrahimi }
1328*b7893ccfSSadaf Ebrahimi 
FindMultiplaneExtentDivisors(VkFormat mp_fmt,VkImageAspectFlags plane_aspect)1329*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VkExtent2D FindMultiplaneExtentDivisors(VkFormat mp_fmt, VkImageAspectFlags plane_aspect) {
1330*b7893ccfSSadaf Ebrahimi     VkExtent2D divisors = {1, 1};
1331*b7893ccfSSadaf Ebrahimi     uint32_t plane_idx = GetPlaneIndex(plane_aspect);
1332*b7893ccfSSadaf Ebrahimi     auto it = vk_multiplane_compatibility_map.find(mp_fmt);
1333*b7893ccfSSadaf Ebrahimi     if ((it == vk_multiplane_compatibility_map.end()) || (plane_idx >= VK_MULTIPLANE_FORMAT_MAX_PLANES)) {
1334*b7893ccfSSadaf Ebrahimi         return divisors;
1335*b7893ccfSSadaf Ebrahimi     }
1336*b7893ccfSSadaf Ebrahimi 
1337*b7893ccfSSadaf Ebrahimi     divisors.width = it->second.per_plane[plane_idx].width_divisor;
1338*b7893ccfSSadaf Ebrahimi     divisors.height = it->second.per_plane[plane_idx].height_divisor;
1339*b7893ccfSSadaf Ebrahimi     return divisors;
1340*b7893ccfSSadaf Ebrahimi }
1341*b7893ccfSSadaf Ebrahimi 
FormatSizesAreEqual(VkFormat srcFormat,VkFormat dstFormat,uint32_t region_count,const VkImageCopy * regions)1342*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatSizesAreEqual(VkFormat srcFormat, VkFormat dstFormat, uint32_t region_count,
1343*b7893ccfSSadaf Ebrahimi                                          const VkImageCopy *regions) {
1344*b7893ccfSSadaf Ebrahimi     size_t srcSize = 0, dstSize = 0;
1345*b7893ccfSSadaf Ebrahimi 
1346*b7893ccfSSadaf Ebrahimi     if (FormatIsMultiplane(srcFormat) || FormatIsMultiplane(dstFormat)) {
1347*b7893ccfSSadaf Ebrahimi         for (uint32_t i = 0; i < region_count; i++) {
1348*b7893ccfSSadaf Ebrahimi             if (FormatIsMultiplane(srcFormat)) {
1349*b7893ccfSSadaf Ebrahimi                 VkFormat planeFormat = FindMultiplaneCompatibleFormat(srcFormat, regions[i].srcSubresource.aspectMask);
1350*b7893ccfSSadaf Ebrahimi                 srcSize = FormatElementSize(planeFormat);
1351*b7893ccfSSadaf Ebrahimi             } else {
1352*b7893ccfSSadaf Ebrahimi                 srcSize = FormatElementSize(srcFormat);
1353*b7893ccfSSadaf Ebrahimi             }
1354*b7893ccfSSadaf Ebrahimi             if (FormatIsMultiplane(dstFormat)) {
1355*b7893ccfSSadaf Ebrahimi                 VkFormat planeFormat = FindMultiplaneCompatibleFormat(dstFormat, regions[i].dstSubresource.aspectMask);
1356*b7893ccfSSadaf Ebrahimi                 dstSize = FormatElementSize(planeFormat);
1357*b7893ccfSSadaf Ebrahimi             } else {
1358*b7893ccfSSadaf Ebrahimi                 dstSize = FormatElementSize(dstFormat);
1359*b7893ccfSSadaf Ebrahimi             }
1360*b7893ccfSSadaf Ebrahimi             if (dstSize != srcSize) return false;
1361*b7893ccfSSadaf Ebrahimi         }
1362*b7893ccfSSadaf Ebrahimi         return true;
1363*b7893ccfSSadaf Ebrahimi     } else {
1364*b7893ccfSSadaf Ebrahimi         srcSize = FormatElementSize(srcFormat);
1365*b7893ccfSSadaf Ebrahimi         dstSize = FormatElementSize(dstFormat);
1366*b7893ccfSSadaf Ebrahimi         return (dstSize == srcSize);
1367*b7893ccfSSadaf Ebrahimi     }
1368*b7893ccfSSadaf Ebrahimi }
1369*b7893ccfSSadaf Ebrahimi 
FormatRequiresYcbcrConversion(VkFormat format)1370*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT bool FormatRequiresYcbcrConversion(VkFormat format) {
1371*b7893ccfSSadaf Ebrahimi     return format >= VK_FORMAT_G8B8G8R8_422_UNORM && format <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM;
1372*b7893ccfSSadaf Ebrahimi }
1373