Home | History | Annotate | Download | only in etnaviv
      1 /*
      2  * Copyright (c) 2016 Etnaviv Project
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sub license,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the
     12  * next paragraph) shall be included in all copies or substantial portions
     13  * of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Christian Gmeiner <christian.gmeiner (at) gmail.com>
     25  */
     26 
     27 #include "etnaviv_format.h"
     28 
     29 #include "hw/state.xml.h"
     30 #include "hw/state_3d.xml.h"
     31 
     32 #include "pipe/p_defines.h"
     33 
     34 /* Specifies the table of all the formats and their features. Also supplies
     35  * the helpers that look up various data in those tables.
     36  */
     37 
     38 struct etna_format {
     39    unsigned vtx;
     40    unsigned tex;
     41    unsigned rs;
     42    boolean present;
     43 };
     44 
     45 #define RS_FORMAT_NONE ~0
     46 
     47 #define RS_FORMAT_MASK        0xf
     48 #define RS_FORMAT(x)          ((x) & RS_FORMAT_MASK)
     49 #define RS_FORMAT_RB_SWAP     0x10
     50 
     51 #define RS_FORMAT_X8B8G8R8    (RS_FORMAT_X8R8G8B8 | RS_FORMAT_RB_SWAP)
     52 #define RS_FORMAT_A8B8G8R8    (RS_FORMAT_A8R8G8B8 | RS_FORMAT_RB_SWAP)
     53 
     54 /* vertex + texture */
     55 #define VT(pipe, vtxfmt, texfmt, rsfmt)                   \
     56    [PIPE_FORMAT_##pipe] = {                               \
     57       .vtx = VIVS_FE_VERTEX_ELEMENT_CONFIG_TYPE_##vtxfmt, \
     58       .tex = TEXTURE_FORMAT_##texfmt,                     \
     59       .rs = RS_FORMAT_##rsfmt,                            \
     60       .present = 1,                                       \
     61    }
     62 
     63 /* texture-only */
     64 #define _T(pipe, fmt, rsfmt)       \
     65    [PIPE_FORMAT_##pipe] = {        \
     66       .vtx = ETNA_NO_MATCH,        \
     67       .tex = TEXTURE_FORMAT_##fmt, \
     68       .rs = RS_FORMAT_##rsfmt,     \
     69       .present = 1,                \
     70    }
     71 
     72 /* vertex-only */
     73 #define V_(pipe, fmt, rsfmt)                           \
     74    [PIPE_FORMAT_##pipe] = {                            \
     75       .vtx = VIVS_FE_VERTEX_ELEMENT_CONFIG_TYPE_##fmt, \
     76       .tex = ETNA_NO_MATCH,                            \
     77       .rs = RS_FORMAT_##rsfmt,                         \
     78       .present = 1,                                    \
     79    }
     80 
     81 static struct etna_format formats[PIPE_FORMAT_COUNT] = {
     82    /* 8-bit */
     83    V_(R8_UNORM,   UNSIGNED_BYTE, NONE),
     84    V_(R8_SNORM,   BYTE,          NONE),
     85    V_(R8_UINT,    UNSIGNED_BYTE, NONE),
     86    V_(R8_SINT,    BYTE,          NONE),
     87    V_(R8_USCALED, UNSIGNED_BYTE, NONE),
     88    V_(R8_SSCALED, BYTE,          NONE),
     89 
     90    _T(A8_UNORM, A8, NONE),
     91    _T(L8_UNORM, L8, NONE),
     92    _T(I8_UNORM, I8, NONE),
     93 
     94    /* 16-bit */
     95    V_(R16_UNORM,   UNSIGNED_SHORT, NONE),
     96    V_(R16_SNORM,   SHORT,          NONE),
     97    V_(R16_UINT,    UNSIGNED_SHORT, NONE),
     98    V_(R16_SINT,    SHORT,          NONE),
     99    V_(R16_USCALED, UNSIGNED_SHORT, NONE),
    100    V_(R16_SSCALED, SHORT,          NONE),
    101    V_(R16_FLOAT,   HALF_FLOAT,     NONE),
    102 
    103    _T(B4G4R4A4_UNORM, A4R4G4B4, A4R4G4B4),
    104    _T(B4G4R4X4_UNORM, X4R4G4B4, X4R4G4B4),
    105 
    106    _T(Z16_UNORM,      D16,      A4R4G4B4),
    107    _T(B5G6R5_UNORM,   R5G6B5,   R5G6B5),
    108    _T(B5G5R5A1_UNORM, A1R5G5B5, A1R5G5B5),
    109    _T(B5G5R5X1_UNORM, X1R5G5B5, X1R5G5B5),
    110 
    111    V_(R8G8_UNORM,   UNSIGNED_BYTE,  NONE),
    112    V_(R8G8_SNORM,   BYTE,           NONE),
    113    V_(R8G8_UINT,    UNSIGNED_BYTE,  NONE),
    114    V_(R8G8_SINT,    BYTE,           NONE),
    115    V_(R8G8_USCALED, UNSIGNED_BYTE,  NONE),
    116    V_(R8G8_SSCALED, BYTE,           NONE),
    117 
    118    /* 24-bit */
    119    V_(R8G8B8_UNORM,   UNSIGNED_BYTE, NONE),
    120    V_(R8G8B8_SNORM,   BYTE,          NONE),
    121    V_(R8G8B8_UINT,    UNSIGNED_BYTE, NONE),
    122    V_(R8G8B8_SINT,    BYTE,          NONE),
    123    V_(R8G8B8_USCALED, UNSIGNED_BYTE, NONE),
    124    V_(R8G8B8_SSCALED, BYTE,          NONE),
    125 
    126    /* 32-bit */
    127    V_(R32_UNORM,   UNSIGNED_INT, NONE),
    128    V_(R32_SNORM,   INT,          NONE),
    129    V_(R32_SINT,    INT,          NONE),
    130    V_(R32_UINT,    UNSIGNED_INT, NONE),
    131    V_(R32_USCALED, UNSIGNED_INT, NONE),
    132    V_(R32_SSCALED, INT,          NONE),
    133    V_(R32_FLOAT,   FLOAT,        NONE),
    134    V_(R32_FIXED,   FIXED,        NONE),
    135 
    136    V_(R16G16_UNORM,   UNSIGNED_SHORT, NONE),
    137    V_(R16G16_SNORM,   SHORT,          NONE),
    138    V_(R16G16_UINT,    UNSIGNED_SHORT, NONE),
    139    V_(R16G16_SINT,    SHORT,          NONE),
    140    V_(R16G16_USCALED, UNSIGNED_SHORT, NONE),
    141    V_(R16G16_SSCALED, SHORT,          NONE),
    142    V_(R16G16_FLOAT,   HALF_FLOAT,     NONE),
    143 
    144    V_(A8B8G8R8_UNORM,   UNSIGNED_BYTE, NONE),
    145 
    146    V_(R8G8B8A8_UNORM,   UNSIGNED_BYTE, A8B8G8R8),
    147    V_(R8G8B8A8_SNORM,   BYTE,          A8B8G8R8),
    148    _T(R8G8B8X8_UNORM,   X8B8G8R8,      X8B8G8R8),
    149    V_(R8G8B8A8_UINT,    UNSIGNED_BYTE, A8B8G8R8),
    150    V_(R8G8B8A8_SINT,    BYTE,          A8B8G8R8),
    151    V_(R8G8B8A8_USCALED, UNSIGNED_BYTE, A8B8G8R8),
    152    V_(R8G8B8A8_SSCALED, BYTE,          A8B8G8R8),
    153 
    154    _T(R8G8B8A8_UNORM, A8B8G8R8, A8B8G8R8),
    155    _T(R8G8B8X8_UNORM, X8B8G8R8, X8B8G8R8),
    156 
    157    _T(B8G8R8A8_UNORM, A8R8G8B8, A8R8G8B8),
    158    _T(B8G8R8X8_UNORM, X8R8G8B8, X8R8G8B8),
    159 
    160    V_(R10G10B10A2_UNORM,   UNSIGNED_INT_10_10_10_2, NONE),
    161    V_(R10G10B10A2_SNORM,   INT_10_10_10_2,          NONE),
    162    V_(R10G10B10A2_USCALED, UNSIGNED_INT_10_10_10_2, NONE),
    163    V_(R10G10B10A2_SSCALED, INT_10_10_10_2,          NONE),
    164 
    165    _T(X8Z24_UNORM,       D24S8, A8R8G8B8),
    166    _T(S8_UINT_Z24_UNORM, D24S8, A8R8G8B8),
    167 
    168    /* 48-bit */
    169    V_(R16G16B16_UNORM,   UNSIGNED_SHORT, NONE),
    170    V_(R16G16B16_SNORM,   SHORT,          NONE),
    171    V_(R16G16B16_UINT,    UNSIGNED_SHORT, NONE),
    172    V_(R16G16B16_SINT,    SHORT,          NONE),
    173    V_(R16G16B16_USCALED, UNSIGNED_SHORT, NONE),
    174    V_(R16G16B16_SSCALED, SHORT,          NONE),
    175    V_(R16G16B16_FLOAT,   HALF_FLOAT,     NONE),
    176 
    177    /* 64-bit */
    178    V_(R16G16B16A16_UNORM,   UNSIGNED_SHORT, NONE),
    179    V_(R16G16B16A16_SNORM,   SHORT,          NONE),
    180    V_(R16G16B16A16_UINT,    UNSIGNED_SHORT, NONE),
    181    V_(R16G16B16A16_SINT,    SHORT,          NONE),
    182    V_(R16G16B16A16_USCALED, UNSIGNED_SHORT, NONE),
    183    V_(R16G16B16A16_SSCALED, SHORT,          NONE),
    184    V_(R16G16B16A16_FLOAT,   HALF_FLOAT,     NONE),
    185 
    186    V_(R32G32_UNORM,   UNSIGNED_INT, NONE),
    187    V_(R32G32_SNORM,   INT,          NONE),
    188    V_(R32G32_UINT,    UNSIGNED_INT, NONE),
    189    V_(R32G32_SINT,    INT,          NONE),
    190    V_(R32G32_USCALED, UNSIGNED_INT, NONE),
    191    V_(R32G32_SSCALED, INT,          NONE),
    192    V_(R32G32_FLOAT,   FLOAT,        NONE),
    193    V_(R32G32_FIXED,   FIXED,        NONE),
    194 
    195    /* 96-bit */
    196    V_(R32G32B32_UNORM,   UNSIGNED_INT, NONE),
    197    V_(R32G32B32_SNORM,   INT,          NONE),
    198    V_(R32G32B32_UINT,    UNSIGNED_INT, NONE),
    199    V_(R32G32B32_SINT,    INT,          NONE),
    200    V_(R32G32B32_USCALED, UNSIGNED_INT, NONE),
    201    V_(R32G32B32_SSCALED, INT,          NONE),
    202    V_(R32G32B32_FLOAT,   FLOAT,        NONE),
    203    V_(R32G32B32_FIXED,   FIXED,        NONE),
    204 
    205    /* 128-bit */
    206    V_(R32G32B32A32_UNORM,   UNSIGNED_INT, NONE),
    207    V_(R32G32B32A32_SNORM,   INT,          NONE),
    208    V_(R32G32B32A32_UINT,    UNSIGNED_INT, NONE),
    209    V_(R32G32B32A32_SINT,    INT,          NONE),
    210    V_(R32G32B32A32_USCALED, UNSIGNED_INT, NONE),
    211    V_(R32G32B32A32_SSCALED, INT,          NONE),
    212    V_(R32G32B32A32_FLOAT,   FLOAT,        NONE),
    213    V_(R32G32B32A32_FIXED,   FIXED,        NONE),
    214 
    215    /* compressed */
    216    _T(ETC1_RGB8, ETC1, NONE),
    217 
    218    _T(DXT1_RGB,  DXT1,      NONE),
    219    _T(DXT1_RGBA, DXT1,      NONE),
    220    _T(DXT3_RGBA, DXT2_DXT3, NONE),
    221    _T(DXT3_RGBA, DXT2_DXT3, NONE),
    222    _T(DXT5_RGBA, DXT4_DXT5, NONE),
    223 
    224    /* YUV */
    225    _T(YUYV, YUY2, YUY2),
    226    _T(UYVY, UYVY, NONE),
    227 };
    228 
    229 uint32_t
    230 translate_texture_format(enum pipe_format fmt)
    231 {
    232    /* XXX with TEXTURE_FORMAT_EXT and swizzle on newer chips we can
    233     * support much more */
    234    if (!formats[fmt].present)
    235       return ETNA_NO_MATCH;
    236 
    237    return formats[fmt].tex;
    238 }
    239 
    240 uint32_t
    241 translate_rs_format(enum pipe_format fmt)
    242 {
    243    if (!formats[fmt].present)
    244       return ETNA_NO_MATCH;
    245 
    246    if (formats[fmt].rs == ETNA_NO_MATCH)
    247       return ETNA_NO_MATCH;
    248 
    249    return RS_FORMAT(formats[fmt].rs);
    250 }
    251 
    252 int
    253 translate_rs_format_rb_swap(enum pipe_format fmt)
    254 {
    255    assert(formats[fmt].present);
    256 
    257    return formats[fmt].rs & RS_FORMAT_RB_SWAP;
    258 }
    259 
    260 /* Return type flags for vertex element format */
    261 uint32_t
    262 translate_vertex_format_type(enum pipe_format fmt)
    263 {
    264    if (!formats[fmt].present)
    265       return ETNA_NO_MATCH;
    266 
    267    return formats[fmt].vtx;
    268 }
    269