1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright (C) 2016 Rob Clark <robclark@freedesktop.org> 3bf215546Sopenharmony_ci * Copyright © 2018 Google, Inc. 4bf215546Sopenharmony_ci * 5bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 6bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 7bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 8bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 10bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 11bf215546Sopenharmony_ci * 12bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the next 13bf215546Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 14bf215546Sopenharmony_ci * Software. 15bf215546Sopenharmony_ci * 16bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21bf215546Sopenharmony_ci * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22bf215546Sopenharmony_ci * SOFTWARE. 23bf215546Sopenharmony_ci * 24bf215546Sopenharmony_ci * Authors: 25bf215546Sopenharmony_ci * Rob Clark <robclark@freedesktop.org> 26bf215546Sopenharmony_ci */ 27bf215546Sopenharmony_ci 28bf215546Sopenharmony_ci#include "pipe/p_defines.h" 29bf215546Sopenharmony_ci#include "util/format/u_format.h" 30bf215546Sopenharmony_ci 31bf215546Sopenharmony_ci#include "fd6_format_table.h" 32bf215546Sopenharmony_ci 33bf215546Sopenharmony_ci/* Specifies the table of all the formats and their features. Also supplies 34bf215546Sopenharmony_ci * the helpers that look up various data in those tables. 35bf215546Sopenharmony_ci */ 36bf215546Sopenharmony_ci 37bf215546Sopenharmony_cistruct fd6_format { 38bf215546Sopenharmony_ci enum a6xx_format vtx; 39bf215546Sopenharmony_ci enum a6xx_format tex; 40bf215546Sopenharmony_ci enum a6xx_format rb; 41bf215546Sopenharmony_ci enum a3xx_color_swap swap; 42bf215546Sopenharmony_ci boolean present; 43bf215546Sopenharmony_ci}; 44bf215546Sopenharmony_ci 45bf215546Sopenharmony_ci#define FMT(pipe, vtxfmt, texfmt, rbfmt, swapfmt) \ 46bf215546Sopenharmony_ci [PIPE_FORMAT_##pipe] = {.present = 1, \ 47bf215546Sopenharmony_ci .vtx = FMT6_##vtxfmt, \ 48bf215546Sopenharmony_ci .tex = FMT6_##texfmt, \ 49bf215546Sopenharmony_ci .rb = FMT6_##rbfmt, \ 50bf215546Sopenharmony_ci .swap = swapfmt} 51bf215546Sopenharmony_ci 52bf215546Sopenharmony_ci/* vertex + texture + color */ 53bf215546Sopenharmony_ci#define VTC(pipe, fmt, swapfmt) FMT(pipe, fmt, fmt, fmt, swapfmt) 54bf215546Sopenharmony_ci 55bf215546Sopenharmony_ci#define _TC(pipe, fmt, swapfmt) FMT(pipe, NONE, fmt, fmt, swapfmt) 56bf215546Sopenharmony_ci#define _T_(pipe, fmt, swapfmt) FMT(pipe, NONE, fmt, NONE, swapfmt) 57bf215546Sopenharmony_ci#define VT_(pipe, fmt, swapfmt) FMT(pipe, fmt, fmt, NONE, swapfmt) 58bf215546Sopenharmony_ci#define V__(pipe, fmt, swapfmt) FMT(pipe, fmt, NONE, NONE, swapfmt) 59bf215546Sopenharmony_ci 60bf215546Sopenharmony_ci/* clang-format off */ 61bf215546Sopenharmony_cistatic const struct fd6_format formats[PIPE_FORMAT_COUNT] = { 62bf215546Sopenharmony_ci /* 8-bit */ 63bf215546Sopenharmony_ci VTC(R8_UNORM, 8_UNORM, WZYX), 64bf215546Sopenharmony_ci VTC(R8_SNORM, 8_SNORM, WZYX), 65bf215546Sopenharmony_ci VTC(R8_UINT, 8_UINT, WZYX), 66bf215546Sopenharmony_ci VTC(R8_SINT, 8_SINT, WZYX), 67bf215546Sopenharmony_ci V__(R8_USCALED, 8_UINT, WZYX), 68bf215546Sopenharmony_ci V__(R8_SSCALED, 8_SINT, WZYX), 69bf215546Sopenharmony_ci _TC(R8_SRGB, 8_UNORM, WZYX), 70bf215546Sopenharmony_ci _TC(Y8_UNORM, NV12_Y, WZYX), 71bf215546Sopenharmony_ci 72bf215546Sopenharmony_ci FMT(A8_UNORM, NONE, 8_UNORM, A8_UNORM, WZYX), 73bf215546Sopenharmony_ci _TC(L8_UNORM, 8_UNORM, WZYX), 74bf215546Sopenharmony_ci _TC(L8_SNORM, 8_SNORM, WZYX), 75bf215546Sopenharmony_ci _T_(I8_UNORM, 8_UNORM, WZYX), 76bf215546Sopenharmony_ci _T_(I8_SNORM, 8_SNORM, WZYX), 77bf215546Sopenharmony_ci 78bf215546Sopenharmony_ci _T_(A8_UINT, 8_UINT, WZYX), 79bf215546Sopenharmony_ci _T_(A8_SINT, 8_SINT, WZYX), 80bf215546Sopenharmony_ci _T_(L8_UINT, 8_UINT, WZYX), 81bf215546Sopenharmony_ci _T_(L8_SINT, 8_SINT, WZYX), 82bf215546Sopenharmony_ci _T_(I8_UINT, 8_UINT, WZYX), 83bf215546Sopenharmony_ci _T_(I8_SINT, 8_SINT, WZYX), 84bf215546Sopenharmony_ci 85bf215546Sopenharmony_ci _TC(S8_UINT, 8_UINT, WZYX), 86bf215546Sopenharmony_ci 87bf215546Sopenharmony_ci /* 16-bit */ 88bf215546Sopenharmony_ci VTC(R16_UNORM, 16_UNORM, WZYX), 89bf215546Sopenharmony_ci VTC(R16_SNORM, 16_SNORM, WZYX), 90bf215546Sopenharmony_ci VTC(R16_UINT, 16_UINT, WZYX), 91bf215546Sopenharmony_ci VTC(R16_SINT, 16_SINT, WZYX), 92bf215546Sopenharmony_ci V__(R16_USCALED, 16_UINT, WZYX), 93bf215546Sopenharmony_ci V__(R16_SSCALED, 16_SINT, WZYX), 94bf215546Sopenharmony_ci VTC(R16_FLOAT, 16_FLOAT, WZYX), 95bf215546Sopenharmony_ci _TC(Z16_UNORM, 16_UNORM, WZYX), 96bf215546Sopenharmony_ci 97bf215546Sopenharmony_ci _T_(A16_UNORM, 16_UNORM, WZYX), 98bf215546Sopenharmony_ci _T_(A16_SNORM, 16_SNORM, WZYX), 99bf215546Sopenharmony_ci _T_(A16_UINT, 16_UINT, WZYX), 100bf215546Sopenharmony_ci _T_(A16_SINT, 16_SINT, WZYX), 101bf215546Sopenharmony_ci _T_(A16_FLOAT, 16_FLOAT, WZYX), 102bf215546Sopenharmony_ci _T_(L16_UNORM, 16_UNORM, WZYX), 103bf215546Sopenharmony_ci _T_(L16_SNORM, 16_SNORM, WZYX), 104bf215546Sopenharmony_ci _T_(L16_UINT, 16_UINT, WZYX), 105bf215546Sopenharmony_ci _T_(L16_SINT, 16_SINT, WZYX), 106bf215546Sopenharmony_ci _T_(L16_FLOAT, 16_FLOAT, WZYX), 107bf215546Sopenharmony_ci _T_(I16_UNORM, 16_UNORM, WZYX), 108bf215546Sopenharmony_ci _T_(I16_SNORM, 16_SNORM, WZYX), 109bf215546Sopenharmony_ci _T_(I16_UINT, 16_UINT, WZYX), 110bf215546Sopenharmony_ci _T_(I16_SINT, 16_SINT, WZYX), 111bf215546Sopenharmony_ci _T_(I16_FLOAT, 16_FLOAT, WZYX), 112bf215546Sopenharmony_ci 113bf215546Sopenharmony_ci VTC(R8G8_UNORM, 8_8_UNORM, WZYX), 114bf215546Sopenharmony_ci VTC(R8G8_SNORM, 8_8_SNORM, WZYX), 115bf215546Sopenharmony_ci VTC(R8G8_UINT, 8_8_UINT, WZYX), 116bf215546Sopenharmony_ci VTC(R8G8_SINT, 8_8_SINT, WZYX), 117bf215546Sopenharmony_ci V__(R8G8_USCALED, 8_8_UINT, WZYX), 118bf215546Sopenharmony_ci V__(R8G8_SSCALED, 8_8_SINT, WZYX), 119bf215546Sopenharmony_ci _TC(R8G8_SRGB, 8_8_UNORM, WZYX), 120bf215546Sopenharmony_ci 121bf215546Sopenharmony_ci _T_(L8A8_UNORM, 8_8_UNORM, WZYX), 122bf215546Sopenharmony_ci _T_(L8A8_UINT, 8_8_UINT, WZYX), 123bf215546Sopenharmony_ci _T_(L8A8_SINT, 8_8_SINT, WZYX), 124bf215546Sopenharmony_ci 125bf215546Sopenharmony_ci _TC(R5G6B5_UNORM, 5_6_5_UNORM, WZYX), 126bf215546Sopenharmony_ci _TC(B5G6R5_UNORM, 5_6_5_UNORM, WXYZ), 127bf215546Sopenharmony_ci 128bf215546Sopenharmony_ci _TC(B5G5R5A1_UNORM, 5_5_5_1_UNORM, WXYZ), 129bf215546Sopenharmony_ci _TC(B5G5R5X1_UNORM, 5_5_5_1_UNORM, WXYZ), 130bf215546Sopenharmony_ci _TC(A1R5G5B5_UNORM, 5_5_5_1_UNORM, ZYXW), 131bf215546Sopenharmony_ci _TC(A1B5G5R5_UNORM, 5_5_5_1_UNORM, XYZW), 132bf215546Sopenharmony_ci 133bf215546Sopenharmony_ci _TC(R4G4B4A4_UNORM, 4_4_4_4_UNORM, WZYX), 134bf215546Sopenharmony_ci _TC(B4G4R4A4_UNORM, 4_4_4_4_UNORM, WXYZ), 135bf215546Sopenharmony_ci _TC(A4R4G4B4_UNORM, 4_4_4_4_UNORM, ZYXW), 136bf215546Sopenharmony_ci _TC(A4B4G4R4_UNORM, 4_4_4_4_UNORM, XYZW), 137bf215546Sopenharmony_ci 138bf215546Sopenharmony_ci /* 24-bit */ 139bf215546Sopenharmony_ci VT_(R8G8B8_UNORM, 8_8_8_UNORM, WZYX), 140bf215546Sopenharmony_ci VT_(R8G8B8_SNORM, 8_8_8_SNORM, WZYX), 141bf215546Sopenharmony_ci VT_(R8G8B8_UINT, 8_8_8_UINT, WZYX), 142bf215546Sopenharmony_ci VT_(R8G8B8_SINT, 8_8_8_SINT, WZYX), 143bf215546Sopenharmony_ci V__(R8G8B8_USCALED, 8_8_8_UINT, WZYX), 144bf215546Sopenharmony_ci V__(R8G8B8_SSCALED, 8_8_8_SINT, WZYX), 145bf215546Sopenharmony_ci 146bf215546Sopenharmony_ci /* 32-bit */ 147bf215546Sopenharmony_ci V__(R32_UNORM, 32_UNORM, WZYX), 148bf215546Sopenharmony_ci V__(R32_SNORM, 32_SNORM, WZYX), 149bf215546Sopenharmony_ci VTC(R32_UINT, 32_UINT, WZYX), 150bf215546Sopenharmony_ci VTC(R32_SINT, 32_SINT, WZYX), 151bf215546Sopenharmony_ci V__(R32_USCALED, 32_UINT, WZYX), 152bf215546Sopenharmony_ci V__(R32_SSCALED, 32_SINT, WZYX), 153bf215546Sopenharmony_ci VTC(R32_FLOAT, 32_FLOAT, WZYX), 154bf215546Sopenharmony_ci V__(R32_FIXED, 32_FIXED, WZYX), 155bf215546Sopenharmony_ci 156bf215546Sopenharmony_ci _T_(A32_UINT, 32_UINT, WZYX), 157bf215546Sopenharmony_ci _T_(A32_SINT, 32_SINT, WZYX), 158bf215546Sopenharmony_ci _T_(A32_FLOAT, 32_FLOAT, WZYX), 159bf215546Sopenharmony_ci _T_(L32_UINT, 32_UINT, WZYX), 160bf215546Sopenharmony_ci _T_(L32_SINT, 32_SINT, WZYX), 161bf215546Sopenharmony_ci _T_(L32_FLOAT, 32_FLOAT, WZYX), 162bf215546Sopenharmony_ci _T_(I32_UINT, 32_UINT, WZYX), 163bf215546Sopenharmony_ci _T_(I32_SINT, 32_SINT, WZYX), 164bf215546Sopenharmony_ci _T_(I32_FLOAT, 32_FLOAT, WZYX), 165bf215546Sopenharmony_ci 166bf215546Sopenharmony_ci VTC(R16G16_UNORM, 16_16_UNORM, WZYX), 167bf215546Sopenharmony_ci VTC(R16G16_SNORM, 16_16_SNORM, WZYX), 168bf215546Sopenharmony_ci VTC(R16G16_UINT, 16_16_UINT, WZYX), 169bf215546Sopenharmony_ci VTC(R16G16_SINT, 16_16_SINT, WZYX), 170bf215546Sopenharmony_ci V__(R16G16_USCALED, 16_16_UINT, WZYX), 171bf215546Sopenharmony_ci V__(R16G16_SSCALED, 16_16_SINT, WZYX), 172bf215546Sopenharmony_ci VTC(R16G16_FLOAT, 16_16_FLOAT, WZYX), 173bf215546Sopenharmony_ci 174bf215546Sopenharmony_ci _T_(L16A16_UNORM, 16_16_UNORM, WZYX), 175bf215546Sopenharmony_ci _T_(L16A16_SNORM, 16_16_SNORM, WZYX), 176bf215546Sopenharmony_ci _T_(L16A16_UINT, 16_16_UINT, WZYX), 177bf215546Sopenharmony_ci _T_(L16A16_SINT, 16_16_SINT, WZYX), 178bf215546Sopenharmony_ci _T_(L16A16_FLOAT, 16_16_FLOAT, WZYX), 179bf215546Sopenharmony_ci 180bf215546Sopenharmony_ci VTC(R8G8B8A8_UNORM, 8_8_8_8_UNORM, WZYX), 181bf215546Sopenharmony_ci _TC(R8G8B8X8_UNORM, 8_8_8_8_UNORM, WZYX), 182bf215546Sopenharmony_ci _TC(R8G8B8A8_SRGB, 8_8_8_8_UNORM, WZYX), 183bf215546Sopenharmony_ci _TC(R8G8B8X8_SRGB, 8_8_8_8_UNORM, WZYX), 184bf215546Sopenharmony_ci VTC(R8G8B8A8_SNORM, 8_8_8_8_SNORM, WZYX), 185bf215546Sopenharmony_ci VTC(R8G8B8A8_UINT, 8_8_8_8_UINT, WZYX), 186bf215546Sopenharmony_ci VTC(R8G8B8A8_SINT, 8_8_8_8_SINT, WZYX), 187bf215546Sopenharmony_ci V__(R8G8B8A8_USCALED, 8_8_8_8_UINT, WZYX), 188bf215546Sopenharmony_ci V__(R8G8B8A8_SSCALED, 8_8_8_8_SINT, WZYX), 189bf215546Sopenharmony_ci 190bf215546Sopenharmony_ci VTC(B8G8R8A8_UNORM, 8_8_8_8_UNORM, WXYZ), 191bf215546Sopenharmony_ci _TC(B8G8R8X8_UNORM, 8_8_8_8_UNORM, WXYZ), 192bf215546Sopenharmony_ci _TC(B8G8R8A8_SRGB, 8_8_8_8_UNORM, WXYZ), 193bf215546Sopenharmony_ci _TC(B8G8R8X8_SRGB, 8_8_8_8_UNORM, WXYZ), 194bf215546Sopenharmony_ci VTC(B8G8R8A8_SNORM, 8_8_8_8_SNORM, WXYZ), 195bf215546Sopenharmony_ci VTC(B8G8R8A8_UINT, 8_8_8_8_UINT, WXYZ), 196bf215546Sopenharmony_ci VTC(B8G8R8A8_SINT, 8_8_8_8_SINT, WXYZ), 197bf215546Sopenharmony_ci V__(B8G8R8A8_USCALED, 8_8_8_8_UINT, WXYZ), 198bf215546Sopenharmony_ci V__(B8G8R8A8_SSCALED, 8_8_8_8_SINT, WXYZ), 199bf215546Sopenharmony_ci 200bf215546Sopenharmony_ci VTC(A8B8G8R8_UNORM, 8_8_8_8_UNORM, XYZW), 201bf215546Sopenharmony_ci _TC(X8B8G8R8_UNORM, 8_8_8_8_UNORM, XYZW), 202bf215546Sopenharmony_ci _TC(A8B8G8R8_SRGB, 8_8_8_8_UNORM, XYZW), 203bf215546Sopenharmony_ci _TC(X8B8G8R8_SRGB, 8_8_8_8_UNORM, XYZW), 204bf215546Sopenharmony_ci 205bf215546Sopenharmony_ci VTC(A8R8G8B8_UNORM, 8_8_8_8_UNORM, ZYXW), 206bf215546Sopenharmony_ci _TC(X8R8G8B8_UNORM, 8_8_8_8_UNORM, ZYXW), 207bf215546Sopenharmony_ci _TC(A8R8G8B8_SRGB, 8_8_8_8_UNORM, ZYXW), 208bf215546Sopenharmony_ci _TC(X8R8G8B8_SRGB, 8_8_8_8_UNORM, ZYXW), 209bf215546Sopenharmony_ci 210bf215546Sopenharmony_ci FMT(R10G10B10A2_UNORM, 10_10_10_2_UNORM, 10_10_10_2_UNORM, 10_10_10_2_UNORM_DEST, WZYX), 211bf215546Sopenharmony_ci FMT(B10G10R10A2_UNORM, 10_10_10_2_UNORM, 10_10_10_2_UNORM, 10_10_10_2_UNORM_DEST, WXYZ), 212bf215546Sopenharmony_ci FMT(B10G10R10X2_UNORM, NONE, 10_10_10_2_UNORM, 10_10_10_2_UNORM_DEST, WXYZ), 213bf215546Sopenharmony_ci V__(R10G10B10A2_SNORM, 10_10_10_2_SNORM, WZYX), 214bf215546Sopenharmony_ci V__(B10G10R10A2_SNORM, 10_10_10_2_SNORM, WXYZ), 215bf215546Sopenharmony_ci VTC(R10G10B10A2_UINT, 10_10_10_2_UINT, WZYX), 216bf215546Sopenharmony_ci V__(R10G10B10A2_SINT, 10_10_10_2_SINT, WZYX), 217bf215546Sopenharmony_ci VTC(B10G10R10A2_UINT, 10_10_10_2_UINT, WXYZ), 218bf215546Sopenharmony_ci V__(B10G10R10A2_SINT, 10_10_10_2_SINT, WXYZ), 219bf215546Sopenharmony_ci V__(R10G10B10A2_USCALED, 10_10_10_2_UINT, WZYX), 220bf215546Sopenharmony_ci V__(B10G10R10A2_USCALED, 10_10_10_2_UINT, WXYZ), 221bf215546Sopenharmony_ci V__(R10G10B10A2_SSCALED, 10_10_10_2_SINT, WZYX), 222bf215546Sopenharmony_ci V__(B10G10R10A2_SSCALED, 10_10_10_2_SINT, WXYZ), 223bf215546Sopenharmony_ci 224bf215546Sopenharmony_ci VTC(R11G11B10_FLOAT, 11_11_10_FLOAT, WZYX), 225bf215546Sopenharmony_ci _T_(R9G9B9E5_FLOAT, 9_9_9_E5_FLOAT, WZYX), 226bf215546Sopenharmony_ci 227bf215546Sopenharmony_ci _TC(Z24X8_UNORM, Z24_UNORM_S8_UINT, WZYX), 228bf215546Sopenharmony_ci _TC(X24S8_UINT, 8_8_8_8_UINT, WZYX), 229bf215546Sopenharmony_ci _TC(Z24_UNORM_S8_UINT, Z24_UNORM_S8_UINT, WZYX), 230bf215546Sopenharmony_ci _TC(Z32_FLOAT, 32_FLOAT, WZYX), 231bf215546Sopenharmony_ci _TC(Z32_FLOAT_S8X24_UINT, 32_FLOAT, WZYX), 232bf215546Sopenharmony_ci _TC(X32_S8X24_UINT, 8_UINT, WZYX), 233bf215546Sopenharmony_ci 234bf215546Sopenharmony_ci /* special format for blits: */ 235bf215546Sopenharmony_ci _TC(Z24_UNORM_S8_UINT_AS_R8G8B8A8, Z24_UNORM_S8_UINT_AS_R8G8B8A8, WZYX), 236bf215546Sopenharmony_ci 237bf215546Sopenharmony_ci /* 48-bit */ 238bf215546Sopenharmony_ci VT_(R16G16B16_UNORM, 16_16_16_UNORM, WZYX), 239bf215546Sopenharmony_ci VT_(R16G16B16_SNORM, 16_16_16_SNORM, WZYX), 240bf215546Sopenharmony_ci VT_(R16G16B16_UINT, 16_16_16_UINT, WZYX), 241bf215546Sopenharmony_ci VT_(R16G16B16_SINT, 16_16_16_SINT, WZYX), 242bf215546Sopenharmony_ci V__(R16G16B16_USCALED, 16_16_16_UINT, WZYX), 243bf215546Sopenharmony_ci V__(R16G16B16_SSCALED, 16_16_16_SINT, WZYX), 244bf215546Sopenharmony_ci VT_(R16G16B16_FLOAT, 16_16_16_FLOAT, WZYX), 245bf215546Sopenharmony_ci 246bf215546Sopenharmony_ci /* 64-bit */ 247bf215546Sopenharmony_ci VTC(R16G16B16A16_UNORM, 16_16_16_16_UNORM, WZYX), 248bf215546Sopenharmony_ci VTC(R16G16B16X16_UNORM, 16_16_16_16_UNORM, WZYX), 249bf215546Sopenharmony_ci VTC(R16G16B16A16_SNORM, 16_16_16_16_SNORM, WZYX), 250bf215546Sopenharmony_ci VTC(R16G16B16X16_SNORM, 16_16_16_16_SNORM, WZYX), 251bf215546Sopenharmony_ci VTC(R16G16B16A16_UINT, 16_16_16_16_UINT, WZYX), 252bf215546Sopenharmony_ci VTC(R16G16B16X16_UINT, 16_16_16_16_UINT, WZYX), 253bf215546Sopenharmony_ci VTC(R16G16B16A16_SINT, 16_16_16_16_SINT, WZYX), 254bf215546Sopenharmony_ci VTC(R16G16B16X16_SINT, 16_16_16_16_SINT, WZYX), 255bf215546Sopenharmony_ci V__(R16G16B16A16_USCALED, 16_16_16_16_UINT, WZYX), 256bf215546Sopenharmony_ci V__(R16G16B16A16_SSCALED, 16_16_16_16_SINT, WZYX), 257bf215546Sopenharmony_ci VTC(R16G16B16A16_FLOAT, 16_16_16_16_FLOAT, WZYX), 258bf215546Sopenharmony_ci VTC(R16G16B16X16_FLOAT, 16_16_16_16_FLOAT, WZYX), 259bf215546Sopenharmony_ci 260bf215546Sopenharmony_ci V__(R32G32_UNORM, 32_32_UNORM, WZYX), 261bf215546Sopenharmony_ci V__(R32G32_SNORM, 32_32_SNORM, WZYX), 262bf215546Sopenharmony_ci VTC(R32G32_UINT, 32_32_UINT, WZYX), 263bf215546Sopenharmony_ci VTC(R32G32_SINT, 32_32_SINT, WZYX), 264bf215546Sopenharmony_ci V__(R32G32_USCALED, 32_32_UINT, WZYX), 265bf215546Sopenharmony_ci V__(R32G32_SSCALED, 32_32_SINT, WZYX), 266bf215546Sopenharmony_ci VTC(R32G32_FLOAT, 32_32_FLOAT, WZYX), 267bf215546Sopenharmony_ci V__(R32G32_FIXED, 32_32_FIXED, WZYX), 268bf215546Sopenharmony_ci 269bf215546Sopenharmony_ci _T_(L32A32_UINT, 32_32_UINT, WZYX), 270bf215546Sopenharmony_ci _T_(L32A32_SINT, 32_32_SINT, WZYX), 271bf215546Sopenharmony_ci _T_(L32A32_FLOAT, 32_32_FLOAT, WZYX), 272bf215546Sopenharmony_ci 273bf215546Sopenharmony_ci /* 96-bit */ 274bf215546Sopenharmony_ci V__(R32G32B32_UNORM, 32_32_32_UNORM, WZYX), 275bf215546Sopenharmony_ci V__(R32G32B32_SNORM, 32_32_32_SNORM, WZYX), 276bf215546Sopenharmony_ci VT_(R32G32B32_UINT, 32_32_32_UINT, WZYX), 277bf215546Sopenharmony_ci VT_(R32G32B32_SINT, 32_32_32_SINT, WZYX), 278bf215546Sopenharmony_ci V__(R32G32B32_USCALED, 32_32_32_UINT, WZYX), 279bf215546Sopenharmony_ci V__(R32G32B32_SSCALED, 32_32_32_SINT, WZYX), 280bf215546Sopenharmony_ci VT_(R32G32B32_FLOAT, 32_32_32_FLOAT, WZYX), 281bf215546Sopenharmony_ci V__(R32G32B32_FIXED, 32_32_32_FIXED, WZYX), 282bf215546Sopenharmony_ci 283bf215546Sopenharmony_ci /* 128-bit */ 284bf215546Sopenharmony_ci V__(R32G32B32A32_UNORM, 32_32_32_32_UNORM, WZYX), 285bf215546Sopenharmony_ci V__(R32G32B32A32_SNORM, 32_32_32_32_SNORM, WZYX), 286bf215546Sopenharmony_ci VTC(R32G32B32A32_UINT, 32_32_32_32_UINT, WZYX), 287bf215546Sopenharmony_ci _TC(R32G32B32X32_UINT, 32_32_32_32_UINT, WZYX), 288bf215546Sopenharmony_ci VTC(R32G32B32A32_SINT, 32_32_32_32_SINT, WZYX), 289bf215546Sopenharmony_ci _TC(R32G32B32X32_SINT, 32_32_32_32_SINT, WZYX), 290bf215546Sopenharmony_ci V__(R32G32B32A32_USCALED, 32_32_32_32_UINT, WZYX), 291bf215546Sopenharmony_ci V__(R32G32B32A32_SSCALED, 32_32_32_32_SINT, WZYX), 292bf215546Sopenharmony_ci VTC(R32G32B32A32_FLOAT, 32_32_32_32_FLOAT, WZYX), 293bf215546Sopenharmony_ci _TC(R32G32B32X32_FLOAT, 32_32_32_32_FLOAT, WZYX), 294bf215546Sopenharmony_ci V__(R32G32B32A32_FIXED, 32_32_32_32_FIXED, WZYX), 295bf215546Sopenharmony_ci 296bf215546Sopenharmony_ci /* compressed */ 297bf215546Sopenharmony_ci _T_(ETC1_RGB8, ETC1, WZYX), 298bf215546Sopenharmony_ci _T_(ETC2_RGB8, ETC2_RGB8, WZYX), 299bf215546Sopenharmony_ci _T_(ETC2_SRGB8, ETC2_RGB8, WZYX), 300bf215546Sopenharmony_ci _T_(ETC2_RGB8A1, ETC2_RGB8A1, WZYX), 301bf215546Sopenharmony_ci _T_(ETC2_SRGB8A1, ETC2_RGB8A1, WZYX), 302bf215546Sopenharmony_ci _T_(ETC2_RGBA8, ETC2_RGBA8, WZYX), 303bf215546Sopenharmony_ci _T_(ETC2_SRGBA8, ETC2_RGBA8, WZYX), 304bf215546Sopenharmony_ci _T_(ETC2_R11_UNORM, ETC2_R11_UNORM, WZYX), 305bf215546Sopenharmony_ci _T_(ETC2_R11_SNORM, ETC2_R11_SNORM, WZYX), 306bf215546Sopenharmony_ci _T_(ETC2_RG11_UNORM, ETC2_RG11_UNORM, WZYX), 307bf215546Sopenharmony_ci _T_(ETC2_RG11_SNORM, ETC2_RG11_SNORM, WZYX), 308bf215546Sopenharmony_ci 309bf215546Sopenharmony_ci _T_(DXT1_RGB, DXT1, WZYX), 310bf215546Sopenharmony_ci _T_(DXT1_SRGB, DXT1, WZYX), 311bf215546Sopenharmony_ci _T_(DXT1_RGBA, DXT1, WZYX), 312bf215546Sopenharmony_ci _T_(DXT1_SRGBA, DXT1, WZYX), 313bf215546Sopenharmony_ci _T_(DXT3_RGBA, DXT3, WZYX), 314bf215546Sopenharmony_ci _T_(DXT3_SRGBA, DXT3, WZYX), 315bf215546Sopenharmony_ci _T_(DXT5_RGBA, DXT5, WZYX), 316bf215546Sopenharmony_ci _T_(DXT5_SRGBA, DXT5, WZYX), 317bf215546Sopenharmony_ci 318bf215546Sopenharmony_ci _T_(BPTC_RGBA_UNORM, BPTC, WZYX), 319bf215546Sopenharmony_ci _T_(BPTC_SRGBA, BPTC, WZYX), 320bf215546Sopenharmony_ci _T_(BPTC_RGB_FLOAT, BPTC_FLOAT, WZYX), 321bf215546Sopenharmony_ci _T_(BPTC_RGB_UFLOAT, BPTC_UFLOAT, WZYX), 322bf215546Sopenharmony_ci 323bf215546Sopenharmony_ci _T_(RGTC1_UNORM, RGTC1_UNORM, WZYX), 324bf215546Sopenharmony_ci _T_(RGTC1_SNORM, RGTC1_SNORM, WZYX), 325bf215546Sopenharmony_ci _T_(RGTC2_UNORM, RGTC2_UNORM, WZYX), 326bf215546Sopenharmony_ci _T_(RGTC2_SNORM, RGTC2_SNORM, WZYX), 327bf215546Sopenharmony_ci _T_(LATC1_UNORM, RGTC1_UNORM, WZYX), 328bf215546Sopenharmony_ci _T_(LATC1_SNORM, RGTC1_SNORM, WZYX), 329bf215546Sopenharmony_ci _T_(LATC2_UNORM, RGTC2_UNORM, WZYX), 330bf215546Sopenharmony_ci _T_(LATC2_SNORM, RGTC2_SNORM, WZYX), 331bf215546Sopenharmony_ci 332bf215546Sopenharmony_ci _T_(ASTC_4x4, ASTC_4x4, WZYX), 333bf215546Sopenharmony_ci _T_(ASTC_5x4, ASTC_5x4, WZYX), 334bf215546Sopenharmony_ci _T_(ASTC_5x5, ASTC_5x5, WZYX), 335bf215546Sopenharmony_ci _T_(ASTC_6x5, ASTC_6x5, WZYX), 336bf215546Sopenharmony_ci _T_(ASTC_6x6, ASTC_6x6, WZYX), 337bf215546Sopenharmony_ci _T_(ASTC_8x5, ASTC_8x5, WZYX), 338bf215546Sopenharmony_ci _T_(ASTC_8x6, ASTC_8x6, WZYX), 339bf215546Sopenharmony_ci _T_(ASTC_8x8, ASTC_8x8, WZYX), 340bf215546Sopenharmony_ci _T_(ASTC_10x5, ASTC_10x5, WZYX), 341bf215546Sopenharmony_ci _T_(ASTC_10x6, ASTC_10x6, WZYX), 342bf215546Sopenharmony_ci _T_(ASTC_10x8, ASTC_10x8, WZYX), 343bf215546Sopenharmony_ci _T_(ASTC_10x10, ASTC_10x10, WZYX), 344bf215546Sopenharmony_ci _T_(ASTC_12x10, ASTC_12x10, WZYX), 345bf215546Sopenharmony_ci _T_(ASTC_12x12, ASTC_12x12, WZYX), 346bf215546Sopenharmony_ci 347bf215546Sopenharmony_ci _T_(ASTC_4x4_SRGB, ASTC_4x4, WZYX), 348bf215546Sopenharmony_ci _T_(ASTC_5x4_SRGB, ASTC_5x4, WZYX), 349bf215546Sopenharmony_ci _T_(ASTC_5x5_SRGB, ASTC_5x5, WZYX), 350bf215546Sopenharmony_ci _T_(ASTC_6x5_SRGB, ASTC_6x5, WZYX), 351bf215546Sopenharmony_ci _T_(ASTC_6x6_SRGB, ASTC_6x6, WZYX), 352bf215546Sopenharmony_ci _T_(ASTC_8x5_SRGB, ASTC_8x5, WZYX), 353bf215546Sopenharmony_ci _T_(ASTC_8x6_SRGB, ASTC_8x6, WZYX), 354bf215546Sopenharmony_ci _T_(ASTC_8x8_SRGB, ASTC_8x8, WZYX), 355bf215546Sopenharmony_ci _T_(ASTC_10x5_SRGB, ASTC_10x5, WZYX), 356bf215546Sopenharmony_ci _T_(ASTC_10x6_SRGB, ASTC_10x6, WZYX), 357bf215546Sopenharmony_ci _T_(ASTC_10x8_SRGB, ASTC_10x8, WZYX), 358bf215546Sopenharmony_ci _T_(ASTC_10x10_SRGB, ASTC_10x10, WZYX), 359bf215546Sopenharmony_ci _T_(ASTC_12x10_SRGB, ASTC_12x10, WZYX), 360bf215546Sopenharmony_ci _T_(ASTC_12x12_SRGB, ASTC_12x12, WZYX), 361bf215546Sopenharmony_ci 362bf215546Sopenharmony_ci _T_(R8G8_R8B8_UNORM, R8G8R8B8_422_UNORM, WZYX), /* YUYV */ 363bf215546Sopenharmony_ci _T_(G8R8_B8R8_UNORM, G8R8B8R8_422_UNORM, WZYX), /* UYVY */ 364bf215546Sopenharmony_ci 365bf215546Sopenharmony_ci _T_(R8_G8B8_420_UNORM, R8_G8B8_2PLANE_420_UNORM, WZYX), /* Gallium NV12 */ 366bf215546Sopenharmony_ci _T_(G8_B8R8_420_UNORM, R8_G8B8_2PLANE_420_UNORM, WZYX), /* Vulkan NV12 */ 367bf215546Sopenharmony_ci _T_(G8_B8_R8_420_UNORM, R8_G8_B8_3PLANE_420_UNORM, WZYX), 368bf215546Sopenharmony_ci}; 369bf215546Sopenharmony_ci/* clang-format on */ 370bf215546Sopenharmony_ci 371bf215546Sopenharmony_cistatic enum a3xx_color_swap 372bf215546Sopenharmony_cifd6_pipe2swap(enum pipe_format format, enum a6xx_tile_mode tile_mode) 373bf215546Sopenharmony_ci{ 374bf215546Sopenharmony_ci if (!formats[format].present) 375bf215546Sopenharmony_ci return WZYX; 376bf215546Sopenharmony_ci 377bf215546Sopenharmony_ci /* It seems CCU ignores swap and always uses WZYX when tiled. TP, on the 378bf215546Sopenharmony_ci * other hand, always respects swap. We should return WZYX such that CCU 379bf215546Sopenharmony_ci * and TP agree each other. 380bf215546Sopenharmony_ci */ 381bf215546Sopenharmony_ci if (tile_mode) 382bf215546Sopenharmony_ci return WZYX; 383bf215546Sopenharmony_ci 384bf215546Sopenharmony_ci return formats[format].swap; 385bf215546Sopenharmony_ci} 386bf215546Sopenharmony_ci 387bf215546Sopenharmony_ci/* convert pipe format to vertex buffer format: */ 388bf215546Sopenharmony_cienum a6xx_format 389bf215546Sopenharmony_cifd6_vertex_format(enum pipe_format format) 390bf215546Sopenharmony_ci{ 391bf215546Sopenharmony_ci if (!formats[format].present) 392bf215546Sopenharmony_ci return FMT6_NONE; 393bf215546Sopenharmony_ci return formats[format].vtx; 394bf215546Sopenharmony_ci} 395bf215546Sopenharmony_ci 396bf215546Sopenharmony_cienum a3xx_color_swap 397bf215546Sopenharmony_cifd6_vertex_swap(enum pipe_format format) 398bf215546Sopenharmony_ci{ 399bf215546Sopenharmony_ci return fd6_pipe2swap(format, TILE6_LINEAR); 400bf215546Sopenharmony_ci} 401bf215546Sopenharmony_ci 402bf215546Sopenharmony_ci/* convert pipe format to texture sampler format: */ 403bf215546Sopenharmony_cienum a6xx_format 404bf215546Sopenharmony_cifd6_texture_format(enum pipe_format format, enum a6xx_tile_mode tile_mode) 405bf215546Sopenharmony_ci{ 406bf215546Sopenharmony_ci if (!formats[format].present) 407bf215546Sopenharmony_ci return FMT6_NONE; 408bf215546Sopenharmony_ci 409bf215546Sopenharmony_ci if (!tile_mode) { 410bf215546Sopenharmony_ci switch (format) { 411bf215546Sopenharmony_ci /* Linear ARGB/ABGR1555 has a special format for sampling (tiled 412bf215546Sopenharmony_ci * 1555/5551 formats always have the same swizzle and layout). 413bf215546Sopenharmony_ci */ 414bf215546Sopenharmony_ci case PIPE_FORMAT_A1R5G5B5_UNORM: 415bf215546Sopenharmony_ci case PIPE_FORMAT_A1B5G5R5_UNORM: 416bf215546Sopenharmony_ci return FMT6_1_5_5_5_UNORM; 417bf215546Sopenharmony_ci /* note: this may be more about UBWC than tiling, but we don't support 418bf215546Sopenharmony_ci * tiled non-UBWC NV12 419bf215546Sopenharmony_ci */ 420bf215546Sopenharmony_ci case PIPE_FORMAT_Y8_UNORM: 421bf215546Sopenharmony_ci return FMT6_8_UNORM; 422bf215546Sopenharmony_ci default: 423bf215546Sopenharmony_ci break; 424bf215546Sopenharmony_ci } 425bf215546Sopenharmony_ci } 426bf215546Sopenharmony_ci 427bf215546Sopenharmony_ci return formats[format].tex; 428bf215546Sopenharmony_ci} 429bf215546Sopenharmony_ci 430bf215546Sopenharmony_cienum a3xx_color_swap 431bf215546Sopenharmony_cifd6_texture_swap(enum pipe_format format, enum a6xx_tile_mode tile_mode) 432bf215546Sopenharmony_ci{ 433bf215546Sopenharmony_ci if (!tile_mode) { 434bf215546Sopenharmony_ci switch (format) { 435bf215546Sopenharmony_ci case PIPE_FORMAT_A1R5G5B5_UNORM: 436bf215546Sopenharmony_ci return WZYX; 437bf215546Sopenharmony_ci case PIPE_FORMAT_A1B5G5R5_UNORM: 438bf215546Sopenharmony_ci return WXYZ; 439bf215546Sopenharmony_ci default: 440bf215546Sopenharmony_ci break; 441bf215546Sopenharmony_ci } 442bf215546Sopenharmony_ci } 443bf215546Sopenharmony_ci 444bf215546Sopenharmony_ci /* format is PIPE_FORMAT_X24S8_UINT when texturing the stencil aspect of 445bf215546Sopenharmony_ci * PIPE_FORMAT_Z24_UNORM_S8_UINT. Because we map the format to 446bf215546Sopenharmony_ci * FMT6_8_8_8_8_UINT, return XYZW such that the stencil value is in X 447bf215546Sopenharmony_ci * component. 448bf215546Sopenharmony_ci * 449bf215546Sopenharmony_ci * We used to return WZYX and apply swizzles. That required us to 450bf215546Sopenharmony_ci * un-swizzle the user-specified border color, which could not be done for 451bf215546Sopenharmony_ci * turnip. 452bf215546Sopenharmony_ci */ 453bf215546Sopenharmony_ci if (format == PIPE_FORMAT_X24S8_UINT) 454bf215546Sopenharmony_ci return XYZW; 455bf215546Sopenharmony_ci 456bf215546Sopenharmony_ci return fd6_pipe2swap(format, tile_mode); 457bf215546Sopenharmony_ci} 458bf215546Sopenharmony_ci 459bf215546Sopenharmony_ci/* convert pipe format to MRT / copydest format used for render-target: */ 460bf215546Sopenharmony_cienum a6xx_format 461bf215546Sopenharmony_cifd6_color_format(enum pipe_format format, enum a6xx_tile_mode tile_mode) 462bf215546Sopenharmony_ci{ 463bf215546Sopenharmony_ci if (!formats[format].present) 464bf215546Sopenharmony_ci return FMT6_NONE; 465bf215546Sopenharmony_ci 466bf215546Sopenharmony_ci if (!tile_mode && format == PIPE_FORMAT_Y8_UNORM) 467bf215546Sopenharmony_ci return FMT6_8_UNORM; 468bf215546Sopenharmony_ci 469bf215546Sopenharmony_ci return formats[format].rb; 470bf215546Sopenharmony_ci} 471bf215546Sopenharmony_ci 472bf215546Sopenharmony_cienum a3xx_color_swap 473bf215546Sopenharmony_cifd6_color_swap(enum pipe_format format, enum a6xx_tile_mode tile_mode) 474bf215546Sopenharmony_ci{ 475bf215546Sopenharmony_ci return fd6_pipe2swap(format, tile_mode); 476bf215546Sopenharmony_ci} 477bf215546Sopenharmony_ci 478bf215546Sopenharmony_cienum a6xx_depth_format 479bf215546Sopenharmony_cifd6_pipe2depth(enum pipe_format format) 480bf215546Sopenharmony_ci{ 481bf215546Sopenharmony_ci switch (format) { 482bf215546Sopenharmony_ci case PIPE_FORMAT_Z16_UNORM: 483bf215546Sopenharmony_ci return DEPTH6_16; 484bf215546Sopenharmony_ci case PIPE_FORMAT_Z24X8_UNORM: 485bf215546Sopenharmony_ci case PIPE_FORMAT_Z24_UNORM_S8_UINT: 486bf215546Sopenharmony_ci case PIPE_FORMAT_X8Z24_UNORM: 487bf215546Sopenharmony_ci case PIPE_FORMAT_S8_UINT_Z24_UNORM: 488bf215546Sopenharmony_ci return DEPTH6_24_8; 489bf215546Sopenharmony_ci case PIPE_FORMAT_Z32_FLOAT: 490bf215546Sopenharmony_ci case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 491bf215546Sopenharmony_ci return DEPTH6_32; 492bf215546Sopenharmony_ci default: 493bf215546Sopenharmony_ci return ~0; 494bf215546Sopenharmony_ci } 495bf215546Sopenharmony_ci} 496