diff --git a/src/imagination/vulkan/meson.build b/src/imagination/vulkan/meson.build index 500262d1fd0..5d4a7633f48 100644 --- a/src/imagination/vulkan/meson.build +++ b/src/imagination/vulkan/meson.build @@ -30,6 +30,7 @@ pvr_files = files( 'pvr_arch_csb.c', 'pvr_arch_descriptor_set.c', 'pvr_arch_device.c', + 'pvr_arch_formats.c', 'pvr_arch_image.c', 'pvr_arch_job_compute.c', 'pvr_arch_job_context.c', diff --git a/src/imagination/vulkan/pvr_arch_formats.c b/src/imagination/vulkan/pvr_arch_formats.c new file mode 100644 index 00000000000..3d1f86c65a0 --- /dev/null +++ b/src/imagination/vulkan/pvr_arch_formats.c @@ -0,0 +1,376 @@ +/* + * Copyright © 2022 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "hwdef/rogue_hw_utils.h" +#include "pvr_common.h" +#include "pvr_csb.h" +#include "pvr_device.h" +#include "pvr_entrypoints.h" +#include "pvr_formats.h" +#include "pvr_macros.h" +#include "pvr_physical_device.h" +#include "util/bitpack_helpers.h" +#include "util/compiler.h" +#include "util/format/format_utils.h" +#include "util/format/u_formats.h" +#include "util/half_float.h" +#include "util/log.h" +#include "util/macros.h" +#include "util/u_math.h" +#include "vk_enum_defines.h" +#include "vk_enum_to_str.h" +#include "vk_format.h" +#include "vk_log.h" +#include "vk_util.h" + +/* Convenience */ + +#define _V PVR_BIND_VERTEX_BUFFER +#define _T PVR_BIND_SAMPLER_VIEW +#define _R PVR_BIND_RENDER_TARGET +#define _Z PVR_BIND_DEPTH_STENCIL +#define _I PVR_BIND_STORAGE_IMAGE + +#define FLAGS_V___ (_V) +#define FLAGS__T__ (_T) +#define FLAGS__TR_ (_T | _R) +#define FLAGS__TRI (_T | _R | _I) +#define FLAGS_VT__ (_V | _T) +#define FLAGS_VTR_ (_V | _T | _R) +#define FLAGS_VTRI (_V | _T | _R | _I) +#define FLAGS__T_Z (_T | _Z) + +#define FORMAT(vk, tex_fmt, bind_) \ + [VK_FORMAT_##vk] = { \ + .tex_format = ROGUE_TEXSTATE_FORMAT_##tex_fmt, \ + .depth_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ + .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ + .bind = FLAGS_##bind_, \ + } + +#define FORMAT_COMPRESSED(vk, tex_fmt) \ + [VK_FORMAT_##vk] = { \ + .tex_format = ROGUE_TEXSTATE_FORMAT_COMPRESSED_##tex_fmt, \ + .depth_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ + .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ + .bind = FLAGS__T__, \ + } + +#define FORMAT_DEPTH_STENCIL(vk, combined_fmt, d_fmt, s_fmt) \ + [VK_FORMAT_##vk] = { \ + .tex_format = ROGUE_TEXSTATE_FORMAT_##combined_fmt, \ + .depth_tex_format = ROGUE_TEXSTATE_FORMAT_##d_fmt, \ + .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_##s_fmt, \ + .bind = FLAGS__T_Z, \ + } + +/* clang-format off */ +static const struct pvr_format pvr_format_table[] = { + FORMAT(B4G4R4A4_UNORM_PACK16, A4R4G4B4, VTR_), + FORMAT(R5G6B5_UNORM_PACK16, R5G6B5, VTR_), + FORMAT(A1R5G5B5_UNORM_PACK16, A1R5G5B5, VTR_), + FORMAT(R8_UNORM, U8, VTRI), + FORMAT(R8_SNORM, S8, VTRI), + FORMAT(R8_UINT, U8, VTRI), + FORMAT(R8_SINT, S8, VTRI), + FORMAT(R8G8_UNORM, U8U8, VTRI), + FORMAT(R8G8_SNORM, S8S8, VTRI), + FORMAT(R8G8_SSCALED, S8S8, V___), + FORMAT(R8G8_UINT, U8U8, VTRI), + FORMAT(R8G8_SINT, S8S8, VTRI), + FORMAT(R8G8B8_UINT, U8U8U8, VTR_), + FORMAT(R8G8B8A8_UNORM, U8U8U8U8, VTRI), + FORMAT(R8G8B8A8_SNORM, S8S8S8S8, VTRI), + FORMAT(R8G8B8A8_UINT, U8U8U8U8, VTRI), + FORMAT(R8G8B8A8_SINT, S8S8S8S8, VTRI), + FORMAT(R8G8B8A8_SRGB, U8U8U8U8, _TR_), + FORMAT(B8G8R8A8_UNORM, U8U8U8U8, VTR_), + FORMAT(B8G8R8A8_SRGB, U8U8U8U8, _TR_), + FORMAT(A8B8G8R8_UNORM_PACK32, U8U8U8U8, VTR_), + FORMAT(A8B8G8R8_SNORM_PACK32, S8S8S8S8, VTR_), + FORMAT(A8B8G8R8_UINT_PACK32, U8U8U8U8, VTR_), + FORMAT(A8B8G8R8_SINT_PACK32, S8S8S8S8, VTR_), + FORMAT(A8B8G8R8_SRGB_PACK32, U8U8U8U8, _TR_), + FORMAT(A2R10G10B10_USCALED_PACK32, INVALID, V___), + FORMAT(A2R10G10B10_SSCALED_PACK32, INVALID, V___), + FORMAT(A2B10G10R10_UNORM_PACK32, A2R10B10G10, VTRI), + FORMAT(A2B10G10R10_SNORM_PACK32, A2R10B10G10, V___), + FORMAT(A2B10G10R10_USCALED_PACK32, INVALID, V___), + FORMAT(A2B10G10R10_SSCALED_PACK32, INVALID, V___), + FORMAT(A2B10G10R10_UINT_PACK32, A2R10B10G10, VTRI), + FORMAT(R16_UNORM, U16, VTRI), + FORMAT(R16_SNORM, S16, VTRI), + FORMAT(R16_UINT, U16, VTRI), + FORMAT(R16_SINT, S16, VTRI), + FORMAT(R16_SFLOAT, F16, VTRI), + FORMAT(R16G16_UNORM, U16U16, VTRI), + FORMAT(R16G16_SNORM, S16S16, VTRI), + FORMAT(R16G16_UINT, U16U16, VTRI), + FORMAT(R16G16_SINT, S16S16, VTRI), + FORMAT(R16G16_SFLOAT, F16F16, VTRI), + FORMAT(R16G16B16_SNORM, S16S16S16, VTR_), + FORMAT(R16G16B16_UINT, U16U16U16, VTR_), + FORMAT(R16G16B16_SINT, S16S16S16, VTR_), + FORMAT(R16G16B16A16_UNORM, U16U16U16U16, VTRI), + FORMAT(R16G16B16A16_SNORM, S16S16S16S16, VTRI), + FORMAT(R16G16B16A16_UINT, U16U16U16U16, VTRI), + FORMAT(R16G16B16A16_SINT, S16S16S16S16, VTRI), + FORMAT(R16G16B16A16_SFLOAT, F16F16F16F16, VTRI), + FORMAT(R32_UINT, U32, VTRI), + FORMAT(R32_SINT, S32, VTRI), + FORMAT(R32_SFLOAT, F32, VTRI), + FORMAT(R32G32_UINT, U32U32, VTRI), + FORMAT(R32G32_SINT, S32S32, VTRI), + FORMAT(R32G32_SFLOAT, F32F32, VTRI), + FORMAT(R32G32B32_UINT, U32U32U32, VTR_), + FORMAT(R32G32B32_SINT, S32S32S32, VTR_), + FORMAT(R32G32B32_SFLOAT, F32F32F32, VTR_), + FORMAT(R32G32B32A32_UINT, U32U32U32U32, VTRI), + FORMAT(R32G32B32A32_SINT, S32S32S32S32, VTRI), + FORMAT(R32G32B32A32_SFLOAT, F32F32F32F32, VTRI), + FORMAT(B10G11R11_UFLOAT_PACK32, F10F11F11, _TRI), + FORMAT(E5B9G9R9_UFLOAT_PACK32, SE9995, VT__), + FORMAT_DEPTH_STENCIL(D16_UNORM, U16, U16, INVALID), + FORMAT_DEPTH_STENCIL(X8_D24_UNORM_PACK32, X8U24, X8U24, INVALID), + FORMAT_DEPTH_STENCIL(D32_SFLOAT, F32, F32, INVALID), + FORMAT_DEPTH_STENCIL(S8_UINT, U8, INVALID, U8), + FORMAT_DEPTH_STENCIL(D24_UNORM_S8_UINT, ST8U24, X8U24, U8X24), + FORMAT_DEPTH_STENCIL(D32_SFLOAT_S8_UINT, X24U8F32, X24X8F32, X24G8X32), + FORMAT_COMPRESSED(ETC2_R8G8B8_UNORM_BLOCK, ETC2_RGB), + FORMAT_COMPRESSED(ETC2_R8G8B8_SRGB_BLOCK, ETC2_RGB), + FORMAT_COMPRESSED(ETC2_R8G8B8A1_UNORM_BLOCK, ETC2_PUNCHTHROUGHA), + FORMAT_COMPRESSED(ETC2_R8G8B8A1_SRGB_BLOCK, ETC2_PUNCHTHROUGHA), + FORMAT_COMPRESSED(ETC2_R8G8B8A8_UNORM_BLOCK, ETC2A_RGBA), + FORMAT_COMPRESSED(ETC2_R8G8B8A8_SRGB_BLOCK, ETC2A_RGBA), + FORMAT_COMPRESSED(EAC_R11_UNORM_BLOCK, EAC_R11_UNSIGNED), + FORMAT_COMPRESSED(EAC_R11_SNORM_BLOCK, EAC_R11_SIGNED), + FORMAT_COMPRESSED(EAC_R11G11_UNORM_BLOCK, EAC_RG11_UNSIGNED), + FORMAT_COMPRESSED(EAC_R11G11_SNORM_BLOCK, EAC_RG11_SIGNED), +}; +/* clang-format on */ + +#undef FORMAT +#undef FORMAT_DEPTH_STENCIL +#undef FORMAT_COMPRESSED + +#define FORMAT(vk, pack_mode_, accum_format_) \ + [VK_FORMAT_##vk] = { \ + .packmode = ROGUE_PBESTATE_PACKMODE_##pack_mode_, \ + .accum_format = PVR_PBE_ACCUM_FORMAT_##accum_format_, \ + } + +#define FORMAT_DEPTH_STENCIL(vk, combined_fmt) \ + [VK_FORMAT_##vk] = { \ + .packmode = ROGUE_PBESTATE_PACKMODE_##combined_fmt, \ + .accum_format = PVR_PBE_ACCUM_FORMAT_INVALID, \ + } + +struct pvr_pbe_format { + enum ROGUE_PBESTATE_PACKMODE packmode; + enum pvr_pbe_accum_format accum_format; +}; + +static const struct pvr_pbe_format pvr_pbe_format_table[] = { + FORMAT(B4G4R4A4_UNORM_PACK16, A4R4G4B4, U8), + FORMAT(R5G6B5_UNORM_PACK16, R5G6B5, U8), + FORMAT(A1R5G5B5_UNORM_PACK16, A1R5G5B5, U8), + FORMAT(R8_UNORM, U8, U8), + FORMAT(R8_SNORM, S8, S8), + FORMAT(R8_UINT, U8, UINT8), + FORMAT(R8_SINT, S8, SINT8), + FORMAT(R8G8_UNORM, U8U8, U8), + FORMAT(R8G8_SNORM, S8S8, S8), + FORMAT(R8G8_SSCALED, S8S8, INVALID), + FORMAT(R8G8_UINT, U8U8, UINT8), + FORMAT(R8G8_SINT, S8S8, SINT8), + FORMAT(R8G8B8_UINT, U8U8U8, UINT8), + FORMAT(R8G8B8A8_UNORM, U8U8U8U8, U8), + FORMAT(R8G8B8A8_SNORM, S8S8S8S8, S8), + FORMAT(R8G8B8A8_UINT, U8U8U8U8, UINT8), + FORMAT(R8G8B8A8_SINT, S8S8S8S8, SINT8), + FORMAT(R8G8B8A8_SRGB, U8U8U8U8, F16), + FORMAT(B8G8R8A8_UNORM, U8U8U8U8, U8), + FORMAT(B8G8R8A8_SRGB, U8U8U8U8, F16), + FORMAT(A8B8G8R8_UNORM_PACK32, U8U8U8U8, U8), + FORMAT(A8B8G8R8_SNORM_PACK32, S8S8S8S8, S8), + FORMAT(A8B8G8R8_UINT_PACK32, U8U8U8U8, UINT8), + FORMAT(A8B8G8R8_SINT_PACK32, S8S8S8S8, SINT8), + FORMAT(A8B8G8R8_SRGB_PACK32, U8U8U8U8, F16), + FORMAT(A2R10G10B10_USCALED_PACK32, INVALID, INVALID), + FORMAT(A2R10G10B10_SSCALED_PACK32, INVALID, INVALID), + FORMAT(A2B10G10R10_UNORM_PACK32, A2R10B10G10, F16), + FORMAT(A2B10G10R10_SNORM_PACK32, A2R10B10G10, F16), + FORMAT(A2B10G10R10_USCALED_PACK32, INVALID, INVALID), + FORMAT(A2B10G10R10_SSCALED_PACK32, INVALID, INVALID), + FORMAT(A2B10G10R10_UINT_PACK32, U32, U1010102), + FORMAT(R16_UNORM, U16, U16), + FORMAT(R16_SNORM, S16, S16), + FORMAT(R16_UINT, U16, UINT16), + FORMAT(R16_SINT, S16, SINT16), + FORMAT(R16_SFLOAT, F16, F16), + FORMAT(R16G16_UNORM, U16U16, U16), + FORMAT(R16G16_SNORM, S16S16, S16), + FORMAT(R16G16_UINT, U16U16, UINT16), + FORMAT(R16G16_SINT, S16S16, SINT16), + FORMAT(R16G16_SFLOAT, F16F16, F16), + FORMAT(R16G16B16_SNORM, S16S16S16, S16), + FORMAT(R16G16B16_UINT, U16U16U16, UINT16), + FORMAT(R16G16B16_SINT, S16S16S16, SINT16), + FORMAT(R16G16B16A16_UNORM, U16U16U16U16, U16), + FORMAT(R16G16B16A16_SNORM, S16S16S16S16, S16), + FORMAT(R16G16B16A16_UINT, U16U16U16U16, UINT16), + FORMAT(R16G16B16A16_SINT, S16S16S16S16, SINT16), + FORMAT(R16G16B16A16_SFLOAT, F16F16F16F16, F16), + FORMAT(R32_UINT, U32, UINT32), + FORMAT(R32_SINT, S32, SINT32), + FORMAT(R32_SFLOAT, F32, F32), + FORMAT(R32G32_UINT, U32U32, UINT32), + FORMAT(R32G32_SINT, S32S32, SINT32), + FORMAT(R32G32_SFLOAT, F32F32, F32), + FORMAT(R32G32B32_UINT, U32U32U32, UINT32), + FORMAT(R32G32B32_SINT, S32S32S32, SINT32), + FORMAT(R32G32B32_SFLOAT, F32F32F32, F32), + FORMAT(R32G32B32A32_UINT, U32U32U32U32, UINT32), + FORMAT(R32G32B32A32_SINT, S32S32S32S32, SINT32), + FORMAT(R32G32B32A32_SFLOAT, F32F32F32F32, F32), + FORMAT(B10G11R11_UFLOAT_PACK32, F10F11F11, F16), + FORMAT(E5B9G9R9_UFLOAT_PACK32, SE9995, INVALID), + FORMAT_DEPTH_STENCIL(D16_UNORM, U16), + FORMAT_DEPTH_STENCIL(X8_D24_UNORM_PACK32, X8U24), + FORMAT_DEPTH_STENCIL(D32_SFLOAT, F32), + FORMAT_DEPTH_STENCIL(S8_UINT, U8), + FORMAT_DEPTH_STENCIL(D24_UNORM_S8_UINT, ST8U24), + FORMAT_DEPTH_STENCIL(D32_SFLOAT_S8_UINT, X24U8F32), +}; + +#undef FORMAT +#undef FORMAT_DEPTH_STENCIL + +const struct pvr_format *pvr_get_format_table(unsigned *num_formats) +{ + assert(num_formats != NULL); + *num_formats = ARRAY_SIZE(pvr_format_table); + return pvr_format_table; +} + +static inline const struct pvr_format *pvr_get_format(VkFormat vk_format) +{ + if (vk_format < ARRAY_SIZE(pvr_format_table) && + pvr_format_table[vk_format].bind != 0) { + return &pvr_format_table[vk_format]; + } + + mesa_logd("Format %s(%d) not supported\n", + vk_Format_to_str(vk_format), + vk_format); + + return NULL; +} + +static inline const struct pvr_pbe_format * +pvr_get_pbe_format(VkFormat vk_format) +{ + assert(vk_format < ARRAY_SIZE(pvr_pbe_format_table)); + return &pvr_pbe_format_table[vk_format]; +} + +uint32_t pvr_get_tex_format(VkFormat vk_format) +{ + const struct pvr_format *pvr_format = pvr_get_format(vk_format); + if (pvr_format) { + return pvr_format->tex_format; + } + + return ROGUE_TEXSTATE_FORMAT_INVALID; +} + +uint32_t pvr_get_tex_format_aspect(VkFormat vk_format, + VkImageAspectFlags aspect_mask) +{ + const struct pvr_format *pvr_format = pvr_get_format(vk_format); + if (pvr_format) { + if (aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT) + return pvr_format->depth_tex_format; + else if (aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT) + return pvr_format->stencil_tex_format; + + return pvr_format->tex_format; + } + + return ROGUE_TEXSTATE_FORMAT_INVALID; +} + +uint32_t pvr_get_pbe_packmode(VkFormat vk_format) +{ + if (vk_format_is_block_compressed(vk_format)) + return ROGUE_PBESTATE_PACKMODE_INVALID; + + return pvr_get_pbe_format(vk_format)->packmode; +} + +uint32_t pvr_get_pbe_accum_format(VkFormat vk_format) +{ + if (vk_format_is_block_compressed(vk_format)) + return PVR_PBE_ACCUM_FORMAT_INVALID; + + return pvr_get_pbe_format(vk_format)->accum_format; +} + +bool pvr_format_is_pbe_downscalable(const struct pvr_device_info *dev_info, + VkFormat vk_format) +{ + if (vk_format_is_int(vk_format)) { + /* PBE downscale behavior for integer formats does not match Vulkan + * spec. Vulkan requires a single sample to be chosen instead of + * taking the average sample color. + */ + return false; + } + + switch (pvr_get_pbe_packmode(vk_format)) { + default: + return true; + case ROGUE_PBESTATE_PACKMODE_F16: + return PVR_HAS_FEATURE(dev_info, pbe_filterable_f16); + case ROGUE_PBESTATE_PACKMODE_U16U16U16U16: + case ROGUE_PBESTATE_PACKMODE_S16S16S16S16: + case ROGUE_PBESTATE_PACKMODE_U32U32U32U32: + case ROGUE_PBESTATE_PACKMODE_S32S32S32S32: + case ROGUE_PBESTATE_PACKMODE_F32F32F32F32: + case ROGUE_PBESTATE_PACKMODE_U16U16U16: + case ROGUE_PBESTATE_PACKMODE_S16S16S16: + case ROGUE_PBESTATE_PACKMODE_U32U32U32: + case ROGUE_PBESTATE_PACKMODE_S32S32S32: + case ROGUE_PBESTATE_PACKMODE_F32F32F32: + case ROGUE_PBESTATE_PACKMODE_U16U16: + case ROGUE_PBESTATE_PACKMODE_S16S16: + case ROGUE_PBESTATE_PACKMODE_U32U32: + case ROGUE_PBESTATE_PACKMODE_S32S32: + case ROGUE_PBESTATE_PACKMODE_F32F32: + case ROGUE_PBESTATE_PACKMODE_U24ST8: + case ROGUE_PBESTATE_PACKMODE_ST8U24: + case ROGUE_PBESTATE_PACKMODE_U16: + case ROGUE_PBESTATE_PACKMODE_S16: + case ROGUE_PBESTATE_PACKMODE_U32: + case ROGUE_PBESTATE_PACKMODE_S32: + case ROGUE_PBESTATE_PACKMODE_F32: + case ROGUE_PBESTATE_PACKMODE_X24U8F32: + case ROGUE_PBESTATE_PACKMODE_X24X8F32: + case ROGUE_PBESTATE_PACKMODE_X24G8X32: + case ROGUE_PBESTATE_PACKMODE_X8U24: + case ROGUE_PBESTATE_PACKMODE_U8X24: + case ROGUE_PBESTATE_PACKMODE_PBYTE: + case ROGUE_PBESTATE_PACKMODE_PWORD: + case ROGUE_PBESTATE_PACKMODE_INVALID: + return false; + } +} diff --git a/src/imagination/vulkan/pvr_formats.c b/src/imagination/vulkan/pvr_formats.c index 3edc258fdd0..eca3f233158 100644 --- a/src/imagination/vulkan/pvr_formats.c +++ b/src/imagination/vulkan/pvr_formats.c @@ -28,12 +28,16 @@ #include #include "hwdef/rogue_hw_utils.h" + #include "pvr_common.h" #include "pvr_csb.h" #include "pvr_device.h" #include "pvr_entrypoints.h" +#include "pvr_limits.h" #include "pvr_formats.h" +#include "pvr_macros.h" #include "pvr_physical_device.h" + #include "util/bitpack_helpers.h" #include "util/compiler.h" #include "util/format/format_utils.h" @@ -48,305 +52,6 @@ #include "vk_log.h" #include "vk_util.h" -/* Convenience */ - -#define _V PVR_BIND_VERTEX_BUFFER -#define _T PVR_BIND_SAMPLER_VIEW -#define _R PVR_BIND_RENDER_TARGET -#define _Z PVR_BIND_DEPTH_STENCIL -#define _I PVR_BIND_STORAGE_IMAGE - -#define FLAGS_V___ (_V) -#define FLAGS__T__ (_T) -#define FLAGS__TR_ (_T | _R) -#define FLAGS__TRI (_T | _R | _I) -#define FLAGS_VT__ (_V | _T) -#define FLAGS_VTR_ (_V | _T | _R) -#define FLAGS_VTRI (_V | _T | _R | _I) -#define FLAGS__T_Z (_T | _Z) - -#define FORMAT(vk, tex_fmt, bind_) \ - [VK_FORMAT_##vk] = { \ - .tex_format = ROGUE_TEXSTATE_FORMAT_##tex_fmt, \ - .depth_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ - .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ - .bind = FLAGS_##bind_, \ - } - -#define FORMAT_COMPRESSED(vk, tex_fmt) \ - [VK_FORMAT_##vk] = { \ - .tex_format = ROGUE_TEXSTATE_FORMAT_COMPRESSED_##tex_fmt, \ - .depth_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ - .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ - .bind = FLAGS__T__, \ - } - -#define FORMAT_DEPTH_STENCIL(vk, combined_fmt, d_fmt, s_fmt) \ - [VK_FORMAT_##vk] = { \ - .tex_format = ROGUE_TEXSTATE_FORMAT_##combined_fmt, \ - .depth_tex_format = ROGUE_TEXSTATE_FORMAT_##d_fmt, \ - .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_##s_fmt, \ - .bind = FLAGS__T_Z, \ - } - -/* clang-format off */ -static const struct pvr_format pvr_format_table[] = { - FORMAT(B4G4R4A4_UNORM_PACK16, A4R4G4B4, VTR_), - FORMAT(R5G6B5_UNORM_PACK16, R5G6B5, VTR_), - FORMAT(A1R5G5B5_UNORM_PACK16, A1R5G5B5, VTR_), - FORMAT(R8_UNORM, U8, VTRI), - FORMAT(R8_SNORM, S8, VTRI), - FORMAT(R8_UINT, U8, VTRI), - FORMAT(R8_SINT, S8, VTRI), - FORMAT(R8G8_UNORM, U8U8, VTRI), - FORMAT(R8G8_SNORM, S8S8, VTRI), - FORMAT(R8G8_SSCALED, S8S8, V___), - FORMAT(R8G8_UINT, U8U8, VTRI), - FORMAT(R8G8_SINT, S8S8, VTRI), - FORMAT(R8G8B8_UINT, U8U8U8, VTR_), - FORMAT(R8G8B8A8_UNORM, U8U8U8U8, VTRI), - FORMAT(R8G8B8A8_SNORM, S8S8S8S8, VTRI), - FORMAT(R8G8B8A8_UINT, U8U8U8U8, VTRI), - FORMAT(R8G8B8A8_SINT, S8S8S8S8, VTRI), - FORMAT(R8G8B8A8_SRGB, U8U8U8U8, _TR_), - FORMAT(B8G8R8A8_UNORM, U8U8U8U8, VTR_), - FORMAT(B8G8R8A8_SRGB, U8U8U8U8, _TR_), - FORMAT(A8B8G8R8_UNORM_PACK32, U8U8U8U8, VTR_), - FORMAT(A8B8G8R8_SNORM_PACK32, S8S8S8S8, VTR_), - FORMAT(A8B8G8R8_UINT_PACK32, U8U8U8U8, VTR_), - FORMAT(A8B8G8R8_SINT_PACK32, S8S8S8S8, VTR_), - FORMAT(A8B8G8R8_SRGB_PACK32, U8U8U8U8, _TR_), - FORMAT(A2R10G10B10_USCALED_PACK32, INVALID, V___), - FORMAT(A2R10G10B10_SSCALED_PACK32, INVALID, V___), - FORMAT(A2B10G10R10_UNORM_PACK32, A2R10B10G10, VTRI), - FORMAT(A2B10G10R10_SNORM_PACK32, A2R10B10G10, V___), - FORMAT(A2B10G10R10_USCALED_PACK32, INVALID, V___), - FORMAT(A2B10G10R10_SSCALED_PACK32, INVALID, V___), - FORMAT(A2B10G10R10_UINT_PACK32, A2R10B10G10, VTRI), - FORMAT(R16_UNORM, U16, VTRI), - FORMAT(R16_SNORM, S16, VTRI), - FORMAT(R16_UINT, U16, VTRI), - FORMAT(R16_SINT, S16, VTRI), - FORMAT(R16_SFLOAT, F16, VTRI), - FORMAT(R16G16_UNORM, U16U16, VTRI), - FORMAT(R16G16_SNORM, S16S16, VTRI), - FORMAT(R16G16_UINT, U16U16, VTRI), - FORMAT(R16G16_SINT, S16S16, VTRI), - FORMAT(R16G16_SFLOAT, F16F16, VTRI), - FORMAT(R16G16B16_SNORM, S16S16S16, VTR_), - FORMAT(R16G16B16_UINT, U16U16U16, VTR_), - FORMAT(R16G16B16_SINT, S16S16S16, VTR_), - FORMAT(R16G16B16A16_UNORM, U16U16U16U16, VTRI), - FORMAT(R16G16B16A16_SNORM, S16S16S16S16, VTRI), - FORMAT(R16G16B16A16_UINT, U16U16U16U16, VTRI), - FORMAT(R16G16B16A16_SINT, S16S16S16S16, VTRI), - FORMAT(R16G16B16A16_SFLOAT, F16F16F16F16, VTRI), - FORMAT(R32_UINT, U32, VTRI), - FORMAT(R32_SINT, S32, VTRI), - FORMAT(R32_SFLOAT, F32, VTRI), - FORMAT(R32G32_UINT, U32U32, VTRI), - FORMAT(R32G32_SINT, S32S32, VTRI), - FORMAT(R32G32_SFLOAT, F32F32, VTRI), - FORMAT(R32G32B32_UINT, U32U32U32, VTR_), - FORMAT(R32G32B32_SINT, S32S32S32, VTR_), - FORMAT(R32G32B32_SFLOAT, F32F32F32, VTR_), - FORMAT(R32G32B32A32_UINT, U32U32U32U32, VTRI), - FORMAT(R32G32B32A32_SINT, S32S32S32S32, VTRI), - FORMAT(R32G32B32A32_SFLOAT, F32F32F32F32, VTRI), - FORMAT(B10G11R11_UFLOAT_PACK32, F10F11F11, _TRI), - FORMAT(E5B9G9R9_UFLOAT_PACK32, SE9995, VT__), - FORMAT_DEPTH_STENCIL(D16_UNORM, U16, U16, INVALID), - FORMAT_DEPTH_STENCIL(X8_D24_UNORM_PACK32, X8U24, X8U24, INVALID), - FORMAT_DEPTH_STENCIL(D32_SFLOAT, F32, F32, INVALID), - FORMAT_DEPTH_STENCIL(S8_UINT, U8, INVALID, U8), - FORMAT_DEPTH_STENCIL(D24_UNORM_S8_UINT, ST8U24, X8U24, U8X24), - FORMAT_DEPTH_STENCIL(D32_SFLOAT_S8_UINT, X24U8F32, X24X8F32, X24G8X32), - FORMAT_COMPRESSED(ETC2_R8G8B8_UNORM_BLOCK, ETC2_RGB), - FORMAT_COMPRESSED(ETC2_R8G8B8_SRGB_BLOCK, ETC2_RGB), - FORMAT_COMPRESSED(ETC2_R8G8B8A1_UNORM_BLOCK, ETC2_PUNCHTHROUGHA), - FORMAT_COMPRESSED(ETC2_R8G8B8A1_SRGB_BLOCK, ETC2_PUNCHTHROUGHA), - FORMAT_COMPRESSED(ETC2_R8G8B8A8_UNORM_BLOCK, ETC2A_RGBA), - FORMAT_COMPRESSED(ETC2_R8G8B8A8_SRGB_BLOCK, ETC2A_RGBA), - FORMAT_COMPRESSED(EAC_R11_UNORM_BLOCK, EAC_R11_UNSIGNED), - FORMAT_COMPRESSED(EAC_R11_SNORM_BLOCK, EAC_R11_SIGNED), - FORMAT_COMPRESSED(EAC_R11G11_UNORM_BLOCK, EAC_RG11_UNSIGNED), - FORMAT_COMPRESSED(EAC_R11G11_SNORM_BLOCK, EAC_RG11_SIGNED), -}; -/* clang-format on */ - -#undef FORMAT -#undef FORMAT_DEPTH_STENCIL -#undef FORMAT_COMPRESSED - -#define FORMAT(vk, pack_mode_, accum_format_) \ - [VK_FORMAT_##vk] = { \ - .packmode = ROGUE_PBESTATE_PACKMODE_##pack_mode_, \ - .accum_format = PVR_PBE_ACCUM_FORMAT_##accum_format_, \ - } - -#define FORMAT_DEPTH_STENCIL(vk, combined_fmt) \ - [VK_FORMAT_##vk] = { \ - .packmode = ROGUE_PBESTATE_PACKMODE_##combined_fmt, \ - .accum_format = PVR_PBE_ACCUM_FORMAT_INVALID, \ - } - -struct pvr_pbe_format { - enum ROGUE_PBESTATE_PACKMODE packmode; - enum pvr_pbe_accum_format accum_format; -}; - -static const struct pvr_pbe_format pvr_pbe_format_table[] = { - FORMAT(B4G4R4A4_UNORM_PACK16, A4R4G4B4, U8), - FORMAT(R5G6B5_UNORM_PACK16, R5G6B5, U8), - FORMAT(A1R5G5B5_UNORM_PACK16, A1R5G5B5, U8), - FORMAT(R8_UNORM, U8, U8), - FORMAT(R8_SNORM, S8, S8), - FORMAT(R8_UINT, U8, UINT8), - FORMAT(R8_SINT, S8, SINT8), - FORMAT(R8G8_UNORM, U8U8, U8), - FORMAT(R8G8_SNORM, S8S8, S8), - FORMAT(R8G8_SSCALED, S8S8, INVALID), - FORMAT(R8G8_UINT, U8U8, UINT8), - FORMAT(R8G8_SINT, S8S8, SINT8), - FORMAT(R8G8B8_UINT, U8U8U8, UINT8), - FORMAT(R8G8B8A8_UNORM, U8U8U8U8, U8), - FORMAT(R8G8B8A8_SNORM, S8S8S8S8, S8), - FORMAT(R8G8B8A8_UINT, U8U8U8U8, UINT8), - FORMAT(R8G8B8A8_SINT, S8S8S8S8, SINT8), - FORMAT(R8G8B8A8_SRGB, U8U8U8U8, F16), - FORMAT(B8G8R8A8_UNORM, U8U8U8U8, U8), - FORMAT(B8G8R8A8_SRGB, U8U8U8U8, F16), - FORMAT(A8B8G8R8_UNORM_PACK32, U8U8U8U8, U8), - FORMAT(A8B8G8R8_SNORM_PACK32, S8S8S8S8, S8), - FORMAT(A8B8G8R8_UINT_PACK32, U8U8U8U8, UINT8), - FORMAT(A8B8G8R8_SINT_PACK32, S8S8S8S8, SINT8), - FORMAT(A8B8G8R8_SRGB_PACK32, U8U8U8U8, F16), - FORMAT(A2R10G10B10_USCALED_PACK32, INVALID, INVALID), - FORMAT(A2R10G10B10_SSCALED_PACK32, INVALID, INVALID), - FORMAT(A2B10G10R10_UNORM_PACK32, A2R10B10G10, F16), - FORMAT(A2B10G10R10_SNORM_PACK32, A2R10B10G10, F16), - FORMAT(A2B10G10R10_USCALED_PACK32, INVALID, INVALID), - FORMAT(A2B10G10R10_SSCALED_PACK32, INVALID, INVALID), - FORMAT(A2B10G10R10_UINT_PACK32, U32, U1010102), - FORMAT(R16_UNORM, U16, U16), - FORMAT(R16_SNORM, S16, S16), - FORMAT(R16_UINT, U16, UINT16), - FORMAT(R16_SINT, S16, SINT16), - FORMAT(R16_SFLOAT, F16, F16), - FORMAT(R16G16_UNORM, U16U16, U16), - FORMAT(R16G16_SNORM, S16S16, S16), - FORMAT(R16G16_UINT, U16U16, UINT16), - FORMAT(R16G16_SINT, S16S16, SINT16), - FORMAT(R16G16_SFLOAT, F16F16, F16), - FORMAT(R16G16B16_SNORM, S16S16S16, S16), - FORMAT(R16G16B16_UINT, U16U16U16, UINT16), - FORMAT(R16G16B16_SINT, S16S16S16, SINT16), - FORMAT(R16G16B16A16_UNORM, U16U16U16U16, U16), - FORMAT(R16G16B16A16_SNORM, S16S16S16S16, S16), - FORMAT(R16G16B16A16_UINT, U16U16U16U16, UINT16), - FORMAT(R16G16B16A16_SINT, S16S16S16S16, SINT16), - FORMAT(R16G16B16A16_SFLOAT, F16F16F16F16, F16), - FORMAT(R32_UINT, U32, UINT32), - FORMAT(R32_SINT, S32, SINT32), - FORMAT(R32_SFLOAT, F32, F32), - FORMAT(R32G32_UINT, U32U32, UINT32), - FORMAT(R32G32_SINT, S32S32, SINT32), - FORMAT(R32G32_SFLOAT, F32F32, F32), - FORMAT(R32G32B32_UINT, U32U32U32, UINT32), - FORMAT(R32G32B32_SINT, S32S32S32, SINT32), - FORMAT(R32G32B32_SFLOAT, F32F32F32, F32), - FORMAT(R32G32B32A32_UINT, U32U32U32U32, UINT32), - FORMAT(R32G32B32A32_SINT, S32S32S32S32, SINT32), - FORMAT(R32G32B32A32_SFLOAT, F32F32F32F32, F32), - FORMAT(B10G11R11_UFLOAT_PACK32, F10F11F11, F16), - FORMAT(E5B9G9R9_UFLOAT_PACK32, SE9995, INVALID), - FORMAT_DEPTH_STENCIL(D16_UNORM, U16), - FORMAT_DEPTH_STENCIL(X8_D24_UNORM_PACK32, X8U24), - FORMAT_DEPTH_STENCIL(D32_SFLOAT, F32), - FORMAT_DEPTH_STENCIL(S8_UINT, U8), - FORMAT_DEPTH_STENCIL(D24_UNORM_S8_UINT, ST8U24), - FORMAT_DEPTH_STENCIL(D32_SFLOAT_S8_UINT, X24U8F32), -}; - -#undef FORMAT -#undef FORMAT_DEPTH_STENCIL - -const struct pvr_format *pvr_get_format_table(unsigned *num_formats) -{ - assert(num_formats != NULL); - *num_formats = ARRAY_SIZE(pvr_format_table); - return pvr_format_table; -} - -static inline const struct pvr_format *pvr_get_format(VkFormat vk_format) -{ - if (vk_format < ARRAY_SIZE(pvr_format_table) && - pvr_format_table[vk_format].bind != 0) { - return &pvr_format_table[vk_format]; - } - - mesa_logd("Format %s(%d) not supported\n", - vk_Format_to_str(vk_format), - vk_format); - - return NULL; -} - -static inline const struct pvr_format * -pvr_get_pdevice_format(struct pvr_physical_device *pdevice, VkFormat vk_format) -{ - if (vk_format >= pdevice->num_formats || - pvr_format_table[vk_format].bind == 0) - return NULL; - - return &pdevice->formats[vk_format]; -} - -static inline const struct pvr_pbe_format * -pvr_get_pbe_format(VkFormat vk_format) -{ - assert(vk_format < ARRAY_SIZE(pvr_pbe_format_table)); - return &pvr_pbe_format_table[vk_format]; -} - -uint32_t pvr_get_tex_format(VkFormat vk_format) -{ - const struct pvr_format *pvr_format = pvr_get_format(vk_format); - if (pvr_format) { - return pvr_format->tex_format; - } - - return ROGUE_TEXSTATE_FORMAT_INVALID; -} - -uint32_t pvr_get_tex_format_aspect(VkFormat vk_format, - VkImageAspectFlags aspect_mask) -{ - const struct pvr_format *pvr_format = pvr_get_format(vk_format); - if (pvr_format) { - if (aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT) - return pvr_format->depth_tex_format; - else if (aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT) - return pvr_format->stencil_tex_format; - - return pvr_format->tex_format; - } - - return ROGUE_TEXSTATE_FORMAT_INVALID; -} - -uint32_t pvr_get_pbe_packmode(VkFormat vk_format) -{ - assert(!vk_format_is_block_compressed(vk_format)); - return pvr_get_pbe_format(vk_format)->packmode; -} - -uint32_t pvr_get_pbe_accum_format(VkFormat vk_format) -{ - assert(!vk_format_is_block_compressed(vk_format)); - return pvr_get_pbe_format(vk_format)->accum_format; -} - uint32_t pvr_get_pbe_accum_format_size_in_bytes(VkFormat vk_format) { enum pvr_pbe_accum_format pbe_accum_format; @@ -520,6 +225,21 @@ void pvr_get_hw_clear_color( #undef f32_to_snorm16 #undef f32_to_f16 +static inline const struct pvr_format * +pvr_get_format(struct pvr_physical_device *pdevice, VkFormat vk_format) +{ + if (vk_format < pdevice->num_formats && + pdevice->formats[vk_format].bind != 0) { + return &pdevice->formats[vk_format]; + } + + mesa_logd("Format %s(%d) not supported\n", + vk_Format_to_str(vk_format), + vk_format); + + return NULL; +} + static VkFormatFeatureFlags2 pvr_get_image_format_features2(struct pvr_physical_device *pdevice, VkFormat vk_format, @@ -527,8 +247,7 @@ pvr_get_image_format_features2(struct pvr_physical_device *pdevice, { VkFormatFeatureFlags2 flags = 0; - const struct pvr_format *pvr_format = - pvr_get_pdevice_format(pdevice, vk_format); + const struct pvr_format *pvr_format = pvr_get_format(pdevice, vk_format); if (!pvr_format) return 0; @@ -638,8 +357,7 @@ pvr_get_buffer_format_features2(struct pvr_physical_device *pdevice, const struct util_format_description *desc; VkFormatFeatureFlags2 flags = 0; - const struct pvr_format *pvr_format = - pvr_get_pdevice_format(pdevice, vk_format); + const struct pvr_format *pvr_format = pvr_get_format(pdevice, vk_format); if (!pvr_format) return 0; @@ -768,7 +486,7 @@ pvr_get_image_format_properties(struct pvr_physical_device *pdevice, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - const struct pvr_format *pvr_format = pvr_get_format(info->format); + const struct pvr_format *pvr_format = pvr_get_format(pdevice, info->format); VkFormatFeatureFlags2 tiling_features2; VkImageUsageFlags usage = info->usage | (stencil_usage_info ? stencil_usage_info->stencilUsage : 0); @@ -950,9 +668,7 @@ VkResult pvr_GetPhysicalDeviceImageFormatProperties2( const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL; VK_FROM_HANDLE(pvr_physical_device, pdevice, physicalDevice); VkExternalImageFormatProperties *external_props = NULL; - VkResult result; - - result = pvr_get_image_format_properties( + VkResult result = pvr_get_image_format_properties( pdevice, pImageFormatInfo, &pImageFormatProperties->imageFormatProperties); @@ -1091,56 +807,6 @@ unsupported: }; } -bool pvr_format_is_pbe_downscalable(const struct pvr_device_info *dev_info, - VkFormat vk_format) -{ - if (vk_format_is_int(vk_format)) { - /* PBE downscale behavior for integer formats does not match Vulkan - * spec. Vulkan requires a single sample to be chosen instead of - * taking the average sample color. - */ - return false; - } - - switch (pvr_get_pbe_packmode(vk_format)) { - default: - return true; - case ROGUE_PBESTATE_PACKMODE_F16: - return PVR_HAS_FEATURE(dev_info, pbe_filterable_f16); - case ROGUE_PBESTATE_PACKMODE_U16U16U16U16: - case ROGUE_PBESTATE_PACKMODE_S16S16S16S16: - case ROGUE_PBESTATE_PACKMODE_U32U32U32U32: - case ROGUE_PBESTATE_PACKMODE_S32S32S32S32: - case ROGUE_PBESTATE_PACKMODE_F32F32F32F32: - case ROGUE_PBESTATE_PACKMODE_U16U16U16: - case ROGUE_PBESTATE_PACKMODE_S16S16S16: - case ROGUE_PBESTATE_PACKMODE_U32U32U32: - case ROGUE_PBESTATE_PACKMODE_S32S32S32: - case ROGUE_PBESTATE_PACKMODE_F32F32F32: - case ROGUE_PBESTATE_PACKMODE_U16U16: - case ROGUE_PBESTATE_PACKMODE_S16S16: - case ROGUE_PBESTATE_PACKMODE_U32U32: - case ROGUE_PBESTATE_PACKMODE_S32S32: - case ROGUE_PBESTATE_PACKMODE_F32F32: - case ROGUE_PBESTATE_PACKMODE_U24ST8: - case ROGUE_PBESTATE_PACKMODE_ST8U24: - case ROGUE_PBESTATE_PACKMODE_U16: - case ROGUE_PBESTATE_PACKMODE_S16: - case ROGUE_PBESTATE_PACKMODE_U32: - case ROGUE_PBESTATE_PACKMODE_S32: - case ROGUE_PBESTATE_PACKMODE_F32: - case ROGUE_PBESTATE_PACKMODE_X24U8F32: - case ROGUE_PBESTATE_PACKMODE_X24X8F32: - case ROGUE_PBESTATE_PACKMODE_X24G8X32: - case ROGUE_PBESTATE_PACKMODE_X8U24: - case ROGUE_PBESTATE_PACKMODE_U8X24: - case ROGUE_PBESTATE_PACKMODE_PBYTE: - case ROGUE_PBESTATE_PACKMODE_PWORD: - case ROGUE_PBESTATE_PACKMODE_INVALID: - return false; - } -} - uint32_t pvr_pbe_pixel_num_loads(enum pvr_transfer_pbe_pixel_src pbe_format) { switch (pbe_format) {