Path: blob/21.2-virgl/src/gallium/drivers/v3d/v3dx_format_table.c
4570 views
/*1* Copyright © 2014-2018 Broadcom2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#include "util/format/u_format.h"2425#include "v3d_context.h"26#include "broadcom/cle/v3dx_pack.h"27#include "broadcom/common/v3d_macros.h"28#include "v3d_format_table.h"2930#define SWIZ(x,y,z,w) { \31PIPE_SWIZZLE_##x, \32PIPE_SWIZZLE_##y, \33PIPE_SWIZZLE_##z, \34PIPE_SWIZZLE_##w \35}3637#define FORMAT(pipe, rt, tex, swiz, return_size, return_channels) \38[PIPE_FORMAT_##pipe] = { \39true, \40V3D_OUTPUT_IMAGE_FORMAT_##rt, \41TEXTURE_DATA_FORMAT_##tex, \42swiz, \43return_size, \44return_channels, \45}4647#define SWIZ_X001 SWIZ(X, 0, 0, 1)48#define SWIZ_XY01 SWIZ(X, Y, 0, 1)49#define SWIZ_XYZ1 SWIZ(X, Y, Z, 1)50#define SWIZ_XYZW SWIZ(X, Y, Z, W)51#define SWIZ_YZWX SWIZ(Y, Z, W, X)52#define SWIZ_YZW1 SWIZ(Y, Z, W, 1)53#define SWIZ_ZYXW SWIZ(Z, Y, X, W)54#define SWIZ_ZYX1 SWIZ(Z, Y, X, 1)55#define SWIZ_XXXY SWIZ(X, X, X, Y)56#define SWIZ_XXX1 SWIZ(X, X, X, 1)57#define SWIZ_XXXX SWIZ(X, X, X, X)58#define SWIZ_000X SWIZ(0, 0, 0, X)5960static const struct v3d_format format_table[] = {61FORMAT(B8G8R8A8_UNORM, RGBA8, RGBA8, SWIZ_ZYXW, 16, 0),62FORMAT(B8G8R8X8_UNORM, RGBA8, RGBA8, SWIZ_ZYX1, 16, 0),63FORMAT(B8G8R8A8_SRGB, SRGB8_ALPHA8, RGBA8, SWIZ_ZYXW, 16, 0),64FORMAT(B8G8R8X8_SRGB, SRGB8_ALPHA8, RGBA8, SWIZ_ZYX1, 16, 0),65FORMAT(R8G8B8A8_UNORM, RGBA8, RGBA8, SWIZ_XYZW, 16, 0),66FORMAT(R8G8B8X8_UNORM, RGBA8, RGBA8, SWIZ_XYZ1, 16, 0),67FORMAT(R8G8B8A8_SRGB, SRGB8_ALPHA8, RGBA8, SWIZ_XYZW, 16, 0),68FORMAT(R8G8B8X8_SRGB, SRGB8_ALPHA8, RGBA8, SWIZ_XYZ1, 16, 0),69FORMAT(R8G8B8A8_SNORM, NO, RGBA8_SNORM, SWIZ_XYZW, 16, 0),70FORMAT(R8G8B8X8_SNORM, NO, RGBA8_SNORM, SWIZ_XYZ1, 16, 0),71FORMAT(R10G10B10A2_UNORM, RGB10_A2, RGB10_A2, SWIZ_XYZW, 16, 0),72FORMAT(R10G10B10A2_UINT, RGB10_A2UI, RGB10_A2UI, SWIZ_XYZW, 16, 0),7374FORMAT(A4B4G4R4_UNORM, ABGR4444, RGBA4, SWIZ_XYZW, 16, 0),7576FORMAT(A1B5G5R5_UNORM, ABGR1555, RGB5_A1, SWIZ_XYZW, 16, 0),77FORMAT(X1B5G5R5_UNORM, ABGR1555, RGB5_A1, SWIZ_XYZ1, 16, 0),78FORMAT(B5G6R5_UNORM, BGR565, RGB565, SWIZ_XYZ1, 16, 0),7980FORMAT(R8_UNORM, R8, R8, SWIZ_X001, 16, 0),81FORMAT(R8_SNORM, NO, R8_SNORM, SWIZ_X001, 16, 0),82FORMAT(R8G8_UNORM, RG8, RG8, SWIZ_XY01, 16, 0),83FORMAT(R8G8_SNORM, NO, RG8_SNORM, SWIZ_XY01, 16, 0),8485FORMAT(R16_UNORM, NO, R16, SWIZ_X001, 32, 1),86FORMAT(R16_SNORM, NO, R16_SNORM, SWIZ_X001, 32, 1),87FORMAT(R16_FLOAT, R16F, R16F, SWIZ_X001, 16, 0),88FORMAT(R32_FLOAT, R32F, R32F, SWIZ_X001, 32, 1),8990FORMAT(R16G16_UNORM, NO, RG16, SWIZ_XY01, 32, 2),91FORMAT(R16G16_SNORM, NO, RG16_SNORM, SWIZ_XY01, 32, 2),92FORMAT(R16G16_FLOAT, RG16F, RG16F, SWIZ_XY01, 16, 0),93FORMAT(R32G32_FLOAT, RG32F, RG32F, SWIZ_XY01, 32, 2),9495FORMAT(R16G16B16A16_UNORM, NO, RGBA16, SWIZ_XYZW, 32, 4),96FORMAT(R16G16B16A16_SNORM, NO, RGBA16_SNORM, SWIZ_XYZW, 32, 4),97FORMAT(R16G16B16A16_FLOAT, RGBA16F, RGBA16F, SWIZ_XYZW, 16, 0),98FORMAT(R32G32B32A32_FLOAT, RGBA32F, RGBA32F, SWIZ_XYZW, 32, 4),99100/* If we don't have L/A/LA16, mesa/st will fall back to RGBA16. */101FORMAT(L16_UNORM, NO, R16, SWIZ_XXX1, 32, 1),102FORMAT(L16_SNORM, NO, R16_SNORM, SWIZ_XXX1, 32, 1),103FORMAT(I16_UNORM, NO, R16, SWIZ_XXXX, 32, 1),104FORMAT(I16_SNORM, NO, R16_SNORM, SWIZ_XXXX, 32, 1),105FORMAT(A16_UNORM, NO, R16, SWIZ_000X, 32, 1),106FORMAT(A16_SNORM, NO, R16_SNORM, SWIZ_000X, 32, 1),107FORMAT(L16A16_UNORM, NO, RG16, SWIZ_XXXY, 32, 2),108FORMAT(L16A16_SNORM, NO, RG16_SNORM, SWIZ_XXXY, 32, 2),109110FORMAT(A8_UNORM, NO, R8, SWIZ_000X, 16, 0),111FORMAT(L8_UNORM, NO, R8, SWIZ_XXX1, 16, 0),112FORMAT(I8_UNORM, NO, R8, SWIZ_XXXX, 16, 0),113FORMAT(L8A8_UNORM, NO, RG8, SWIZ_XXXY, 16, 0),114115FORMAT(R8_SINT, R8I, R8I, SWIZ_X001, 16, 0),116FORMAT(R8_UINT, R8UI, R8UI, SWIZ_X001, 16, 0),117FORMAT(R8G8_SINT, RG8I, RG8I, SWIZ_XY01, 16, 0),118FORMAT(R8G8_UINT, RG8UI, RG8UI, SWIZ_XY01, 16, 0),119FORMAT(R8G8B8A8_SINT, RGBA8I, RGBA8I, SWIZ_XYZW, 16, 0),120FORMAT(R8G8B8A8_UINT, RGBA8UI, RGBA8UI, SWIZ_XYZW, 16, 0),121122FORMAT(R16_SINT, R16I, R16I, SWIZ_X001, 16, 0),123FORMAT(R16_UINT, R16UI, R16UI, SWIZ_X001, 16, 0),124FORMAT(R16G16_SINT, RG16I, RG16I, SWIZ_XY01, 16, 0),125FORMAT(R16G16_UINT, RG16UI, RG16UI, SWIZ_XY01, 16, 0),126FORMAT(R16G16B16A16_SINT, RGBA16I, RGBA16I, SWIZ_XYZW, 16, 0),127FORMAT(R16G16B16A16_UINT, RGBA16UI, RGBA16UI, SWIZ_XYZW, 16, 0),128129FORMAT(R32_SINT, R32I, R32I, SWIZ_X001, 32, 1),130FORMAT(R32_UINT, R32UI, R32UI, SWIZ_X001, 32, 1),131FORMAT(R32G32_SINT, RG32I, RG32I, SWIZ_XY01, 32, 2),132FORMAT(R32G32_UINT, RG32UI, RG32UI, SWIZ_XY01, 32, 2),133FORMAT(R32G32B32A32_SINT, RGBA32I, RGBA32I, SWIZ_XYZW, 32, 4),134FORMAT(R32G32B32A32_UINT, RGBA32UI, RGBA32UI, SWIZ_XYZW, 32, 4),135136FORMAT(A8_SINT, R8I, R8I, SWIZ_000X, 16, 0),137FORMAT(A8_UINT, R8UI, R8UI, SWIZ_000X, 16, 0),138FORMAT(A16_SINT, R16I, R16I, SWIZ_000X, 16, 0),139FORMAT(A16_UINT, R16UI, R16UI, SWIZ_000X, 16, 0),140FORMAT(A32_SINT, R32I, R32I, SWIZ_000X, 32, 1),141FORMAT(A32_UINT, R32UI, R32UI, SWIZ_000X, 32, 1),142143FORMAT(R11G11B10_FLOAT, R11F_G11F_B10F, R11F_G11F_B10F, SWIZ_XYZ1, 16, 0),144FORMAT(R9G9B9E5_FLOAT, NO, RGB9_E5, SWIZ_XYZ1, 16, 0),145146#if V3D_VERSION >= 40147FORMAT(S8_UINT_Z24_UNORM, D24S8, DEPTH24_X8, SWIZ_XXXX, 32, 1),148FORMAT(X8Z24_UNORM, D24S8, DEPTH24_X8, SWIZ_XXXX, 32, 1),149FORMAT(S8X24_UINT, S8, RGBA8UI, SWIZ_XXXX, 16, 1),150FORMAT(Z32_FLOAT, D32F, DEPTH_COMP32F, SWIZ_XXXX, 32, 1),151FORMAT(Z16_UNORM, D16, DEPTH_COMP16,SWIZ_XXXX, 32, 1),152153/* Pretend we support this, but it'll be separate Z32F depth and S8. */154FORMAT(Z32_FLOAT_S8X24_UINT, D32F, DEPTH_COMP32F, SWIZ_XXXX, 32, 1),155FORMAT(X32_S8X24_UINT, S8, R8UI, SWIZ_XXXX, 16, 1),156#else157FORMAT(S8_UINT_Z24_UNORM, ZS_DEPTH24_STENCIL8, DEPTH24_X8, SWIZ_XXXX, 32, 1),158FORMAT(X8Z24_UNORM, ZS_DEPTH24_STENCIL8, DEPTH24_X8, SWIZ_XXXX, 32, 1),159FORMAT(S8X24_UINT, NO, R32F, SWIZ_XXXX, 32, 1),160FORMAT(Z32_FLOAT, ZS_DEPTH_COMPONENT32F, R32F, SWIZ_XXXX, 32, 1),161FORMAT(Z16_UNORM, ZS_DEPTH_COMPONENT16, DEPTH_COMP16, SWIZ_XXXX, 32, 1),162163/* Pretend we support this, but it'll be separate Z32F depth and S8. */164FORMAT(Z32_FLOAT_S8X24_UINT, ZS_DEPTH_COMPONENT32F, R32F, SWIZ_XXXX, 32, 1),165#endif166167FORMAT(ETC2_RGB8, NO, RGB8_ETC2, SWIZ_XYZ1, 16, 0),168FORMAT(ETC2_SRGB8, NO, RGB8_ETC2, SWIZ_XYZ1, 16, 0),169FORMAT(ETC2_RGB8A1, NO, RGB8_PUNCHTHROUGH_ALPHA1, SWIZ_XYZW, 16, 0),170FORMAT(ETC2_SRGB8A1, NO, RGB8_PUNCHTHROUGH_ALPHA1, SWIZ_XYZW, 16, 0),171FORMAT(ETC2_RGBA8, NO, RGBA8_ETC2_EAC, SWIZ_XYZW, 16, 0),172FORMAT(ETC2_SRGBA8, NO, RGBA8_ETC2_EAC, SWIZ_XYZW, 16, 0),173FORMAT(ETC2_R11_UNORM, NO, R11_EAC, SWIZ_X001, 16, 0),174FORMAT(ETC2_R11_SNORM, NO, SIGNED_R11_EAC, SWIZ_X001, 16, 0),175FORMAT(ETC2_RG11_UNORM, NO, RG11_EAC, SWIZ_XY01, 16, 0),176FORMAT(ETC2_RG11_SNORM, NO, SIGNED_RG11_EAC, SWIZ_XY01, 16, 0),177178FORMAT(DXT1_RGB, NO, BC1, SWIZ_XYZ1, 16, 0),179FORMAT(DXT1_SRGB, NO, BC1, SWIZ_XYZ1, 16, 0),180FORMAT(DXT1_RGBA, NO, BC1, SWIZ_XYZW, 16, 0),181FORMAT(DXT1_SRGBA, NO, BC1, SWIZ_XYZW, 16, 0),182FORMAT(DXT3_RGBA, NO, BC2, SWIZ_XYZW, 16, 0),183FORMAT(DXT3_SRGBA, NO, BC2, SWIZ_XYZW, 16, 0),184FORMAT(DXT5_RGBA, NO, BC3, SWIZ_XYZW, 16, 0),185FORMAT(DXT5_SRGBA, NO, BC3, SWIZ_XYZW, 16, 0),186};187188const struct v3d_format *189v3dX(get_format_desc)(enum pipe_format f)190{191if (f < ARRAY_SIZE(format_table) && format_table[f].present)192return &format_table[f];193else194return NULL;195}196197void198v3dX(get_internal_type_bpp_for_output_format)(uint32_t format,199uint32_t *type,200uint32_t *bpp)201{202switch (format) {203case V3D_OUTPUT_IMAGE_FORMAT_RGBA8:204#if V3D_VERSION < 41205case V3D_OUTPUT_IMAGE_FORMAT_RGBX8:206#endif207case V3D_OUTPUT_IMAGE_FORMAT_RGB8:208case V3D_OUTPUT_IMAGE_FORMAT_RG8:209case V3D_OUTPUT_IMAGE_FORMAT_R8:210case V3D_OUTPUT_IMAGE_FORMAT_ABGR4444:211case V3D_OUTPUT_IMAGE_FORMAT_BGR565:212case V3D_OUTPUT_IMAGE_FORMAT_ABGR1555:213*type = V3D_INTERNAL_TYPE_8;214*bpp = V3D_INTERNAL_BPP_32;215break;216217case V3D_OUTPUT_IMAGE_FORMAT_RGBA8I:218case V3D_OUTPUT_IMAGE_FORMAT_RG8I:219case V3D_OUTPUT_IMAGE_FORMAT_R8I:220*type = V3D_INTERNAL_TYPE_8I;221*bpp = V3D_INTERNAL_BPP_32;222break;223224case V3D_OUTPUT_IMAGE_FORMAT_RGBA8UI:225case V3D_OUTPUT_IMAGE_FORMAT_RG8UI:226case V3D_OUTPUT_IMAGE_FORMAT_R8UI:227*type = V3D_INTERNAL_TYPE_8UI;228*bpp = V3D_INTERNAL_BPP_32;229break;230231case V3D_OUTPUT_IMAGE_FORMAT_SRGB8_ALPHA8:232case V3D_OUTPUT_IMAGE_FORMAT_SRGB:233case V3D_OUTPUT_IMAGE_FORMAT_RGB10_A2:234case V3D_OUTPUT_IMAGE_FORMAT_R11F_G11F_B10F:235#if V3D_VERSION < 41236case V3D_OUTPUT_IMAGE_FORMAT_SRGBX8:237#endif238case V3D_OUTPUT_IMAGE_FORMAT_RGBA16F:239/* Note that sRGB RTs are stored in the tile buffer at 16F,240* and the conversion to sRGB happens at tilebuffer241* load/store.242*/243*type = V3D_INTERNAL_TYPE_16F;244*bpp = V3D_INTERNAL_BPP_64;245break;246247case V3D_OUTPUT_IMAGE_FORMAT_RG16F:248case V3D_OUTPUT_IMAGE_FORMAT_R16F:249*type = V3D_INTERNAL_TYPE_16F;250/* Use 64bpp to make sure the TLB doesn't throw away the alpha251* channel before alpha test happens.252*/253*bpp = V3D_INTERNAL_BPP_64;254break;255256case V3D_OUTPUT_IMAGE_FORMAT_RGBA16I:257*type = V3D_INTERNAL_TYPE_16I;258*bpp = V3D_INTERNAL_BPP_64;259break;260case V3D_OUTPUT_IMAGE_FORMAT_RG16I:261case V3D_OUTPUT_IMAGE_FORMAT_R16I:262*type = V3D_INTERNAL_TYPE_16I;263*bpp = V3D_INTERNAL_BPP_32;264break;265266case V3D_OUTPUT_IMAGE_FORMAT_RGB10_A2UI:267case V3D_OUTPUT_IMAGE_FORMAT_RGBA16UI:268*type = V3D_INTERNAL_TYPE_16UI;269*bpp = V3D_INTERNAL_BPP_64;270break;271case V3D_OUTPUT_IMAGE_FORMAT_RG16UI:272case V3D_OUTPUT_IMAGE_FORMAT_R16UI:273*type = V3D_INTERNAL_TYPE_16UI;274*bpp = V3D_INTERNAL_BPP_32;275break;276277case V3D_OUTPUT_IMAGE_FORMAT_RGBA32I:278*type = V3D_INTERNAL_TYPE_32I;279*bpp = V3D_INTERNAL_BPP_128;280break;281case V3D_OUTPUT_IMAGE_FORMAT_RG32I:282*type = V3D_INTERNAL_TYPE_32I;283*bpp = V3D_INTERNAL_BPP_64;284break;285case V3D_OUTPUT_IMAGE_FORMAT_R32I:286*type = V3D_INTERNAL_TYPE_32I;287*bpp = V3D_INTERNAL_BPP_32;288break;289290case V3D_OUTPUT_IMAGE_FORMAT_RGBA32UI:291*type = V3D_INTERNAL_TYPE_32UI;292*bpp = V3D_INTERNAL_BPP_128;293break;294case V3D_OUTPUT_IMAGE_FORMAT_RG32UI:295*type = V3D_INTERNAL_TYPE_32UI;296*bpp = V3D_INTERNAL_BPP_64;297break;298case V3D_OUTPUT_IMAGE_FORMAT_R32UI:299*type = V3D_INTERNAL_TYPE_32UI;300*bpp = V3D_INTERNAL_BPP_32;301break;302303case V3D_OUTPUT_IMAGE_FORMAT_RGBA32F:304*type = V3D_INTERNAL_TYPE_32F;305*bpp = V3D_INTERNAL_BPP_128;306break;307case V3D_OUTPUT_IMAGE_FORMAT_RG32F:308*type = V3D_INTERNAL_TYPE_32F;309*bpp = V3D_INTERNAL_BPP_64;310break;311case V3D_OUTPUT_IMAGE_FORMAT_R32F:312*type = V3D_INTERNAL_TYPE_32F;313*bpp = V3D_INTERNAL_BPP_32;314break;315316default:317/* Provide some default values, as we'll be called at RB318* creation time, even if an RB with this format isn't319* supported.320*/321*type = V3D_INTERNAL_TYPE_8;322*bpp = V3D_INTERNAL_BPP_32;323break;324}325}326327bool328v3dX(tfu_supports_tex_format)(enum V3DX(Texture_Data_Formats) format,329bool for_mipmap)330{331switch (format) {332case TEXTURE_DATA_FORMAT_R8:333case TEXTURE_DATA_FORMAT_R8_SNORM:334case TEXTURE_DATA_FORMAT_RG8:335case TEXTURE_DATA_FORMAT_RG8_SNORM:336case TEXTURE_DATA_FORMAT_RGBA8:337case TEXTURE_DATA_FORMAT_RGBA8_SNORM:338case TEXTURE_DATA_FORMAT_RGB565:339case TEXTURE_DATA_FORMAT_RGBA4:340case TEXTURE_DATA_FORMAT_RGB5_A1:341case TEXTURE_DATA_FORMAT_RGB10_A2:342case TEXTURE_DATA_FORMAT_R16:343case TEXTURE_DATA_FORMAT_R16_SNORM:344case TEXTURE_DATA_FORMAT_RG16:345case TEXTURE_DATA_FORMAT_RG16_SNORM:346case TEXTURE_DATA_FORMAT_RGBA16:347case TEXTURE_DATA_FORMAT_RGBA16_SNORM:348case TEXTURE_DATA_FORMAT_R16F:349case TEXTURE_DATA_FORMAT_RG16F:350case TEXTURE_DATA_FORMAT_RGBA16F:351case TEXTURE_DATA_FORMAT_R11F_G11F_B10F:352case TEXTURE_DATA_FORMAT_R4:353return true;354case TEXTURE_DATA_FORMAT_RGB9_E5:355case TEXTURE_DATA_FORMAT_R32F:356case TEXTURE_DATA_FORMAT_RG32F:357case TEXTURE_DATA_FORMAT_RGBA32F:358return !for_mipmap;359default:360return false;361}362}363364365