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