| /*------------------------------------------------------------------------- |
| * Vulkan CTS Framework |
| * -------------------- |
| * |
| * Copyright (c) 2015 The Khronos Group Inc. |
| * Copyright (c) 2015 Imagination Technologies Ltd. |
| * Copyright (c) 2015 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Utilities for images. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "vkImageUtil.hpp" |
| #include "vkRefUtil.hpp" |
| #include "vkQueryUtil.hpp" |
| #include "vkTypeUtil.hpp" |
| #include "vkCmdUtil.hpp" |
| #include "tcuTextureUtil.hpp" |
| #include "deMath.h" |
| |
| #include <map> |
| #include <assert.h> |
| |
| namespace vk |
| { |
| |
| bool isFloatFormat (VkFormat format) |
| { |
| return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT; |
| } |
| |
| bool isUnormFormat (VkFormat format) |
| { |
| return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; |
| } |
| |
| bool isSnormFormat (VkFormat format) |
| { |
| return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT; |
| } |
| |
| bool isIntFormat (VkFormat format) |
| { |
| return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER; |
| } |
| |
| bool isUintFormat (VkFormat format) |
| { |
| return tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER; |
| } |
| |
| bool isDepthStencilFormat (VkFormat format) |
| { |
| if (isCompressedFormat(format)) |
| return false; |
| |
| if (isYCbCrFormat(format)) |
| return false; |
| |
| const tcu::TextureFormat tcuFormat = mapVkFormat(format); |
| return tcuFormat.order == tcu::TextureFormat::D || tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS; |
| } |
| |
| bool isSrgbFormat (VkFormat format) |
| { |
| switch (mapVkFormat(format).order) |
| { |
| case tcu::TextureFormat::sR: |
| case tcu::TextureFormat::sRG: |
| case tcu::TextureFormat::sRGB: |
| case tcu::TextureFormat::sRGBA: |
| case tcu::TextureFormat::sBGR: |
| case tcu::TextureFormat::sBGRA: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isUfloatFormat (VkFormat format) |
| { |
| DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185); |
| |
| switch (format) |
| { |
| case VK_FORMAT_B10G11R11_UFLOAT_PACK32: |
| case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: |
| case VK_FORMAT_BC6H_UFLOAT_BLOCK: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isSfloatFormat (VkFormat format) |
| { |
| DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185); |
| |
| switch (format) |
| { |
| case VK_FORMAT_R16_SFLOAT: |
| case VK_FORMAT_R16G16_SFLOAT: |
| case VK_FORMAT_R16G16B16_SFLOAT: |
| case VK_FORMAT_R16G16B16A16_SFLOAT: |
| case VK_FORMAT_R32_SFLOAT: |
| case VK_FORMAT_R32G32_SFLOAT: |
| case VK_FORMAT_R32G32B32_SFLOAT: |
| case VK_FORMAT_R32G32B32A32_SFLOAT: |
| case VK_FORMAT_R64_SFLOAT: |
| case VK_FORMAT_R64G64_SFLOAT: |
| case VK_FORMAT_R64G64B64_SFLOAT: |
| case VK_FORMAT_R64G64B64A64_SFLOAT: |
| case VK_FORMAT_D32_SFLOAT: |
| case VK_FORMAT_BC6H_SFLOAT_BLOCK: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isCompressedFormat (VkFormat format) |
| { |
| // update this mapping if VkFormat changes |
| DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185); |
| |
| switch (format) |
| { |
| case VK_FORMAT_BC1_RGB_UNORM_BLOCK: |
| case VK_FORMAT_BC1_RGB_SRGB_BLOCK: |
| case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: |
| case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: |
| case VK_FORMAT_BC2_UNORM_BLOCK: |
| case VK_FORMAT_BC2_SRGB_BLOCK: |
| case VK_FORMAT_BC3_UNORM_BLOCK: |
| case VK_FORMAT_BC3_SRGB_BLOCK: |
| case VK_FORMAT_BC4_UNORM_BLOCK: |
| case VK_FORMAT_BC4_SNORM_BLOCK: |
| case VK_FORMAT_BC5_UNORM_BLOCK: |
| case VK_FORMAT_BC5_SNORM_BLOCK: |
| case VK_FORMAT_BC6H_UFLOAT_BLOCK: |
| case VK_FORMAT_BC6H_SFLOAT_BLOCK: |
| case VK_FORMAT_BC7_UNORM_BLOCK: |
| case VK_FORMAT_BC7_SRGB_BLOCK: |
| case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: |
| case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: |
| case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: |
| case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: |
| case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: |
| case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: |
| case VK_FORMAT_EAC_R11_UNORM_BLOCK: |
| case VK_FORMAT_EAC_R11_SNORM_BLOCK: |
| case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: |
| case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: |
| case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: |
| case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: |
| case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isYCbCrFormat (VkFormat format) |
| { |
| switch (format) |
| { |
| case VK_FORMAT_G8B8G8R8_422_UNORM: |
| case VK_FORMAT_B8G8R8G8_422_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: |
| case VK_FORMAT_R10X6_UNORM_PACK16: |
| case VK_FORMAT_R10X6G10X6_UNORM_2PACK16: |
| case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: |
| case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: |
| case VK_FORMAT_R12X4_UNORM_PACK16: |
| case VK_FORMAT_R12X4G12X4_UNORM_2PACK16: |
| case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: |
| case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: |
| case VK_FORMAT_G16B16G16R16_422_UNORM: |
| case VK_FORMAT_B16G16R16G16_422_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT: |
| case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isYCbCrExtensionFormat (VkFormat format) |
| { |
| switch (format) |
| { |
| case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT: |
| case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isYCbCr420Format (VkFormat format) |
| { |
| switch (format) |
| { |
| case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isYCbCr422Format (VkFormat format) |
| { |
| switch (format) |
| { |
| case VK_FORMAT_G8B8G8R8_422_UNORM: |
| case VK_FORMAT_B8G8R8G8_422_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: |
| case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G16B16G16R16_422_UNORM: |
| case VK_FORMAT_B16G16R16G16_422_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| const std::map<VkFormat, std::string> spirvFormats = { |
| { VK_FORMAT_R32G32B32A32_SFLOAT, "Rgba32f" }, |
| { VK_FORMAT_R32G32_SFLOAT, "Rg32f" }, |
| { VK_FORMAT_R32_SFLOAT, "R32f" }, |
| { VK_FORMAT_R16G16B16A16_SFLOAT, "Rgba16f" }, |
| { VK_FORMAT_R16G16_SFLOAT, "Rg16f" }, |
| { VK_FORMAT_R16_SFLOAT, "R16f" }, |
| { VK_FORMAT_R16G16B16A16_UNORM, "Rgba16" }, |
| { VK_FORMAT_R16G16_UNORM, "Rg16" }, |
| { VK_FORMAT_R16_UNORM, "R16" }, |
| { VK_FORMAT_R16G16B16A16_SNORM, "Rgba16Snorm" }, |
| { VK_FORMAT_R16G16_SNORM, "Rg16Snorm" }, |
| { VK_FORMAT_R16_SNORM, "R16Snorm" }, |
| { VK_FORMAT_A2B10G10R10_UNORM_PACK32, "Rgb10A2" }, |
| { VK_FORMAT_B10G11R11_UFLOAT_PACK32, "R11fG11fB10f" }, |
| { VK_FORMAT_R8G8B8A8_UNORM, "Rgba8" }, |
| { VK_FORMAT_R8G8_UNORM, "Rg8" }, |
| { VK_FORMAT_R8_UNORM, "R8" }, |
| |
| { VK_FORMAT_R8G8B8A8_SNORM, "Rgba8Snorm" }, |
| { VK_FORMAT_R8G8_SNORM, "Rg8Snorm" }, |
| { VK_FORMAT_R8_SNORM, "R8Snorm" }, |
| { VK_FORMAT_R32G32B32A32_SINT, "Rgba32i" }, |
| { VK_FORMAT_R32G32_SINT, "Rg32i" }, |
| { VK_FORMAT_R32_SINT, "R32i" }, |
| { VK_FORMAT_R16G16B16A16_SINT, "Rgba16i" }, |
| { VK_FORMAT_R16G16_SINT, "Rg16i" }, |
| { VK_FORMAT_R16_SINT, "R16i" }, |
| { VK_FORMAT_R8G8B8A8_SINT, "Rgba8i" }, |
| { VK_FORMAT_R8G8_SINT, "Rg8i" }, |
| { VK_FORMAT_R8_SINT, "R8i" }, |
| { VK_FORMAT_R32G32B32A32_UINT, "Rgba32ui" }, |
| { VK_FORMAT_R32G32_UINT, "Rg32ui" }, |
| { VK_FORMAT_R32_UINT, "R32ui" }, |
| { VK_FORMAT_R16G16B16A16_UINT, "Rgba16ui" }, |
| { VK_FORMAT_R16G16_UINT, "Rg16ui" }, |
| { VK_FORMAT_R16_UINT, "R16ui" }, |
| { VK_FORMAT_A2B10G10R10_UINT_PACK32, "Rgb10a2ui" }, |
| { VK_FORMAT_R8G8B8A8_UINT, "Rgba8ui" }, |
| { VK_FORMAT_R8G8_UINT, "Rg8ui" }, |
| { VK_FORMAT_R8_UINT, "R8ui" }, |
| |
| { VK_FORMAT_R64_SINT, "R64i" }, |
| { VK_FORMAT_R64_UINT, "R64ui" }, |
| }; |
| |
| bool hasSpirvFormat(VkFormat fmt) |
| { |
| auto iter = spirvFormats.find(fmt); |
| return (iter != spirvFormats.end()); |
| } |
| |
| const std::string getSpirvFormat(VkFormat fmt) |
| { |
| auto iter = spirvFormats.find(fmt); |
| assert(iter != spirvFormats.end()); |
| return iter->second; |
| } |
| |
| bool is64BitIntegerFormat (VkFormat format) |
| { |
| const auto tcuFormat = mapVkFormat(format); |
| return (tcuFormat.type == tcu::TextureFormat::UNSIGNED_INT64 || tcuFormat.type == tcu::TextureFormat::SIGNED_INT64); |
| } |
| |
| const PlanarFormatDescription& getYCbCrPlanarFormatDescription (VkFormat format) |
| { |
| using tcu::TextureFormat; |
| |
| const deUint32 chanR = PlanarFormatDescription::CHANNEL_R; |
| const deUint32 chanG = PlanarFormatDescription::CHANNEL_G; |
| const deUint32 chanB = PlanarFormatDescription::CHANNEL_B; |
| const deUint32 chanA = PlanarFormatDescription::CHANNEL_A; |
| |
| const deUint8 unorm = (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; |
| |
| if (format >= VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT && format <= VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT) |
| { |
| static const PlanarFormatDescription s_formatInfo[] = |
| { |
| // VK_FORMAT_G8_B8R8_2PLANE_444_UNORM |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 2, 1, 1, VK_FORMAT_R8G8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 8, 8, 2 }, // R |
| { 0, unorm, 0, 8, 1 }, // G |
| { 1, unorm, 0, 8, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 4, 1, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 22, 10, 4 }, // R |
| { 0, unorm, 6, 10, 2 }, // G |
| { 1, unorm, 6, 10, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 4, 1, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 20, 12, 4 }, // R |
| { 0, unorm, 4, 12, 2 }, // G |
| { 1, unorm, 4, 12, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 4, 1, 1, VK_FORMAT_R16G16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 16, 16, 4 }, // R |
| { 0, unorm, 0, 16, 2 }, // G |
| { 1, unorm, 0, 16, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| }; |
| |
| const size_t offset = (size_t)VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT; |
| |
| DE_ASSERT(de::inBounds<size_t>((size_t)format, offset, offset+(size_t)DE_LENGTH_OF_ARRAY(s_formatInfo))); |
| |
| return s_formatInfo[(size_t)format-offset]; |
| } |
| |
| static const PlanarFormatDescription s_formatInfo[] = |
| { |
| // VK_FORMAT_G8B8G8R8_422_UNORM |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_G8B8G8R8_422_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 24, 8, 4 }, // R |
| { 0, unorm, 0, 8, 2 }, // G |
| { 0, unorm, 8, 8, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_B8G8R8G8_422_UNORM |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_B8G8R8G8_422_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 16, 8, 4 }, // R |
| { 0, unorm, 8, 8, 2 }, // G |
| { 0, unorm, 0, 8, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 1, 2, 2, VK_FORMAT_R8_UNORM }, |
| { 1, 2, 2, VK_FORMAT_R8_UNORM }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 0, 8, 1 }, // R |
| { 0, unorm, 0, 8, 1 }, // G |
| { 1, unorm, 0, 8, 1 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G8_B8R8_2PLANE_420_UNORM |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 2, 2, 2, VK_FORMAT_R8G8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 8, 8, 2 }, // R |
| { 0, unorm, 0, 8, 1 }, // G |
| { 1, unorm, 0, 8, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 1, 2, 1, VK_FORMAT_R8_UNORM }, |
| { 1, 2, 1, VK_FORMAT_R8_UNORM }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 0, 8, 1 }, // R |
| { 0, unorm, 0, 8, 1 }, // G |
| { 1, unorm, 0, 8, 1 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G8_B8R8_2PLANE_422_UNORM |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 2, 2, 1, VK_FORMAT_R8G8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 8, 8, 2 }, // R |
| { 0, unorm, 0, 8, 1 }, // G |
| { 1, unorm, 0, 8, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 0, 8, 1 }, // R |
| { 0, unorm, 0, 8, 1 }, // G |
| { 1, unorm, 0, 8, 1 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_R10X6_UNORM_PACK16 |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 6, 10, 2 }, // R |
| { 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 0, 0 }, |
| } |
| }, |
| // VK_FORMAT_R10X6G10X6_UNORM_2PACK16 |
| { |
| 1, // planes |
| chanR|chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 6, 10, 4 }, // R |
| { 0, unorm, 22, 10, 4 }, // G |
| { 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 0, 0 }, |
| } |
| }, |
| // VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 6, 10, 8 }, // R |
| { 0, unorm, 22, 10, 8 }, // G |
| { 0, unorm, 38, 10, 8 }, // B |
| { 0, unorm, 54, 10, 8 }, // A |
| } |
| }, |
| // VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 54, 10, 8 }, // R |
| { 0, unorm, 6, 10, 4 }, // G |
| { 0, unorm, 22, 10, 8 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 38, 10, 8 }, // R |
| { 0, unorm, 22, 10, 4 }, // G |
| { 0, unorm, 6, 10, 8 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16 |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 2, 2, 2, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 2, 2, 2, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 6, 10, 2 }, // R |
| { 0, unorm, 6, 10, 2 }, // G |
| { 1, unorm, 6, 10, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 4, 2, 2, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 22, 10, 4 }, // R |
| { 0, unorm, 6, 10, 2 }, // G |
| { 1, unorm, 6, 10, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16 |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 2, 2, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 2, 2, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 6, 10, 2 }, // R |
| { 0, unorm, 6, 10, 2 }, // G |
| { 1, unorm, 6, 10, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 4, 2, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 22, 10, 4 }, // R |
| { 0, unorm, 6, 10, 2 }, // G |
| { 1, unorm, 6, 10, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16 |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 6, 10, 2 }, // R |
| { 0, unorm, 6, 10, 2 }, // G |
| { 1, unorm, 6, 10, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_R12X4_UNORM_PACK16 |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 4, 12, 2 }, // R |
| { 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 0, 0 }, |
| } |
| }, |
| // VK_FORMAT_R12X4G12X4_UNORM_2PACK16 |
| { |
| 1, // planes |
| chanR|chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 4, 12, 4 }, // R |
| { 0, unorm, 20, 12, 4 }, // G |
| { 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 0, 0 }, |
| } |
| }, |
| // VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 4, 12, 8 }, // R |
| { 0, unorm, 20, 12, 8 }, // G |
| { 0, unorm, 36, 12, 8 }, // B |
| { 0, unorm, 52, 12, 8 }, // A |
| } |
| }, |
| // VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 52, 12, 8 }, // R |
| { 0, unorm, 4, 12, 4 }, // G |
| { 0, unorm, 20, 12, 8 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 36, 12, 8 }, // R |
| { 0, unorm, 20, 12, 4 }, // G |
| { 0, unorm, 4, 12, 8 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16 |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 2, 2, 2, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 2, 2, 2, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 4, 12, 2 }, // R |
| { 0, unorm, 4, 12, 2 }, // G |
| { 1, unorm, 4, 12, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16 |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 4, 2, 2, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 20, 12, 4 }, // R |
| { 0, unorm, 4, 12, 2 }, // G |
| { 1, unorm, 4, 12, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16 |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 2, 2, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 2, 2, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 4, 12, 2 }, // R |
| { 0, unorm, 4, 12, 2 }, // G |
| { 1, unorm, 4, 12, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16 |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 4, 2, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 20, 12, 4 }, // R |
| { 0, unorm, 4, 12, 2 }, // G |
| { 1, unorm, 4, 12, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16 |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 4, 12, 2 }, // R |
| { 0, unorm, 4, 12, 2 }, // G |
| { 1, unorm, 4, 12, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16B16G16R16_422_UNORM |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_G16B16G16R16_422_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 48, 16, 8 }, // R |
| { 0, unorm, 0, 16, 4 }, // G |
| { 0, unorm, 16, 16, 8 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_B16G16R16G16_422_UNORM |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 2,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_B16G16R16G16_422_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 32, 16, 8 }, // R |
| { 0, unorm, 16, 16, 4 }, // G |
| { 0, unorm, 0, 16, 8 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 2, 2, 2, VK_FORMAT_R16_UNORM }, |
| { 2, 2, 2, VK_FORMAT_R16_UNORM }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 0, 16, 2 }, // R |
| { 0, unorm, 0, 16, 2 }, // G |
| { 1, unorm, 0, 16, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16_B16R16_2PLANE_420_UNORM |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 4, 2, 2, VK_FORMAT_R16G16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 16, 16, 4 }, // R |
| { 0, unorm, 0, 16, 2 }, // G |
| { 1, unorm, 0, 16, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 2, 2, 1, VK_FORMAT_R16_UNORM }, |
| { 2, 2, 1, VK_FORMAT_R16_UNORM }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 0, 16, 2 }, // R |
| { 0, unorm, 0, 16, 2 }, // G |
| { 1, unorm, 0, 16, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16_B16R16_2PLANE_422_UNORM |
| { |
| 2, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 4, 2, 1, VK_FORMAT_R16G16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 1, unorm, 16, 16, 4 }, // R |
| { 0, unorm, 0, 16, 2 }, // G |
| { 1, unorm, 0, 16, 4 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| // VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM |
| { |
| 3, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 2, unorm, 0, 16, 2 }, // R |
| { 0, unorm, 0, 16, 2 }, // G |
| { 1, unorm, 0, 16, 2 }, // B |
| { 0, 0, 0, 0, 0 } |
| } |
| }, |
| }; |
| |
| const size_t offset = (size_t)VK_FORMAT_G8B8G8R8_422_UNORM; |
| |
| DE_ASSERT(de::inBounds<size_t>((size_t)format, offset, offset+(size_t)DE_LENGTH_OF_ARRAY(s_formatInfo))); |
| |
| return s_formatInfo[(size_t)format-offset]; |
| } |
| |
| PlanarFormatDescription getCorePlanarFormatDescription (VkFormat format) |
| { |
| const deUint8 snorm = (deUint8)tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT; |
| const deUint8 unorm = (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT; |
| const deUint8 sint = (deUint8)tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER; |
| const deUint8 uint = (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER; |
| const deUint8 sfloat = (deUint8)tcu::TEXTURECHANNELCLASS_FLOATING_POINT; |
| |
| const deUint8 chanR = (deUint8)PlanarFormatDescription::CHANNEL_R; |
| const deUint8 chanG = (deUint8)PlanarFormatDescription::CHANNEL_G; |
| const deUint8 chanB = (deUint8)PlanarFormatDescription::CHANNEL_B; |
| const deUint8 chanA = (deUint8)PlanarFormatDescription::CHANNEL_A; |
| |
| DE_ASSERT(de::inBounds<deUint32>(format, VK_FORMAT_UNDEFINED+1, VK_CORE_FORMAT_LAST)); |
| |
| #if (DE_ENDIANNESS != DE_LITTLE_ENDIAN) |
| # error "Big-endian is not supported" |
| #endif |
| |
| switch (format) |
| { |
| case VK_FORMAT_R8_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 8, 1 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8_SNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_SNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, snorm, 0, 8, 1 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| |
| case VK_FORMAT_R8G8_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R8G8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 8, 2 }, // R |
| { 0, unorm, 8, 8, 2 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8_SNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R8G8_SNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, snorm, 0, 8, 2 }, // R |
| { 0, snorm, 8, 8, 2 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 16, 2 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16_SNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_SNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, snorm, 0, 16, 2 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R16G16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 16, 4 }, // R |
| { 0, unorm, 16, 16, 4 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16_SNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R16G16_SNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, snorm, 0, 16, 4 }, // R |
| { 0, snorm, 16, 16, 4 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_B10G11R11_UFLOAT_PACK32: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_B10G11R11_UFLOAT_PACK32 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 11, 4 }, // R |
| { 0, unorm, 11, 11, 4 }, // G |
| { 0, unorm, 22, 10, 4 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R4G4_UNORM_PACK8: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R4G4_UNORM_PACK8 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 4, 4, 1 }, // R |
| { 0, unorm, 0, 4, 1 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R4G4B4A4_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R4G4B4A4_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 12, 4, 2 }, // R |
| { 0, unorm, 8, 4, 2 }, // G |
| { 0, unorm, 4, 4, 2 }, // B |
| { 0, unorm, 0, 4, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_B4G4R4A4_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_B4G4R4A4_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 4, 4, 2 }, // R |
| { 0, unorm, 8, 4, 2 }, // G |
| { 0, unorm, 12, 4, 2 }, // B |
| { 0, unorm, 0, 4, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R5G6B5_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R5G6B5_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 11, 5, 2 }, // R |
| { 0, unorm, 5, 6, 2 }, // G |
| { 0, unorm, 0, 5, 2 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_B5G6R5_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_B5G6R5_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 5, 2 }, // R |
| { 0, unorm, 5, 6, 2 }, // G |
| { 0, unorm, 11, 5, 2 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R5G5B5A1_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R5G5B5A1_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 11, 5, 2 }, // R |
| { 0, unorm, 6, 5, 2 }, // G |
| { 0, unorm, 1, 5, 2 }, // B |
| { 0, unorm, 0, 1, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_B5G5R5A1_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_B5G5R5A1_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 1, 5, 2 }, // R |
| { 0, unorm, 6, 5, 2 }, // G |
| { 0, unorm, 11, 5, 2 }, // B |
| { 0, unorm, 0, 1, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_A1R5G5B5_UNORM_PACK16: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_A1R5G5B5_UNORM_PACK16 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 10, 5, 2 }, // R |
| { 0, unorm, 5, 5, 2 }, // G |
| { 0, unorm, 0, 5, 2 }, // B |
| { 0, unorm, 15, 1, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8B8_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 3, 1, 1, VK_FORMAT_R8G8B8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 8, 3 }, // R |
| { 0, unorm, 8, 8, 3 }, // G |
| { 0, unorm, 16, 8, 3 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_B8G8R8_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 3, 1, 1, VK_FORMAT_B8G8R8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 16, 8, 3 }, // R |
| { 0, unorm, 8, 8, 3 }, // G |
| { 0, unorm, 0, 8, 3 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8B8A8_UNORM: |
| case VK_FORMAT_A8B8G8R8_UNORM_PACK32: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R8G8B8A8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 8, 4 }, // R |
| { 0, unorm, 8, 8, 4 }, // G |
| { 0, unorm, 16, 8, 4 }, // B |
| { 0, unorm, 24, 8, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_B8G8R8A8_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_B8G8R8A8_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 16, 8, 4 }, // R |
| { 0, unorm, 8, 8, 4 }, // G |
| { 0, unorm, 0, 8, 4 }, // B |
| { 0, unorm, 24, 8, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_A2R10G10B10_UNORM_PACK32: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_A2R10G10B10_UNORM_PACK32 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 20, 10, 4 }, // R |
| { 0, unorm, 10, 10, 4 }, // G |
| { 0, unorm, 0, 10, 4 }, // B |
| { 0, unorm, 30, 2, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_A2B10G10R10_UNORM_PACK32: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_A2B10G10R10_UNORM_PACK32 }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 10, 4 }, // R |
| { 0, unorm, 10, 10, 4 }, // G |
| { 0, unorm, 20, 10, 4 }, // B |
| { 0, unorm, 30, 2, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16B16_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 6, 1, 1, VK_FORMAT_R16G16B16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 16, 6 }, // R |
| { 0, unorm, 16, 16, 6 }, // G |
| { 0, unorm, 32, 16, 6 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16B16A16_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R16G16B16A16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 16, 8 }, // R |
| { 0, unorm, 16, 16, 8 }, // G |
| { 0, unorm, 32, 16, 8 }, // B |
| { 0, unorm, 48, 16, 8 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 8, 1 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 16, 2 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R32_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 32, 4 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| |
| case VK_FORMAT_R64_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R64_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 64, 8 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R8G8_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 8, 2 }, // R |
| { 0, sint, 8, 8, 2 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R16G16_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 16, 4 }, // R |
| { 0, sint, 16, 16, 4 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32G32_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R32G32_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 32, 8 }, // R |
| { 0, sint, 32, 32, 8 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8B8A8_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R8G8B8A8_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 8, 4 }, // R |
| { 0, sint, 8, 8, 4 }, // G |
| { 0, sint, 16, 8, 4 }, // B |
| { 0, sint, 24, 8, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16B16A16_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R16G16B16A16_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 16, 8 }, // R |
| { 0, sint, 16, 16, 8 }, // G |
| { 0, sint, 32, 16, 8 }, // B |
| { 0, sint, 48, 16, 8 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32G32B32A32_SINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 16, 1, 1, VK_FORMAT_R32G32B32A32_SINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sint, 0, 32, 16 }, // R |
| { 0, sint, 32, 32, 16 }, // G |
| { 0, sint, 64, 32, 16 }, // B |
| { 0, sint, 96, 32, 16 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_R8_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 8, 1 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R16_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 16, 2 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R32_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 32, 4 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R64_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R64_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 64, 8 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_R8G8_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 8, 2 }, // R |
| { 0, uint, 8, 8, 2 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R16G16_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 16, 4 }, // R |
| { 0, uint, 16, 16, 4 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32G32_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R32G32_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 32, 8 }, // R |
| { 0, uint, 32, 32, 8 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8B8A8_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R8G8B8A8_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 8, 4 }, // R |
| { 0, uint, 8, 8, 4 }, // G |
| { 0, uint, 16, 8, 4 }, // B |
| { 0, uint, 24, 8, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16B16A16_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R16G16B16A16_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 16, 8 }, // R |
| { 0, uint, 16, 16, 8 }, // G |
| { 0, uint, 32, 16, 8 }, // B |
| { 0, uint, 48, 16, 8 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32G32B32A32_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 16, 1, 1, VK_FORMAT_R32G32B32A32_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 32, 16 }, // R |
| { 0, uint, 32, 32, 16 }, // G |
| { 0, uint, 64, 32, 16 }, // B |
| { 0, uint, 96, 32, 16 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R8G8B8A8_SNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R8G8B8A8_SNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, snorm, 0, 8, 4 }, // R |
| { 0, snorm, 8, 8, 4 }, // G |
| { 0, snorm, 16, 8, 4 }, // B |
| { 0, snorm, 24, 8, 4 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R16G16B16A16_SNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR | chanG | chanB | chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 8, 1, 1, VK_FORMAT_R16G16B16A16_SNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, snorm, 0, 16, 8 }, // R |
| { 0, snorm, 16, 16, 8 }, // G |
| { 0, snorm, 32, 16, 8 }, // B |
| { 0, snorm, 48, 16, 8 } // A |
| } |
| }; |
| return desc; |
| } |
| case VK_FORMAT_R32_SFLOAT: |
| case VK_FORMAT_D32_SFLOAT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 4, 1, 1, VK_FORMAT_R32_SFLOAT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sfloat, 0, 32, 4 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_D16_UNORM: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_D16_UNORM }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 16, 2 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_S8_UINT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 1, 1, 1, VK_FORMAT_S8_UINT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED}, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, uint, 0, 8, 1 }, // R |
| { 0, 0, 0, 0, 0 }, // G |
| { 0, 0, 0, 0, 0 }, // B |
| { 0, 0, 0, 0, 0 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_R32G32B32A32_SFLOAT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 16, 1, 1, VK_FORMAT_R32G32B32A32_SFLOAT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, sfloat, 0, 32, 16 }, // R |
| { 0, sfloat, 32, 32, 16 }, // G |
| { 0, sfloat, 64, 32, 16 }, // B |
| { 0, sfloat, 96, 32, 16 }, // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 8, 4, 2 }, // R |
| { 0, unorm, 4, 4, 2 }, // G |
| { 0, unorm, 0, 4, 2 }, // B |
| { 0, unorm, 12, 4, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: |
| { |
| const PlanarFormatDescription desc = |
| { |
| 1, // planes |
| chanR|chanG|chanB|chanA, |
| 1,1, |
| { |
| // Size WDiv HDiv planeCompatibleFormat |
| { 2, 1, 1, VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| { 0, 0, 0, VK_FORMAT_UNDEFINED }, |
| }, |
| { |
| // Plane Type Offs Size Stride |
| { 0, unorm, 0, 4, 2 }, // R |
| { 0, unorm, 4, 4, 2 }, // G |
| { 0, unorm, 8, 4, 2 }, // B |
| { 0, unorm, 12, 4, 2 } // A |
| } |
| }; |
| return desc; |
| } |
| |
| |
| default: |
| TCU_THROW(InternalError, "Not implemented"); |
| } |
| } |
| |
| PlanarFormatDescription getPlanarFormatDescription (VkFormat format) |
| { |
| if (isYCbCrFormat(format)) |
| return getYCbCrPlanarFormatDescription(format); |
| else |
| return getCorePlanarFormatDescription(format); |
| } |
| |
| int getPlaneCount (VkFormat format) |
| { |
| switch (format) |
| { |
| case VK_FORMAT_G8B8G8R8_422_UNORM: |
| case VK_FORMAT_B8G8R8G8_422_UNORM: |
| case VK_FORMAT_R10X6_UNORM_PACK16: |
| case VK_FORMAT_R10X6G10X6_UNORM_2PACK16: |
| case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: |
| case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_R12X4_UNORM_PACK16: |
| case VK_FORMAT_R12X4G12X4_UNORM_2PACK16: |
| case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: |
| case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_G16B16G16R16_422_UNORM: |
| case VK_FORMAT_B16G16R16G16_422_UNORM: |
| return 1; |
| |
| case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT: |
| case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: |
| return 2; |
| |
| case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: |
| case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: |
| return 3; |
| |
| default: |
| DE_FATAL("Not YCbCr format"); |
| return 0; |
| } |
| } |
| |
| deUint32 getMipmapCount(VkFormat format, const vk::PlanarFormatDescription& formatDescription, const VkImageFormatProperties& imageFormatProperties, const VkExtent3D& extent) |
| { |
| if (isYCbCrFormat(format)) |
| return 1; |
| tcu::UVec3 imageAlignment = getImageSizeAlignment(formatDescription); |
| deUint32 mipmapEdge = std::max(std::max(extent.width, extent.height), extent.depth); |
| if (imageAlignment.x() > 1) |
| mipmapEdge = std::min(mipmapEdge, extent.width / imageAlignment.x()); |
| if (imageAlignment.y() > 1) |
| mipmapEdge = std::min(mipmapEdge, extent.height / imageAlignment.y()); |
| if (imageAlignment.z() > 1) |
| mipmapEdge = std::min(mipmapEdge, extent.depth / imageAlignment.z()); |
| return std::min(static_cast<deUint32>(deFloatLog2(static_cast<float>(mipmapEdge))) + 1u, imageFormatProperties.maxMipLevels); |
| } |
| |
| deUint32 getPlaneSizeInBytes (const PlanarFormatDescription& formatInfo, |
| const VkExtent3D& baseExtents, |
| const deUint32 planeNdx, |
| const deUint32 mipmapLevel, |
| const deUint32 mipmapMemoryAlignment) |
| { |
| VkExtent3D imageExtent = getPlaneExtent(formatInfo, baseExtents, planeNdx, mipmapLevel); |
| imageExtent.width /= formatInfo.blockWidth; |
| imageExtent.height /= formatInfo.blockHeight; |
| return deAlign32( formatInfo.planes[planeNdx].elementSizeBytes * imageExtent.width * imageExtent.height * imageExtent.depth, mipmapMemoryAlignment); |
| } |
| |
| deUint32 getPlaneSizeInBytes (const PlanarFormatDescription& formatInfo, |
| const tcu::UVec2& baseExtents, |
| const deUint32 planeNdx, |
| const deUint32 mipmapLevel, |
| const deUint32 mipmapMemoryAlignment) |
| { |
| tcu::UVec2 mipExtents = getPlaneExtent(formatInfo, baseExtents, planeNdx, mipmapLevel) / tcu::UVec2(formatInfo.blockWidth, formatInfo.blockHeight); |
| return deAlign32( formatInfo.planes[planeNdx].elementSizeBytes * mipExtents.x() * mipExtents.y(), mipmapMemoryAlignment); |
| } |
| |
| VkExtent3D getPlaneExtent(const PlanarFormatDescription& formatInfo, |
| const VkExtent3D& baseExtents, |
| const deUint32 planeNdx, |
| const deUint32 mipmapLevel) |
| { |
| deUint32 widthDivisor = formatInfo.planes[planeNdx].widthDivisor; |
| deUint32 heightDivisor = formatInfo.planes[planeNdx].heightDivisor; |
| deUint32 depthDivisor = 1u; |
| VkExtent3D mip0Extents { baseExtents.width / widthDivisor, baseExtents.height / heightDivisor, baseExtents.depth / depthDivisor }; |
| |
| return mipLevelExtents(mip0Extents, mipmapLevel); |
| } |
| |
| tcu::UVec2 getPlaneExtent(const PlanarFormatDescription& formatInfo, |
| const tcu::UVec2& baseExtents, |
| const deUint32 planeNdx, |
| const deUint32 mipmapLevel) |
| { |
| deUint32 widthDivisor = formatInfo.planes[planeNdx].widthDivisor; |
| deUint32 heightDivisor = formatInfo.planes[planeNdx].heightDivisor; |
| tcu::UVec2 mip0Extents { baseExtents.x() / widthDivisor, baseExtents.y() / heightDivisor }; |
| |
| return tcu::UVec2 |
| { |
| std::max(mip0Extents.x() >> mipmapLevel, 1u), |
| std::max(mip0Extents.y() >> mipmapLevel, 1u) |
| }; |
| } |
| |
| tcu::UVec3 getImageSizeAlignment(VkFormat format) |
| { |
| return getImageSizeAlignment(getPlanarFormatDescription(format)); |
| } |
| |
| tcu::UVec3 getImageSizeAlignment(const PlanarFormatDescription& formatInfo) |
| { |
| tcu::UVec3 imgAlignment{ formatInfo.blockWidth, formatInfo.blockHeight, 1 }; |
| for (deUint32 planeNdx = 0; planeNdx < formatInfo.numPlanes; ++planeNdx) |
| { |
| imgAlignment.x() = std::max(imgAlignment.x(), static_cast<deUint32>(formatInfo.planes[planeNdx].widthDivisor)); |
| imgAlignment.y() = std::max(imgAlignment.y(), static_cast<deUint32>(formatInfo.planes[planeNdx].heightDivisor)); |
| } |
| return imgAlignment; |
| } |
| |
| tcu::UVec2 getBlockExtent(VkFormat format) |
| { |
| return getBlockExtent(getPlanarFormatDescription(format)); |
| } |
| |
| tcu::UVec2 getBlockExtent(const PlanarFormatDescription& formatInfo) |
| { |
| return tcu::UVec2{ formatInfo.blockWidth, formatInfo.blockHeight }; |
| } |
| |
| VkFormat getPlaneCompatibleFormat(VkFormat format, deUint32 planeNdx) |
| { |
| return getPlaneCompatibleFormat(getPlanarFormatDescription(format), planeNdx); |
| } |
| |
| VkFormat getPlaneCompatibleFormat(const PlanarFormatDescription& formatInfo, deUint32 planeNdx) |
| { |
| DE_ASSERT(planeNdx < formatInfo.numPlanes); |
| return formatInfo.planes[planeNdx].planeCompatibleFormat; |
| } |
| |
| VkImageAspectFlagBits getPlaneAspect (deUint32 planeNdx) |
| { |
| DE_ASSERT(de::inBounds(planeNdx, 0u, 3u)); |
| return (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT << planeNdx); |
| } |
| |
| deUint32 getAspectPlaneNdx (VkImageAspectFlagBits flags) |
| { |
| switch (flags) |
| { |
| case VK_IMAGE_ASPECT_PLANE_0_BIT: return 0; |
| case VK_IMAGE_ASPECT_PLANE_1_BIT: return 1; |
| case VK_IMAGE_ASPECT_PLANE_2_BIT: return 2; |
| default: |
| DE_FATAL("Invalid plane aspect"); |
| return 0; |
| } |
| } |
| |
| bool isChromaSubsampled (VkFormat format) |
| { |
| switch (format) |
| { |
| case VK_FORMAT_G8B8G8R8_422_UNORM: |
| case VK_FORMAT_B8G8R8G8_422_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: |
| case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: |
| case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: |
| case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: |
| case VK_FORMAT_G16B16G16R16_422_UNORM: |
| case VK_FORMAT_B16G16R16G16_422_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: |
| case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: |
| case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: |
| return true; |
| |
| default: |
| return false; |
| } |
| } |
| |
| bool isSupportedByFramework (VkFormat format) |
| { |
| if (format == VK_FORMAT_UNDEFINED || format > VK_CORE_FORMAT_LAST) |
| return false; |
| |
| switch (format) |
| { |
| case VK_FORMAT_R64_UINT: |
| case VK_FORMAT_R64_SINT: |
| case VK_FORMAT_R64_SFLOAT: |
| case VK_FORMAT_R64G64_UINT: |
| case VK_FORMAT_R64G64_SINT: |
| case VK_FORMAT_R64G64_SFLOAT: |
| case VK_FORMAT_R64G64B64_UINT: |
| case VK_FORMAT_R64G64B64_SINT: |
| case VK_FORMAT_R64G64B64_SFLOAT: |
| case VK_FORMAT_R64G64B64A64_UINT: |
| case VK_FORMAT_R64G64B64A64_SINT: |
| case VK_FORMAT_R64G64B64A64_SFLOAT: |
| // \todo [2016-12-01 pyry] Support 64-bit channel types |
| return false; |
| |
| case VK_FORMAT_BC1_RGB_UNORM_BLOCK: |
| case VK_FORMAT_BC1_RGB_SRGB_BLOCK: |
| case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: |
| case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: |
| case VK_FORMAT_BC2_UNORM_BLOCK: |
| case VK_FORMAT_BC2_SRGB_BLOCK: |
| case VK_FORMAT_BC3_UNORM_BLOCK: |
| case VK_FORMAT_BC3_SRGB_BLOCK: |
| case VK_FORMAT_BC4_UNORM_BLOCK: |
| case VK_FORMAT_BC4_SNORM_BLOCK: |
| case VK_FORMAT_BC5_UNORM_BLOCK: |
| case VK_FORMAT_BC5_SNORM_BLOCK: |
| case VK_FORMAT_BC6H_UFLOAT_BLOCK: |
| case VK_FORMAT_BC6H_SFLOAT_BLOCK: |
| case VK_FORMAT_BC7_UNORM_BLOCK: |
| case VK_FORMAT_BC7_SRGB_BLOCK: |
| return false; |
| |
| default: |
| return true; |
| } |
| } |
| |
| void checkImageSupport (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const VkImageCreateInfo& imageCreateInfo) |
| { |
| VkImageFormatProperties imageFormatProperties; |
| |
| if (vki.getPhysicalDeviceImageFormatProperties(physicalDevice, imageCreateInfo.format, imageCreateInfo.imageType, |
| imageCreateInfo.tiling, imageCreateInfo.usage, imageCreateInfo.flags, |
| &imageFormatProperties)) |
| { |
| TCU_THROW(NotSupportedError, "Image format not supported."); |
| } |
| if (((VkSampleCountFlagBits)imageFormatProperties.sampleCounts & imageCreateInfo.samples) == 0) |
| { |
| TCU_THROW(NotSupportedError, "Sample count not supported."); |
| } |
| if (imageFormatProperties.maxArrayLayers < imageCreateInfo.arrayLayers) |
| { |
| TCU_THROW(NotSupportedError, "Layer count not supported."); |
| } |
| } |
| |
| VkFormat mapTextureFormat (const tcu::TextureFormat& format) |
| { |
| DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST < (1<<16)); |
| DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST < (1<<16)); |
| |
| #define PACK_FMT(ORDER, TYPE) ((int(ORDER) << 16) | int(TYPE)) |
| #define FMT_CASE(ORDER, TYPE) PACK_FMT(tcu::TextureFormat::ORDER, tcu::TextureFormat::TYPE) |
| |
| // update this mapping if VkFormat changes |
| DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185); |
| |
| switch (PACK_FMT(format.order, format.type)) |
| { |
| case FMT_CASE(RG, UNORM_BYTE_44): return VK_FORMAT_R4G4_UNORM_PACK8; |
| case FMT_CASE(RGB, UNORM_SHORT_565): return VK_FORMAT_R5G6B5_UNORM_PACK16; |
| case FMT_CASE(RGBA, UNORM_SHORT_4444): return VK_FORMAT_R4G4B4A4_UNORM_PACK16; |
| case FMT_CASE(RGBA, UNORM_SHORT_5551): return VK_FORMAT_R5G5B5A1_UNORM_PACK16; |
| |
| case FMT_CASE(BGR, UNORM_SHORT_565): return VK_FORMAT_B5G6R5_UNORM_PACK16; |
| case FMT_CASE(BGRA, UNORM_SHORT_4444): return VK_FORMAT_B4G4R4A4_UNORM_PACK16; |
| case FMT_CASE(BGRA, UNORM_SHORT_5551): return VK_FORMAT_B5G5R5A1_UNORM_PACK16; |
| |
| case FMT_CASE(ARGB, UNORM_SHORT_1555): return VK_FORMAT_A1R5G5B5_UNORM_PACK16; |
| |
| case FMT_CASE(R, UNORM_INT8): return VK_FORMAT_R8_UNORM; |
| case FMT_CASE(R, SNORM_INT8): return VK_FORMAT_R8_SNORM; |
| case FMT_CASE(R, UNSIGNED_INT8): return VK_FORMAT_R8_UINT; |
| case FMT_CASE(R, SIGNED_INT8): return VK_FORMAT_R8_SINT; |
| case FMT_CASE(sR, UNORM_INT8): return VK_FORMAT_R8_SRGB; |
| |
| case FMT_CASE(RG, UNORM_INT8): return VK_FORMAT_R8G8_UNORM; |
| case FMT_CASE(RG, SNORM_INT8): return VK_FORMAT_R8G8_SNORM; |
| case FMT_CASE(RG, UNSIGNED_INT8): return VK_FORMAT_R8G8_UINT; |
| case FMT_CASE(RG, SIGNED_INT8): return VK_FORMAT_R8G8_SINT; |
| case FMT_CASE(sRG, UNORM_INT8): return VK_FORMAT_R8G8_SRGB; |
| |
| case FMT_CASE(RGB, UNORM_INT8): return VK_FORMAT_R8G8B8_UNORM; |
| case FMT_CASE(RGB, SNORM_INT8): return VK_FORMAT_R8G8B8_SNORM; |
| case FMT_CASE(RGB, UNSIGNED_INT8): return VK_FORMAT_R8G8B8_UINT; |
|