Path: blob/21.2-virgl/src/gallium/drivers/etnaviv/etnaviv_format.c
4570 views
/*1* Copyright (c) 2016 Etnaviv Project2*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, sub license,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 the11* next paragraph) shall be included in all copies or substantial portions12* of the 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 NON-INFRINGEMENT. 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 OTHER20* DEALINGS IN THE SOFTWARE.21*22* Authors:23* Christian Gmeiner <[email protected]>24*/2526#include "etnaviv_format.h"2728#include "hw/common_3d.xml.h"29#include "hw/state.xml.h"30#include "hw/state_3d.xml.h"3132#include "pipe/p_defines.h"33#include "util/compiler.h"3435/* Specifies the table of all the formats and their features. Also supplies36* the helpers that look up various data in those tables.37*/3839struct etna_format {40unsigned vtx;41unsigned tex;42unsigned pe;43bool present;44};4546#define PE_FORMAT_NONE ~04748#define PE_FORMAT_MASK 0x7f49#define PE_FORMAT(x) ((x) & PE_FORMAT_MASK)50#define PE_FORMAT_RB_SWAP 0x805152#define PE_FORMAT_X8B8G8R8 (PE_FORMAT_X8R8G8B8 | PE_FORMAT_RB_SWAP)53#define PE_FORMAT_A8B8G8R8 (PE_FORMAT_A8R8G8B8 | PE_FORMAT_RB_SWAP)5455#define TS_SAMPLER_FORMAT_NONE ETNA_NO_MATCH5657/* vertex + texture */58#define VT(pipe, vtxfmt, texfmt, rsfmt) \59[PIPE_FORMAT_##pipe] = { \60.vtx = FE_DATA_TYPE_##vtxfmt, \61.tex = TEXTURE_FORMAT_##texfmt, \62.pe = PE_FORMAT_##rsfmt, \63.present = 1, \64}6566/* texture-only */67#define _T(pipe, fmt, rsfmt) \68[PIPE_FORMAT_##pipe] = { \69.vtx = ETNA_NO_MATCH, \70.tex = TEXTURE_FORMAT_##fmt, \71.pe = PE_FORMAT_##rsfmt, \72.present = 1, \73}7475/* vertex-only */76#define V_(pipe, fmt, rsfmt) \77[PIPE_FORMAT_##pipe] = { \78.vtx = FE_DATA_TYPE_##fmt, \79.tex = ETNA_NO_MATCH, \80.pe = PE_FORMAT_##rsfmt, \81.present = 1, \82}8384static struct etna_format formats[PIPE_FORMAT_COUNT] = {85/* 8-bit */86VT(R8_UNORM, UNSIGNED_BYTE, L8, R8),87VT(R8_SNORM, BYTE, EXT_R8_SNORM | EXT_FORMAT, NONE),88VT(R8_UINT, BYTE_I, EXT_R8I | EXT_FORMAT, R8I),89VT(R8_SINT, BYTE_I, EXT_R8I | EXT_FORMAT, R8I),90V_(R8_USCALED, UNSIGNED_BYTE, NONE),91V_(R8_SSCALED, BYTE, NONE),9293_T(A8_UNORM, A8, NONE),94_T(L8_UNORM, L8, NONE),95_T(I8_UNORM, I8, NONE),9697/* 16-bit */98V_(R16_UNORM, UNSIGNED_SHORT, NONE),99V_(R16_SNORM, SHORT, NONE),100VT(R16_UINT, SHORT_I, EXT_R16I | EXT_FORMAT, R16I),101VT(R16_SINT, SHORT_I, EXT_R16I | EXT_FORMAT, R16I),102V_(R16_USCALED, UNSIGNED_SHORT, NONE),103V_(R16_SSCALED, SHORT, NONE),104VT(R16_FLOAT, HALF_FLOAT, EXT_R16F | EXT_FORMAT, R16F),105106_T(B4G4R4A4_UNORM, A4R4G4B4, A4R4G4B4),107_T(B4G4R4X4_UNORM, X4R4G4B4, X4R4G4B4),108109_T(L8A8_UNORM, A8L8, NONE),110111_T(Z16_UNORM, D16, NONE),112_T(B5G6R5_UNORM, R5G6B5, R5G6B5),113_T(B5G5R5A1_UNORM, A1R5G5B5, A1R5G5B5),114_T(B5G5R5X1_UNORM, X1R5G5B5, X1R5G5B5),115116VT(R8G8_UNORM, UNSIGNED_BYTE, EXT_G8R8 | EXT_FORMAT, G8R8),117VT(R8G8_SNORM, BYTE, EXT_G8R8_SNORM | EXT_FORMAT, NONE),118VT(R8G8_UINT, BYTE_I, EXT_G8R8I | EXT_FORMAT, G8R8I),119VT(R8G8_SINT, BYTE_I, EXT_G8R8I | EXT_FORMAT, G8R8I),120V_(R8G8_USCALED, UNSIGNED_BYTE, NONE),121V_(R8G8_SSCALED, BYTE, NONE),122123/* 24-bit */124V_(R8G8B8_UNORM, UNSIGNED_BYTE, NONE),125V_(R8G8B8_SNORM, BYTE, NONE),126V_(R8G8B8_UINT, BYTE_I, NONE),127V_(R8G8B8_SINT, BYTE_I, NONE),128V_(R8G8B8_USCALED, UNSIGNED_BYTE, NONE),129V_(R8G8B8_SSCALED, BYTE, NONE),130131/* 32-bit */132V_(R32_UNORM, UNSIGNED_INT, NONE),133V_(R32_SNORM, INT, NONE),134VT(R32_SINT, FLOAT, EXT_R32F | EXT_FORMAT, R32F),135VT(R32_UINT, FLOAT, EXT_R32F | EXT_FORMAT, R32F),136V_(R32_USCALED, UNSIGNED_INT, NONE),137V_(R32_SSCALED, INT, NONE),138VT(R32_FLOAT, FLOAT, EXT_R32F | EXT_FORMAT, R32F),139V_(R32_FIXED, FIXED, NONE),140141V_(R16G16_UNORM, UNSIGNED_SHORT, NONE),142V_(R16G16_SNORM, SHORT, NONE),143VT(R16G16_UINT, SHORT_I, EXT_G16R16I | EXT_FORMAT, G16R16I),144VT(R16G16_SINT, SHORT_I, EXT_G16R16I | EXT_FORMAT, G16R16I),145V_(R16G16_USCALED, UNSIGNED_SHORT, NONE),146V_(R16G16_SSCALED, SHORT, NONE),147VT(R16G16_FLOAT, HALF_FLOAT, EXT_G16R16F | EXT_FORMAT, G16R16F),148149V_(A8B8G8R8_UNORM, UNSIGNED_BYTE, NONE),150151VT(R8G8B8A8_UNORM, UNSIGNED_BYTE, A8B8G8R8, A8B8G8R8),152VT(R8G8B8A8_SNORM, BYTE, EXT_A8B8G8R8_SNORM | EXT_FORMAT, NONE),153_T(R8G8B8X8_UNORM, X8B8G8R8, X8B8G8R8),154_T(R8G8B8X8_SNORM, EXT_X8B8G8R8_SNORM | EXT_FORMAT, NONE),155VT(R8G8B8A8_UINT, BYTE_I, EXT_A8B8G8R8I | EXT_FORMAT, A8B8G8R8I),156VT(R8G8B8A8_SINT, BYTE_I, EXT_A8B8G8R8I | EXT_FORMAT, A8B8G8R8I),157V_(R8G8B8A8_USCALED, UNSIGNED_BYTE, A8B8G8R8),158V_(R8G8B8A8_SSCALED, BYTE, A8B8G8R8),159160_T(B8G8R8A8_UNORM, A8R8G8B8, A8R8G8B8),161_T(B8G8R8X8_UNORM, X8R8G8B8, X8R8G8B8),162163VT(R10G10B10A2_UNORM, UNSIGNED_INT_2_10_10_10_REV, EXT_A2B10G10R10 | EXT_FORMAT, A2B10G10R10),164_T(R10G10B10X2_UNORM, EXT_A2B10G10R10 | EXT_FORMAT, A2B10G10R10),165V_(R10G10B10A2_SNORM, INT_2_10_10_10_REV, NONE),166_T(R10G10B10A2_UINT, EXT_A2B10G10R10UI | EXT_FORMAT, A2B10G10R10UI),167V_(R10G10B10A2_USCALED, UNSIGNED_INT_2_10_10_10_REV, NONE),168V_(R10G10B10A2_SSCALED, INT_2_10_10_10_REV, NONE),169170_T(X8Z24_UNORM, D24X8, NONE),171_T(S8_UINT_Z24_UNORM, D24X8, NONE),172173_T(R9G9B9E5_FLOAT, E5B9G9R9, NONE),174_T(R11G11B10_FLOAT, EXT_B10G11R11F | EXT_FORMAT, B10G11R11F),175176/* 48-bit */177V_(R16G16B16_UNORM, UNSIGNED_SHORT, NONE),178V_(R16G16B16_SNORM, SHORT, NONE),179V_(R16G16B16_UINT, SHORT_I, NONE),180V_(R16G16B16_SINT, SHORT_I, NONE),181V_(R16G16B16_USCALED, UNSIGNED_SHORT, NONE),182V_(R16G16B16_SSCALED, SHORT, NONE),183V_(R16G16B16_FLOAT, HALF_FLOAT, NONE),184185/* 64-bit */186V_(R16G16B16A16_UNORM, UNSIGNED_SHORT, NONE),187V_(R16G16B16A16_SNORM, SHORT, NONE),188VT(R16G16B16A16_UINT, SHORT_I, EXT_A16B16G16R16I | EXT_FORMAT, A16B16G16R16I),189VT(R16G16B16A16_SINT, SHORT_I, EXT_A16B16G16R16I | EXT_FORMAT, A16B16G16R16I),190V_(R16G16B16A16_USCALED, UNSIGNED_SHORT, NONE),191V_(R16G16B16A16_SSCALED, SHORT, NONE),192VT(R16G16B16A16_FLOAT, HALF_FLOAT, EXT_A16B16G16R16F | EXT_FORMAT, A16B16G16R16F),193194V_(R32G32_UNORM, UNSIGNED_INT, NONE),195V_(R32G32_SNORM, INT, NONE),196VT(R32G32_UINT, FLOAT, EXT_G32R32F | EXT_FORMAT, G32R32F),197VT(R32G32_SINT, FLOAT, EXT_G32R32F | EXT_FORMAT, G32R32F),198V_(R32G32_USCALED, UNSIGNED_INT, NONE),199V_(R32G32_SSCALED, INT, NONE),200VT(R32G32_FLOAT, FLOAT, EXT_G32R32F | EXT_FORMAT, G32R32F),201V_(R32G32_FIXED, FIXED, NONE),202203/* 96-bit */204V_(R32G32B32_UNORM, UNSIGNED_INT, NONE),205V_(R32G32B32_SNORM, INT, NONE),206V_(R32G32B32_UINT, FLOAT, NONE),207V_(R32G32B32_SINT, FLOAT, NONE),208V_(R32G32B32_USCALED, UNSIGNED_INT, NONE),209V_(R32G32B32_SSCALED, INT, NONE),210V_(R32G32B32_FLOAT, FLOAT, NONE),211V_(R32G32B32_FIXED, FIXED, NONE),212213/* 128-bit */214V_(R32G32B32A32_UNORM, UNSIGNED_INT, NONE),215V_(R32G32B32A32_SNORM, INT, NONE),216V_(R32G32B32A32_UINT, FLOAT, NONE),217V_(R32G32B32A32_SINT, FLOAT, NONE),218V_(R32G32B32A32_USCALED, UNSIGNED_INT, NONE),219V_(R32G32B32A32_SSCALED, INT, NONE),220V_(R32G32B32A32_FLOAT, FLOAT, NONE),221V_(R32G32B32A32_FIXED, FIXED, NONE),222223/* compressed */224_T(ETC1_RGB8, ETC1, NONE),225226_T(DXT1_RGB, DXT1, NONE),227_T(DXT1_RGBA, DXT1, NONE),228_T(DXT3_RGBA, DXT2_DXT3, NONE),229_T(DXT5_RGBA, DXT4_DXT5, NONE),230231_T(ETC2_RGB8, EXT_NONE | EXT_FORMAT, NONE), /* Extd. format NONE doubles as ETC2_RGB8 */232_T(ETC2_RGB8A1, EXT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | EXT_FORMAT, NONE),233_T(ETC2_RGBA8, EXT_RGBA8_ETC2_EAC | EXT_FORMAT, NONE),234_T(ETC2_R11_UNORM, EXT_R11_EAC | EXT_FORMAT, NONE),235_T(ETC2_R11_SNORM, EXT_SIGNED_R11_EAC | EXT_FORMAT, NONE),236_T(ETC2_RG11_UNORM, EXT_RG11_EAC | EXT_FORMAT, NONE),237_T(ETC2_RG11_SNORM, EXT_SIGNED_RG11_EAC | EXT_FORMAT, NONE),238239_T(ASTC_4x4, ASTC_RGBA_4x4 | ASTC_FORMAT, NONE),240_T(ASTC_5x4, ASTC_RGBA_5x4 | ASTC_FORMAT, NONE),241_T(ASTC_5x5, ASTC_RGBA_5x5 | ASTC_FORMAT, NONE),242_T(ASTC_6x5, ASTC_RGBA_6x5 | ASTC_FORMAT, NONE),243_T(ASTC_6x6, ASTC_RGBA_6x6 | ASTC_FORMAT, NONE),244_T(ASTC_8x5, ASTC_RGBA_8x5 | ASTC_FORMAT, NONE),245_T(ASTC_8x6, ASTC_RGBA_8x6 | ASTC_FORMAT, NONE),246_T(ASTC_8x8, ASTC_RGBA_8x8 | ASTC_FORMAT, NONE),247_T(ASTC_10x5, ASTC_RGBA_10x5 | ASTC_FORMAT, NONE),248_T(ASTC_10x6, ASTC_RGBA_10x6 | ASTC_FORMAT, NONE),249_T(ASTC_10x8, ASTC_RGBA_10x8 | ASTC_FORMAT, NONE),250_T(ASTC_10x10, ASTC_RGBA_10x10 | ASTC_FORMAT, NONE),251_T(ASTC_12x10, ASTC_RGBA_12x10 | ASTC_FORMAT, NONE),252_T(ASTC_12x12, ASTC_RGBA_12x12 | ASTC_FORMAT, NONE),253254/* YUV */255_T(YUYV, YUY2, YUY2),256_T(UYVY, UYVY, NONE),257};258259uint32_t260translate_texture_format(enum pipe_format fmt)261{262fmt = util_format_linear(fmt);263264if (!formats[fmt].present)265return ETNA_NO_MATCH;266267return formats[fmt].tex;268}269270bool271texture_use_int_filter(const struct pipe_sampler_view *sv,272const struct pipe_sampler_state *ss,273bool tex_desc)274{275switch (sv->target) {276case PIPE_TEXTURE_1D_ARRAY:277case PIPE_TEXTURE_2D_ARRAY:278if (tex_desc)279break;280FALLTHROUGH;281case PIPE_TEXTURE_3D:282return false;283default:284break;285}286287/* only unorm formats can use int filter */288if (!util_format_is_unorm(sv->format))289return false;290291if (util_format_is_srgb(sv->format))292return false;293294if (util_format_description(sv->format)->layout == UTIL_FORMAT_LAYOUT_ASTC)295return false;296297if (ss->max_anisotropy > 1)298return false;299300switch (sv->format) {301/* apparently D16 can't use int filter but D24 can */302case PIPE_FORMAT_Z16_UNORM:303case PIPE_FORMAT_R10G10B10A2_UNORM:304case PIPE_FORMAT_R10G10B10X2_UNORM:305case PIPE_FORMAT_ETC2_R11_UNORM:306case PIPE_FORMAT_ETC2_RG11_UNORM:307return false;308default:309return true;310}311}312313bool314texture_format_needs_swiz(enum pipe_format fmt)315{316return util_format_linear(fmt) == PIPE_FORMAT_R8_UNORM;317}318319uint32_t320get_texture_swiz(enum pipe_format fmt, unsigned swizzle_r,321unsigned swizzle_g, unsigned swizzle_b, unsigned swizzle_a)322{323unsigned char swiz[4] = {324swizzle_r, swizzle_g, swizzle_b, swizzle_a,325};326327if (util_format_linear(fmt) == PIPE_FORMAT_R8_UNORM) {328/* R8 is emulated with L8, needs yz channels set to zero */329for (unsigned i = 0; i < 4; i++) {330if (swiz[i] == PIPE_SWIZZLE_Y || swiz[i] == PIPE_SWIZZLE_Z)331swiz[i] = PIPE_SWIZZLE_0;332}333}334335/* PIPE_SWIZZLE_ maps 1:1 to TEXTURE_SWIZZLE_ */336STATIC_ASSERT(PIPE_SWIZZLE_X == TEXTURE_SWIZZLE_RED);337STATIC_ASSERT(PIPE_SWIZZLE_Y == TEXTURE_SWIZZLE_GREEN);338STATIC_ASSERT(PIPE_SWIZZLE_Z == TEXTURE_SWIZZLE_BLUE);339STATIC_ASSERT(PIPE_SWIZZLE_W == TEXTURE_SWIZZLE_ALPHA);340STATIC_ASSERT(PIPE_SWIZZLE_0 == TEXTURE_SWIZZLE_ZERO);341STATIC_ASSERT(PIPE_SWIZZLE_1 == TEXTURE_SWIZZLE_ONE);342343return VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_R(swiz[0]) |344VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_G(swiz[1]) |345VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_B(swiz[2]) |346VIVS_TE_SAMPLER_CONFIG1_SWIZZLE_A(swiz[3]);347}348349uint32_t350translate_pe_format(enum pipe_format fmt)351{352fmt = util_format_linear(fmt);353354if (!formats[fmt].present)355return ETNA_NO_MATCH;356357if (formats[fmt].pe == ETNA_NO_MATCH)358return ETNA_NO_MATCH;359360return PE_FORMAT(formats[fmt].pe);361}362363int364translate_pe_format_rb_swap(enum pipe_format fmt)365{366fmt = util_format_linear(fmt);367assert(formats[fmt].present);368369return formats[fmt].pe & PE_FORMAT_RB_SWAP;370}371372/* Return type flags for vertex element format */373uint32_t374translate_vertex_format_type(enum pipe_format fmt)375{376if (!formats[fmt].present)377return ETNA_NO_MATCH;378379return formats[fmt].vtx;380}381382383