X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fvulkan%2Fvk_format.h;h=933db4d961c0b3bac6d98787108158a6fd7cf6f5;hb=de06dfa9ea05ab5d06efb20223a858eb42d02683;hp=e0087f1dea500cad30d74f5200834146b19871d7;hpb=f4e499ec79147f4172f3669ae9dafd941aaeeb65;p=mesa.git diff --git a/src/amd/vulkan/vk_format.h b/src/amd/vulkan/vk_format.h index e0087f1dea5..933db4d961c 100644 --- a/src/amd/vulkan/vk_format.h +++ b/src/amd/vulkan/vk_format.h @@ -24,14 +24,13 @@ * IN THE SOFTWARE. */ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif +#ifndef VK_FORMAT_H +#define VK_FORMAT_H #include #include +#include + enum vk_format_layout { /** * Formats with vk_format_block::width == vk_format_block::height == 1 @@ -143,7 +142,7 @@ const struct vk_format_description *vk_format_description(VkFormat format); /** * Return total bits needed for the pixel format per block. */ -static inline uint +static inline unsigned vk_format_get_blocksizebits(VkFormat format) { const struct vk_format_description *desc = vk_format_description(format); @@ -159,11 +158,11 @@ vk_format_get_blocksizebits(VkFormat format) /** * Return bytes per block (not pixel) for the given format. */ -static inline uint +static inline unsigned vk_format_get_blocksize(VkFormat format) { - uint bits = vk_format_get_blocksizebits(format); - uint bytes = bits / 8; + unsigned bits = vk_format_get_blocksizebits(format); + unsigned bytes = bits / 8; assert(bits % 8 == 0); assert(bytes > 0); @@ -174,7 +173,7 @@ vk_format_get_blocksize(VkFormat format) return bytes; } -static inline uint +static inline unsigned vk_format_get_blockwidth(VkFormat format) { const struct vk_format_description *desc = vk_format_description(format); @@ -187,7 +186,7 @@ vk_format_get_blockwidth(VkFormat format) return desc->block.width; } -static inline uint +static inline unsigned vk_format_get_blockheight(VkFormat format) { const struct vk_format_description *desc = vk_format_description(format); @@ -257,12 +256,13 @@ vk_format_aspects(VkFormat format) } static inline enum vk_swizzle -radv_swizzle_conv(int idx, const unsigned char chan[4], VkComponentSwizzle vk_swiz) +radv_swizzle_conv(VkComponentSwizzle component, const unsigned char chan[4], VkComponentSwizzle vk_swiz) { int x; + + if (vk_swiz == VK_COMPONENT_SWIZZLE_IDENTITY) + vk_swiz = component; switch (vk_swiz) { - case VK_COMPONENT_SWIZZLE_IDENTITY: - return chan[idx]; case VK_COMPONENT_SWIZZLE_ZERO: return VK_SWIZZLE_0; case VK_COMPONENT_SWIZZLE_ONE: @@ -288,7 +288,7 @@ radv_swizzle_conv(int idx, const unsigned char chan[4], VkComponentSwizzle vk_sw return x; return VK_SWIZZLE_1; default: - return chan[idx]; + unreachable("Illegal swizzle"); } } @@ -296,10 +296,10 @@ static inline void vk_format_compose_swizzles(const VkComponentMapping *mapping, const unsigned char swz[4], enum vk_swizzle dst[4]) { - dst[0] = radv_swizzle_conv(0, swz, mapping->r); - dst[1] = radv_swizzle_conv(1, swz, mapping->g); - dst[2] = radv_swizzle_conv(2, swz, mapping->b); - dst[3] = radv_swizzle_conv(3, swz, mapping->a); + dst[0] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_R, swz, mapping->r); + dst[1] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_G, swz, mapping->g); + dst[2] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_B, swz, mapping->b); + dst[3] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_A, swz, mapping->a); } static inline bool @@ -366,6 +366,19 @@ vk_format_is_depth(VkFormat format) return vk_format_has_depth(desc); } +static inline bool +vk_format_is_stencil(VkFormat format) +{ + const struct vk_format_description *desc = vk_format_description(format); + + assert(desc); + if (!desc) { + return false; + } + + return vk_format_has_stencil(desc); +} + static inline bool vk_format_is_color(VkFormat format) { @@ -396,16 +409,63 @@ vk_format_is_int(VkFormat format) return channel >= 0 && desc->channel[channel].pure_integer; } +static inline bool +vk_format_is_srgb(VkFormat format) +{ + const struct vk_format_description *desc = vk_format_description(format); + return desc->colorspace == VK_FORMAT_COLORSPACE_SRGB; +} + +static inline VkFormat +vk_format_no_srgb(VkFormat format) +{ + switch(format) { + case VK_FORMAT_R8_SRGB: + return VK_FORMAT_R8_UNORM; + case VK_FORMAT_R8G8_SRGB: + return VK_FORMAT_R8G8_UNORM; + case VK_FORMAT_R8G8B8_SRGB: + return VK_FORMAT_R8G8B8_UNORM; + case VK_FORMAT_B8G8R8_SRGB: + return VK_FORMAT_B8G8R8_UNORM; + case VK_FORMAT_R8G8B8A8_SRGB: + return VK_FORMAT_R8G8B8A8_UNORM; + case VK_FORMAT_B8G8R8A8_SRGB: + return VK_FORMAT_B8G8R8A8_UNORM; + case VK_FORMAT_A8B8G8R8_SRGB_PACK32: + return VK_FORMAT_A8B8G8R8_UNORM_PACK32; + case VK_FORMAT_BC1_RGB_SRGB_BLOCK: + return VK_FORMAT_BC1_RGB_UNORM_BLOCK; + case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: + return VK_FORMAT_BC1_RGBA_UNORM_BLOCK; + case VK_FORMAT_BC2_SRGB_BLOCK: + return VK_FORMAT_BC2_UNORM_BLOCK; + case VK_FORMAT_BC3_SRGB_BLOCK: + return VK_FORMAT_BC3_UNORM_BLOCK; + case VK_FORMAT_BC7_SRGB_BLOCK: + return VK_FORMAT_BC7_UNORM_BLOCK; + case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: + return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; + case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: + return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK; + case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: + return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK; + default: + assert(!vk_format_is_srgb(format)); + return format; + } +} + static inline VkFormat vk_format_stencil_only(VkFormat format) { return VK_FORMAT_S8_UINT; } -static inline uint +static inline unsigned vk_format_get_component_bits(VkFormat format, enum vk_format_colorspace colorspace, - uint component) + unsigned component) { const struct vk_format_description *desc = vk_format_description(format); enum vk_format_colorspace desc_colorspace; @@ -444,6 +504,35 @@ vk_format_get_component_bits(VkFormat format, return 0; } } -#ifdef __cplusplus -} // extern "C" { -#endif + +static inline VkFormat +vk_to_non_srgb_format(VkFormat format) +{ + switch(format) { + case VK_FORMAT_R8_SRGB : + return VK_FORMAT_R8_UNORM; + case VK_FORMAT_R8G8_SRGB: + return VK_FORMAT_R8G8_UNORM; + case VK_FORMAT_R8G8B8_SRGB: + return VK_FORMAT_R8G8B8_UNORM; + case VK_FORMAT_B8G8R8_SRGB: + return VK_FORMAT_B8G8R8_UNORM; + case VK_FORMAT_R8G8B8A8_SRGB : + return VK_FORMAT_R8G8B8A8_UNORM; + case VK_FORMAT_B8G8R8A8_SRGB: + return VK_FORMAT_B8G8R8A8_UNORM; + case VK_FORMAT_A8B8G8R8_SRGB_PACK32: + return VK_FORMAT_A8B8G8R8_UNORM_PACK32; + default: + return format; + } +} + +static inline unsigned +vk_format_get_nr_components(VkFormat format) +{ + const struct vk_format_description *desc = vk_format_description(format); + return desc->nr_channels; +} + +#endif /* VK_FORMAT_H */