101e04c3fSmrg/* 201e04c3fSmrg * Copyright © 2016 Red Hat. 301e04c3fSmrg * Copyright © 2016 Bas Nieuwenhuizen 401e04c3fSmrg * 501e04c3fSmrg * Based on u_format.h which is: 67ec681f3Smrg * Copyright 2009-2010 VMware, Inc. 701e04c3fSmrg * Permission is hereby granted, free of charge, to any person obtaining a 801e04c3fSmrg * copy of this software and associated documentation files (the "Software"), 901e04c3fSmrg * to deal in the Software without restriction, including without limitation 1001e04c3fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1101e04c3fSmrg * and/or sell copies of the Software, and to permit persons to whom the 1201e04c3fSmrg * Software is furnished to do so, subject to the following conditions: 1301e04c3fSmrg * 1401e04c3fSmrg * The above copyright notice and this permission notice (including the next 1501e04c3fSmrg * paragraph) shall be included in all copies or substantial portions of the 1601e04c3fSmrg * Software. 1701e04c3fSmrg * 1801e04c3fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1901e04c3fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2001e04c3fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2101e04c3fSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2201e04c3fSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2301e04c3fSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2401e04c3fSmrg * IN THE SOFTWARE. 2501e04c3fSmrg */ 2601e04c3fSmrg 2701e04c3fSmrg#ifndef VK_FORMAT_H 2801e04c3fSmrg#define VK_FORMAT_H 2901e04c3fSmrg 3001e04c3fSmrg#include <assert.h> 3101e04c3fSmrg#include <util/macros.h> 327ec681f3Smrg#include <vulkan/util/vk_format.h> 337ec681f3Smrg#include <vulkan/vulkan.h> 3401e04c3fSmrg 357ec681f3Smrgstatic inline const struct util_format_description * 367ec681f3Smrgvk_format_description(VkFormat format) 3701e04c3fSmrg{ 387ec681f3Smrg return util_format_description(vk_format_to_pipe_format(format)); 397ec681f3Smrg} 4001e04c3fSmrg 4101e04c3fSmrg/** 4201e04c3fSmrg * Return total bits needed for the pixel format per block. 4301e04c3fSmrg */ 4401e04c3fSmrgstatic inline unsigned 4501e04c3fSmrgvk_format_get_blocksizebits(VkFormat format) 4601e04c3fSmrg{ 477ec681f3Smrg return util_format_get_blocksizebits(vk_format_to_pipe_format(format)); 4801e04c3fSmrg} 4901e04c3fSmrg 5001e04c3fSmrg/** 5101e04c3fSmrg * Return bytes per block (not pixel) for the given format. 5201e04c3fSmrg */ 5301e04c3fSmrgstatic inline unsigned 5401e04c3fSmrgvk_format_get_blocksize(VkFormat format) 5501e04c3fSmrg{ 567ec681f3Smrg return util_format_get_blocksize(vk_format_to_pipe_format(format)); 5701e04c3fSmrg} 5801e04c3fSmrg 5901e04c3fSmrgstatic inline unsigned 6001e04c3fSmrgvk_format_get_blockwidth(VkFormat format) 6101e04c3fSmrg{ 627ec681f3Smrg return util_format_get_blockwidth(vk_format_to_pipe_format(format)); 6301e04c3fSmrg} 6401e04c3fSmrg 6501e04c3fSmrgstatic inline unsigned 6601e04c3fSmrgvk_format_get_blockheight(VkFormat format) 6701e04c3fSmrg{ 687ec681f3Smrg return util_format_get_blockheight(vk_format_to_pipe_format(format)); 6901e04c3fSmrg} 7001e04c3fSmrg 7101e04c3fSmrg/** 7201e04c3fSmrg * Return the index of the first non-void channel 7301e04c3fSmrg * -1 if no non-void channels 7401e04c3fSmrg */ 7501e04c3fSmrgstatic inline int 7601e04c3fSmrgvk_format_get_first_non_void_channel(VkFormat format) 7701e04c3fSmrg{ 787ec681f3Smrg return util_format_get_first_non_void_channel(vk_format_to_pipe_format(format)); 7901e04c3fSmrg} 8001e04c3fSmrg 817ec681f3Smrgstatic inline enum pipe_swizzle 827ec681f3Smrgradv_swizzle_conv(VkComponentSwizzle component, const unsigned char chan[4], 837ec681f3Smrg VkComponentSwizzle vk_swiz) 8401e04c3fSmrg{ 857ec681f3Smrg if (vk_swiz == VK_COMPONENT_SWIZZLE_IDENTITY) 867ec681f3Smrg vk_swiz = component; 877ec681f3Smrg switch (vk_swiz) { 887ec681f3Smrg case VK_COMPONENT_SWIZZLE_ZERO: 897ec681f3Smrg return PIPE_SWIZZLE_0; 907ec681f3Smrg case VK_COMPONENT_SWIZZLE_ONE: 917ec681f3Smrg return PIPE_SWIZZLE_1; 927ec681f3Smrg case VK_COMPONENT_SWIZZLE_R: 937ec681f3Smrg case VK_COMPONENT_SWIZZLE_G: 947ec681f3Smrg case VK_COMPONENT_SWIZZLE_B: 957ec681f3Smrg case VK_COMPONENT_SWIZZLE_A: 967ec681f3Smrg return (enum pipe_swizzle)chan[vk_swiz - VK_COMPONENT_SWIZZLE_R]; 977ec681f3Smrg default: 987ec681f3Smrg unreachable("Illegal swizzle"); 997ec681f3Smrg } 10001e04c3fSmrg} 10101e04c3fSmrg 1027ec681f3Smrgstatic inline void 1037ec681f3Smrgvk_format_compose_swizzles(const VkComponentMapping *mapping, const unsigned char swz[4], 1047ec681f3Smrg enum pipe_swizzle dst[4]) 10501e04c3fSmrg{ 1067ec681f3Smrg dst[0] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_R, swz, mapping->r); 1077ec681f3Smrg dst[1] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_G, swz, mapping->g); 1087ec681f3Smrg dst[2] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_B, swz, mapping->b); 1097ec681f3Smrg dst[3] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_A, swz, mapping->a); 11001e04c3fSmrg} 11101e04c3fSmrg 11201e04c3fSmrgstatic inline bool 11301e04c3fSmrgvk_format_is_compressed(VkFormat format) 11401e04c3fSmrg{ 1157ec681f3Smrg return util_format_is_compressed(vk_format_to_pipe_format(format)); 11601e04c3fSmrg} 11701e04c3fSmrg 118ed98bd31Smayastatic inline bool 119ed98bd31Smayavk_format_is_subsampled(VkFormat format) 120ed98bd31Smaya{ 1217ec681f3Smrg return util_format_is_subsampled_422(vk_format_to_pipe_format(format)); 12201e04c3fSmrg} 12301e04c3fSmrg 12401e04c3fSmrgstatic inline bool 1257ec681f3Smrgvk_format_is_int(VkFormat format) 12601e04c3fSmrg{ 1277ec681f3Smrg return util_format_is_pure_integer(vk_format_to_pipe_format(format)); 12801e04c3fSmrg} 12901e04c3fSmrg 13001e04c3fSmrgstatic inline bool 1317ec681f3Smrgvk_format_is_uint(VkFormat format) 13201e04c3fSmrg{ 1337ec681f3Smrg return util_format_is_pure_uint(vk_format_to_pipe_format(format)); 13401e04c3fSmrg} 13501e04c3fSmrg 13601e04c3fSmrgstatic inline bool 1377ec681f3Smrgvk_format_is_sint(VkFormat format) 13801e04c3fSmrg{ 1397ec681f3Smrg return util_format_is_pure_sint(vk_format_to_pipe_format(format)); 14001e04c3fSmrg} 14101e04c3fSmrg 14201e04c3fSmrgstatic inline bool 1437ec681f3Smrgvk_format_is_unorm(VkFormat format) 14401e04c3fSmrg{ 1457ec681f3Smrg return util_format_is_unorm(vk_format_to_pipe_format(format)); 14601e04c3fSmrg} 14701e04c3fSmrg 14801e04c3fSmrgstatic inline bool 14901e04c3fSmrgvk_format_is_srgb(VkFormat format) 15001e04c3fSmrg{ 1517ec681f3Smrg return util_format_is_srgb(vk_format_to_pipe_format(format)); 15201e04c3fSmrg} 15301e04c3fSmrg 15401e04c3fSmrgstatic inline VkFormat 15501e04c3fSmrgvk_format_no_srgb(VkFormat format) 15601e04c3fSmrg{ 1577ec681f3Smrg switch (format) { 1587ec681f3Smrg case VK_FORMAT_R8_SRGB: 1597ec681f3Smrg return VK_FORMAT_R8_UNORM; 1607ec681f3Smrg case VK_FORMAT_R8G8_SRGB: 1617ec681f3Smrg return VK_FORMAT_R8G8_UNORM; 1627ec681f3Smrg case VK_FORMAT_R8G8B8_SRGB: 1637ec681f3Smrg return VK_FORMAT_R8G8B8_UNORM; 1647ec681f3Smrg case VK_FORMAT_B8G8R8_SRGB: 1657ec681f3Smrg return VK_FORMAT_B8G8R8_UNORM; 1667ec681f3Smrg case VK_FORMAT_R8G8B8A8_SRGB: 1677ec681f3Smrg return VK_FORMAT_R8G8B8A8_UNORM; 1687ec681f3Smrg case VK_FORMAT_B8G8R8A8_SRGB: 1697ec681f3Smrg return VK_FORMAT_B8G8R8A8_UNORM; 1707ec681f3Smrg case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 1717ec681f3Smrg return VK_FORMAT_A8B8G8R8_UNORM_PACK32; 1727ec681f3Smrg case VK_FORMAT_BC1_RGB_SRGB_BLOCK: 1737ec681f3Smrg return VK_FORMAT_BC1_RGB_UNORM_BLOCK; 1747ec681f3Smrg case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: 1757ec681f3Smrg return VK_FORMAT_BC1_RGBA_UNORM_BLOCK; 1767ec681f3Smrg case VK_FORMAT_BC2_SRGB_BLOCK: 1777ec681f3Smrg return VK_FORMAT_BC2_UNORM_BLOCK; 1787ec681f3Smrg case VK_FORMAT_BC3_SRGB_BLOCK: 1797ec681f3Smrg return VK_FORMAT_BC3_UNORM_BLOCK; 1807ec681f3Smrg case VK_FORMAT_BC7_SRGB_BLOCK: 1817ec681f3Smrg return VK_FORMAT_BC7_UNORM_BLOCK; 1827ec681f3Smrg case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: 1837ec681f3Smrg return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; 1847ec681f3Smrg case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: 1857ec681f3Smrg return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK; 1867ec681f3Smrg case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: 1877ec681f3Smrg return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK; 1887ec681f3Smrg default: 1897ec681f3Smrg assert(!vk_format_is_srgb(format)); 1907ec681f3Smrg return format; 1917ec681f3Smrg } 19201e04c3fSmrg} 19301e04c3fSmrg 19401e04c3fSmrgstatic inline unsigned 1957ec681f3Smrgvk_format_get_component_bits(VkFormat format, enum util_format_colorspace colorspace, 1967ec681f3Smrg unsigned component) 19701e04c3fSmrg{ 1987ec681f3Smrg const struct util_format_description *desc = vk_format_description(format); 1997ec681f3Smrg enum util_format_colorspace desc_colorspace; 2007ec681f3Smrg 2017ec681f3Smrg assert(format); 2027ec681f3Smrg if (!format) { 2037ec681f3Smrg return 0; 2047ec681f3Smrg } 2057ec681f3Smrg 2067ec681f3Smrg assert(component < 4); 2077ec681f3Smrg 2087ec681f3Smrg /* Treat RGB and SRGB as equivalent. */ 2097ec681f3Smrg if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 2107ec681f3Smrg colorspace = UTIL_FORMAT_COLORSPACE_RGB; 2117ec681f3Smrg } 2127ec681f3Smrg if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 2137ec681f3Smrg desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB; 2147ec681f3Smrg } else { 2157ec681f3Smrg desc_colorspace = desc->colorspace; 2167ec681f3Smrg } 2177ec681f3Smrg 2187ec681f3Smrg if (desc_colorspace != colorspace) { 2197ec681f3Smrg return 0; 2207ec681f3Smrg } 2217ec681f3Smrg 2227ec681f3Smrg switch (desc->swizzle[component]) { 2237ec681f3Smrg case PIPE_SWIZZLE_X: 2247ec681f3Smrg return desc->channel[0].size; 2257ec681f3Smrg case PIPE_SWIZZLE_Y: 2267ec681f3Smrg return desc->channel[1].size; 2277ec681f3Smrg case PIPE_SWIZZLE_Z: 2287ec681f3Smrg return desc->channel[2].size; 2297ec681f3Smrg case PIPE_SWIZZLE_W: 2307ec681f3Smrg return desc->channel[3].size; 2317ec681f3Smrg default: 2327ec681f3Smrg return 0; 2337ec681f3Smrg } 23401e04c3fSmrg} 23501e04c3fSmrg 23601e04c3fSmrgstatic inline VkFormat 23701e04c3fSmrgvk_to_non_srgb_format(VkFormat format) 23801e04c3fSmrg{ 2397ec681f3Smrg switch (format) { 2407ec681f3Smrg case VK_FORMAT_R8_SRGB: 2417ec681f3Smrg return VK_FORMAT_R8_UNORM; 2427ec681f3Smrg case VK_FORMAT_R8G8_SRGB: 2437ec681f3Smrg return VK_FORMAT_R8G8_UNORM; 2447ec681f3Smrg case VK_FORMAT_R8G8B8_SRGB: 2457ec681f3Smrg return VK_FORMAT_R8G8B8_UNORM; 2467ec681f3Smrg case VK_FORMAT_B8G8R8_SRGB: 2477ec681f3Smrg return VK_FORMAT_B8G8R8_UNORM; 2487ec681f3Smrg case VK_FORMAT_R8G8B8A8_SRGB: 2497ec681f3Smrg return VK_FORMAT_R8G8B8A8_UNORM; 2507ec681f3Smrg case VK_FORMAT_B8G8R8A8_SRGB: 2517ec681f3Smrg return VK_FORMAT_B8G8R8A8_UNORM; 2527ec681f3Smrg case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 2537ec681f3Smrg return VK_FORMAT_A8B8G8R8_UNORM_PACK32; 2547ec681f3Smrg default: 2557ec681f3Smrg return format; 2567ec681f3Smrg } 25701e04c3fSmrg} 25801e04c3fSmrg 25901e04c3fSmrgstatic inline unsigned 26001e04c3fSmrgvk_format_get_nr_components(VkFormat format) 26101e04c3fSmrg{ 2627ec681f3Smrg return util_format_get_nr_components(vk_format_to_pipe_format(format)); 26301e04c3fSmrg} 26401e04c3fSmrg 265ed98bd31Smayastatic inline unsigned 266ed98bd31Smayavk_format_get_plane_count(VkFormat format) 267ed98bd31Smaya{ 2687ec681f3Smrg return util_format_get_num_planes(vk_format_to_pipe_format(format)); 2697ec681f3Smrg} 270ed98bd31Smaya 2717ec681f3Smrgstatic inline unsigned 2727ec681f3Smrgvk_format_get_plane_width(VkFormat format, unsigned plane, unsigned width) 2737ec681f3Smrg{ 2747ec681f3Smrg return util_format_get_plane_width(vk_format_to_pipe_format(format), plane, width); 2757ec681f3Smrg} 2767ec681f3Smrg 2777ec681f3Smrgstatic inline unsigned 2787ec681f3Smrgvk_format_get_plane_height(VkFormat format, unsigned plane, unsigned height) 2797ec681f3Smrg{ 2807ec681f3Smrg return util_format_get_plane_height(vk_format_to_pipe_format(format), plane, height); 281ed98bd31Smaya} 282ed98bd31Smaya 283ed98bd31Smayastatic inline VkFormat 284ed98bd31Smayavk_format_get_plane_format(VkFormat format, unsigned plane_id) 285ed98bd31Smaya{ 2867ec681f3Smrg assert(plane_id < vk_format_get_plane_count(format)); 2877ec681f3Smrg 2887ec681f3Smrg switch (format) { 2897ec681f3Smrg case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: 2907ec681f3Smrg case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: 2917ec681f3Smrg case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: 2927ec681f3Smrg return VK_FORMAT_R8_UNORM; 2937ec681f3Smrg case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: 2947ec681f3Smrg case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: 2957ec681f3Smrg return plane_id ? VK_FORMAT_R8G8_UNORM : VK_FORMAT_R8_UNORM; 2967ec681f3Smrg case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: 2977ec681f3Smrg case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: 2987ec681f3Smrg case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: 2997ec681f3Smrg return VK_FORMAT_R16_UNORM; 3007ec681f3Smrg case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: 3017ec681f3Smrg case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: 3027ec681f3Smrg return plane_id ? VK_FORMAT_R16G16_UNORM : VK_FORMAT_R16_UNORM; 3037ec681f3Smrg default: 3047ec681f3Smrg assert(vk_format_get_plane_count(format) == 1); 3057ec681f3Smrg return format; 3067ec681f3Smrg } 307ed98bd31Smaya} 308ed98bd31Smaya 30901e04c3fSmrg#endif /* VK_FORMAT_H */ 310