fad0f8976ef84b0cb6d3b93c9dae7d85ddf58955
[mesa.git] / src / gallium / drivers / lima / lima_format.c
1 /*
2 * Copyright (c) 2011-2013 Luc Verhaegen <libv@skynet.be>
3 * Copyright (c) 2018-2019 Lima Project
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 */
25
26 #include <stdint.h>
27 #include <stdlib.h>
28
29 #include <util/macros.h>
30
31 #include "lima_format.h"
32
33 #define LIMA_TEXEL_FORMAT_L8 0x09
34 #define LIMA_TEXEL_FORMAT_A8 0x0a
35 #define LIMA_TEXEL_FORMAT_I8 0x0b
36 #define LIMA_TEXEL_FORMAT_BGR_565 0x0e
37 #define LIMA_TEXEL_FORMAT_BGRA_5551 0x0f
38 #define LIMA_TEXEL_FORMAT_BGRA_4444 0x10
39 #define LIMA_TEXEL_FORMAT_L8A8 0x11
40 #define LIMA_TEXEL_FORMAT_L16 0x12
41 #define LIMA_TEXEL_FORMAT_A16 0x13
42 #define LIMA_TEXEL_FORMAT_I16 0x14
43 #define LIMA_TEXEL_FORMAT_RGB_888 0x15
44 #define LIMA_TEXEL_FORMAT_RGBA_8888 0x16
45 #define LIMA_TEXEL_FORMAT_RGBX_8888 0x17
46 #define LIMA_TEXEL_FORMAT_ETC1_RGB8 0x20
47 #define LIMA_TEXEL_FORMAT_Z24X8 0x2c
48 /* This format is only used for depth/stencil reload */
49 #define LIMA_TEXEL_FORMAT_Z24S8_RLD 0x32
50
51 #define LIMA_PIXEL_FORMAT_B5G6R5 0x00
52 #define LIMA_PIXEL_FORMAT_B5G5R5A1 0x01
53 #define LIMA_PIXEL_FORMAT_B4G4R4A4 0x02
54 #define LIMA_PIXEL_FORMAT_B8G8R8A8 0x03
55 #define LIMA_PIXEL_FORMAT_Z16 0x0e
56 #define LIMA_PIXEL_FORMAT_Z24S8 0x0f
57
58 struct lima_format {
59 bool present;
60 int format;
61 bool swap_r_b;
62 uint32_t channel_layout;
63 };
64
65 #define LIMA_TEXEL_FORMAT(pipe, tex, swap) \
66 [PIPE_FORMAT_##pipe] = { \
67 .present = true, .format = LIMA_TEXEL_FORMAT_##tex, \
68 .swap_r_b = swap \
69 }
70
71 #define LIMA_PIXEL_FORMAT(pipe, pix, swap, ch_layout) \
72 [PIPE_FORMAT_##pipe] = { \
73 .present = true, .format = LIMA_PIXEL_FORMAT_##pix, \
74 .swap_r_b = swap, .channel_layout = ch_layout \
75 }
76
77 static const struct lima_format lima_texel_formats[] = {
78 LIMA_TEXEL_FORMAT(R8G8B8A8_UNORM, RGBA_8888, true),
79 LIMA_TEXEL_FORMAT(B8G8R8A8_UNORM, RGBA_8888, false),
80 LIMA_TEXEL_FORMAT(R8G8B8A8_SRGB, RGBA_8888, true),
81 LIMA_TEXEL_FORMAT(B8G8R8A8_SRGB, RGBA_8888, false),
82 LIMA_TEXEL_FORMAT(R8G8B8X8_UNORM, RGBX_8888, true),
83 LIMA_TEXEL_FORMAT(B8G8R8X8_UNORM, RGBX_8888, false),
84 LIMA_TEXEL_FORMAT(B5G6R5_UNORM, BGR_565, false),
85 LIMA_TEXEL_FORMAT(B5G5R5A1_UNORM, BGRA_5551, false),
86 LIMA_TEXEL_FORMAT(B4G4R4A4_UNORM, BGRA_4444, false),
87 LIMA_TEXEL_FORMAT(Z24_UNORM_S8_UINT, Z24X8, false),
88 LIMA_TEXEL_FORMAT(Z24X8_UNORM, Z24X8, false),
89 LIMA_TEXEL_FORMAT(L16_UNORM, L16, false),
90 LIMA_TEXEL_FORMAT(L8_UNORM, L8, false),
91 LIMA_TEXEL_FORMAT(A16_UNORM, A16, false),
92 LIMA_TEXEL_FORMAT(A8_UNORM, A8, false),
93 LIMA_TEXEL_FORMAT(I16_UNORM, I16, false),
94 LIMA_TEXEL_FORMAT(I8_UNORM, I8, false),
95 LIMA_TEXEL_FORMAT(L8A8_UNORM, L8A8, false),
96 LIMA_TEXEL_FORMAT(ETC1_RGB8, ETC1_RGB8, false),
97 };
98
99 static const struct lima_format lima_pixel_formats[] = {
100 LIMA_PIXEL_FORMAT(R8G8B8A8_UNORM, B8G8R8A8, true, 0x8888),
101 LIMA_PIXEL_FORMAT(B8G8R8A8_UNORM, B8G8R8A8, false, 0x8888),
102 LIMA_PIXEL_FORMAT(R8G8B8A8_SRGB, B8G8R8A8, true, 0x8888),
103 LIMA_PIXEL_FORMAT(B8G8R8A8_SRGB, B8G8R8A8, false, 0x8888),
104 LIMA_PIXEL_FORMAT(R8G8B8X8_UNORM, B8G8R8A8, true, 0x8888),
105 LIMA_PIXEL_FORMAT(B8G8R8X8_UNORM, B8G8R8A8, false, 0x8888),
106 LIMA_PIXEL_FORMAT(B5G6R5_UNORM, B5G6R5, false, 0x8565),
107 LIMA_PIXEL_FORMAT(B5G5R5A1_UNORM, B5G5R5A1, false, 0x8565),
108 LIMA_PIXEL_FORMAT(B4G4R4A4_UNORM, B4G4R4A4, false, 0x8444),
109 LIMA_PIXEL_FORMAT(Z24_UNORM_S8_UINT, Z24S8, false, 0x0000),
110 LIMA_PIXEL_FORMAT(Z24X8_UNORM, Z24S8, false, 0x0000),
111 };
112
113 static const struct lima_format *
114 get_texel_format(enum pipe_format f)
115 {
116 if (f >= ARRAY_SIZE(lima_texel_formats) ||
117 !lima_texel_formats[f].present)
118 return NULL;
119
120 return lima_texel_formats + f;
121 }
122
123 static const struct lima_format *
124 get_pixel_format(enum pipe_format f)
125 {
126 if (f >= ARRAY_SIZE(lima_pixel_formats) ||
127 !lima_pixel_formats[f].present)
128 return NULL;
129
130 return lima_pixel_formats + f;
131 }
132
133 bool
134 lima_format_texel_supported(enum pipe_format f)
135 {
136 const struct lima_format *lf = get_texel_format(f);
137
138 if (!lf)
139 return false;
140
141 return true;
142 }
143
144 bool
145 lima_format_pixel_supported(enum pipe_format f)
146 {
147 const struct lima_format *lf = get_pixel_format(f);
148
149 if (!lf)
150 return false;
151
152 return true;
153 }
154
155 int
156 lima_format_get_texel(enum pipe_format f)
157 {
158 return lima_texel_formats[f].format;
159 }
160
161 int
162 lima_format_get_texel_reload(enum pipe_format f)
163 {
164 switch (f) {
165 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
166 case PIPE_FORMAT_Z24X8_UNORM:
167 return LIMA_TEXEL_FORMAT_Z24S8_RLD;
168 default:
169 return lima_format_get_texel(f);
170 }
171 }
172
173 int
174 lima_format_get_pixel(enum pipe_format f)
175 {
176 return lima_pixel_formats[f].format;
177 }
178
179 bool
180 lima_format_get_texel_swap_rb(enum pipe_format f)
181 {
182 return lima_texel_formats[f].swap_r_b;
183 }
184
185 bool
186 lima_format_get_pixel_swap_rb(enum pipe_format f)
187 {
188 return lima_pixel_formats[f].swap_r_b;
189 }
190
191 uint32_t
192 lima_format_get_channel_layout(enum pipe_format f)
193 {
194 return lima_pixel_formats[f].channel_layout;
195 }