diff options
Diffstat (limited to 'src/vulkan/util/vk_format.h')
-rw-r--r-- | src/vulkan/util/vk_format.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/src/vulkan/util/vk_format.h b/src/vulkan/util/vk_format.h index f03a35e2ad7..e8bb2d56190 100644 --- a/src/vulkan/util/vk_format.h +++ b/src/vulkan/util/vk_format.h @@ -27,17 +27,29 @@ #include <vulkan/vulkan_core.h> #include "util/format/u_format.h" +#include "util/u_math.h" #ifdef __cplusplus extern "C" { #endif +extern const enum pipe_format vk_format_map[]; + enum pipe_format vk_format_to_pipe_format(enum VkFormat vkformat); +VkFormat +vk_format_from_pipe_format(enum pipe_format format); + VkImageAspectFlags vk_format_aspects(VkFormat format); +static inline const struct util_format_description * +vk_format_description(VkFormat format) +{ + return util_format_description(vk_format_to_pipe_format(format)); +} + static inline bool vk_format_is_color(VkFormat format) { @@ -88,6 +100,170 @@ vk_format_stencil_only(VkFormat format) return VK_FORMAT_S8_UINT; } +void vk_component_mapping_to_pipe_swizzle(VkComponentMapping mapping, + unsigned char out_swizzle[4]); + +static inline bool +vk_format_is_int(VkFormat format) +{ + return util_format_is_pure_integer(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_sint(VkFormat format) +{ + return util_format_is_pure_sint(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_uint(VkFormat format) +{ + return util_format_is_pure_uint(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_unorm(VkFormat format) +{ + return util_format_is_unorm(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_snorm(VkFormat format) +{ + return util_format_is_snorm(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_float(VkFormat format) +{ + return util_format_is_float(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_srgb(VkFormat format) +{ + return util_format_is_srgb(vk_format_to_pipe_format(format)); +} + +static inline bool vk_format_is_alpha(VkFormat format) +{ + return util_format_is_alpha(vk_format_to_pipe_format(format)); +} + +static inline bool vk_format_is_alpha_on_msb(VkFormat vk_format) +{ + const struct util_format_description *desc = + vk_format_description(vk_format); + + return (desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB || + desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) && +#if UTIL_ARCH_BIG_ENDIAN + desc->swizzle[3] == PIPE_SWIZZLE_X; +#else + desc->swizzle[3] == PIPE_SWIZZLE_W; +#endif +} + +static inline unsigned +vk_format_get_blocksize(VkFormat format) +{ + return util_format_get_blocksize(vk_format_to_pipe_format(format)); +} + +static inline unsigned +vk_format_get_blockwidth(VkFormat format) +{ + return util_format_get_blockwidth(vk_format_to_pipe_format(format)); +} + +static inline unsigned +vk_format_get_blockheight(VkFormat format) +{ + return util_format_get_blockheight(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_is_compressed(VkFormat format) +{ + /* this includes 4:2:2 formats, which are compressed formats for vulkan */ + return vk_format_get_blockwidth(format) > 1; +} + +static inline bool +vk_format_is_block_compressed(VkFormat format) +{ + return util_format_is_compressed(vk_format_to_pipe_format(format)); +} + +static inline unsigned +vk_format_get_component_bits(VkFormat format, enum util_format_colorspace colorspace, + unsigned component) +{ + return util_format_get_component_bits(vk_format_to_pipe_format(format), + colorspace, + component); +} + +static inline unsigned +vk_format_get_nr_components(VkFormat format) +{ + return util_format_get_nr_components(vk_format_to_pipe_format(format)); +} + +static inline bool +vk_format_has_alpha(VkFormat format) +{ + return util_format_has_alpha(vk_format_to_pipe_format(format)); +} + +static inline unsigned +vk_format_get_blocksizebits(VkFormat format) +{ + return util_format_get_blocksizebits(vk_format_to_pipe_format(format)); +} + +VkFormat +vk_format_get_plane_format(VkFormat format, unsigned plane_id); + +VkFormat +vk_format_get_aspect_format(VkFormat format, const VkImageAspectFlags aspect); + +struct vk_format_ycbcr_plane { + /* RGBA format for this plane */ + VkFormat format; + + /* Whether this plane contains chroma channels */ + bool has_chroma; + + /* For downscaling of YUV planes */ + uint8_t denominator_scales[2]; + + /* How to map sampled ycbcr planes to a single 4 component element. + * + * We use uint8_t for compactness but it's actually VkComponentSwizzle. + */ + uint8_t ycbcr_swizzle[4]; +}; + +struct vk_format_ycbcr_info { + uint8_t n_planes; + struct vk_format_ycbcr_plane planes[3]; +}; + +const struct vk_format_ycbcr_info *vk_format_get_ycbcr_info(VkFormat format); + +static inline unsigned +vk_format_get_plane_count(VkFormat format) +{ + const struct vk_format_ycbcr_info *ycbcr_info = + vk_format_get_ycbcr_info(format); + return ycbcr_info ? ycbcr_info->n_planes : 1; +} + +VkClearColorValue +vk_swizzle_color_value(VkClearColorValue color, + VkComponentMapping swizzle, bool is_int); + #ifdef __cplusplus } #endif |