1b8e80941Smrg/*
2b8e80941Smrg * Copyright 2017 Google
3b8e80941Smrg *
4b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5b8e80941Smrg * copy of this software and associated documentation files (the
6b8e80941Smrg * "Software"), to deal in the Software without restriction, including
7b8e80941Smrg * without limitation the rights to use, copy, modify, merge, publish,
8b8e80941Smrg * distribute, sub license, and/or sell copies of the Software, and to
9b8e80941Smrg * permit persons to whom the Software is furnished to do so, subject to
10b8e80941Smrg * the following conditions:
11b8e80941Smrg *
12b8e80941Smrg * The above copyright notice and this permission notice (including the
13b8e80941Smrg * next paragraph) shall be included in all copies or substantial portions
14b8e80941Smrg * of the Software.
15b8e80941Smrg *
16b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18b8e80941Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19b8e80941Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
20b8e80941Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21b8e80941Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22b8e80941Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23b8e80941Smrg */
24b8e80941Smrg
25b8e80941Smrg#include "formats.h"
26b8e80941Smrg#include "util/macros.h"
27b8e80941Smrg
28b8e80941Smrg/**
29b8e80941Smrg * For an sRGB format, return the corresponding linear color space format.
30b8e80941Smrg * For non-sRGB formats, return the format as-is.
31b8e80941Smrg */
32b8e80941Smrgmesa_format
33b8e80941Smrg_mesa_get_srgb_format_linear(mesa_format format)
34b8e80941Smrg{
35b8e80941Smrg   switch (format) {
36b8e80941Smrg   case MESA_FORMAT_A8B8G8R8_SRGB:
37b8e80941Smrg      return MESA_FORMAT_A8B8G8R8_UNORM;
38b8e80941Smrg   case MESA_FORMAT_B8G8R8A8_SRGB:
39b8e80941Smrg      return MESA_FORMAT_B8G8R8A8_UNORM;
40b8e80941Smrg   case MESA_FORMAT_A8R8G8B8_SRGB:
41b8e80941Smrg      return MESA_FORMAT_A8R8G8B8_UNORM;
42b8e80941Smrg   case MESA_FORMAT_B8G8R8X8_SRGB:
43b8e80941Smrg      return MESA_FORMAT_B8G8R8X8_UNORM;
44b8e80941Smrg   case MESA_FORMAT_X8R8G8B8_SRGB:
45b8e80941Smrg      return MESA_FORMAT_X8R8G8B8_UNORM;
46b8e80941Smrg   case MESA_FORMAT_R8G8B8A8_SRGB:
47b8e80941Smrg      return MESA_FORMAT_R8G8B8A8_UNORM;
48b8e80941Smrg   case MESA_FORMAT_R8G8B8X8_SRGB:
49b8e80941Smrg      return MESA_FORMAT_R8G8B8X8_UNORM;
50b8e80941Smrg   case MESA_FORMAT_X8B8G8R8_SRGB:
51b8e80941Smrg      return MESA_FORMAT_X8B8G8R8_UNORM;
52b8e80941Smrg   case MESA_FORMAT_L8A8_SRGB:
53b8e80941Smrg      return MESA_FORMAT_L8A8_UNORM;
54b8e80941Smrg   case MESA_FORMAT_A8L8_SRGB:
55b8e80941Smrg      return MESA_FORMAT_A8L8_UNORM;
56b8e80941Smrg   case MESA_FORMAT_R_SRGB8:
57b8e80941Smrg      return MESA_FORMAT_R_UNORM8;
58b8e80941Smrg   case MESA_FORMAT_L_SRGB8:
59b8e80941Smrg      return MESA_FORMAT_L_UNORM8;
60b8e80941Smrg   case MESA_FORMAT_BGR_SRGB8:
61b8e80941Smrg      return MESA_FORMAT_BGR_UNORM8;
62b8e80941Smrg   case MESA_FORMAT_SRGB_DXT1:
63b8e80941Smrg      return MESA_FORMAT_RGB_DXT1;
64b8e80941Smrg   case MESA_FORMAT_SRGBA_DXT1:
65b8e80941Smrg      return MESA_FORMAT_RGBA_DXT1;
66b8e80941Smrg   case MESA_FORMAT_SRGBA_DXT3:
67b8e80941Smrg      return MESA_FORMAT_RGBA_DXT3;
68b8e80941Smrg   case MESA_FORMAT_SRGBA_DXT5:
69b8e80941Smrg      return MESA_FORMAT_RGBA_DXT5;
70b8e80941Smrg   case MESA_FORMAT_ETC2_SRGB8:
71b8e80941Smrg      return MESA_FORMAT_ETC2_RGB8;
72b8e80941Smrg   case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
73b8e80941Smrg      return MESA_FORMAT_ETC2_RGBA8_EAC;
74b8e80941Smrg   case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
75b8e80941Smrg      return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
76b8e80941Smrg   case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
77b8e80941Smrg      return MESA_FORMAT_BPTC_RGBA_UNORM;
78b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
79b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_4x4;
80b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
81b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_5x4;
82b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
83b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_5x5;
84b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
85b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_6x5;
86b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
87b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_6x6;
88b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
89b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_8x5;
90b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
91b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_8x6;
92b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
93b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_8x8;
94b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
95b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_10x5;
96b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
97b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_10x6;
98b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
99b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_10x8;
100b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
101b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_10x10;
102b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
103b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_12x10;
104b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
105b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_12x12;
106b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_3x3x3:
107b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_3x3x3;
108b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x3x3:
109b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_4x3x3;
110b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x3:
111b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_4x4x3;
112b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x4:
113b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_4x4x4;
114b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4x4:
115b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_5x4x4;
116b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x4:
117b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_5x5x4;
118b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x5:
119b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_5x5x5;
120b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5x5:
121b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_6x5x5;
122b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x5:
123b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_6x6x5;
124b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x6:
125b8e80941Smrg      return MESA_FORMAT_RGBA_ASTC_6x6x6;
126b8e80941Smrg   default:
127b8e80941Smrg      return format;
128b8e80941Smrg   }
129b8e80941Smrg}
130b8e80941Smrg
131b8e80941Smrg/**
132b8e80941Smrg * For a linear format, return the corresponding sRGB color space format.
133b8e80941Smrg * For an sRGB format, return the format as-is.
134b8e80941Smrg * Assert-fails if the format is not sRGB and does not have an sRGB equivalent.
135b8e80941Smrg */
136b8e80941Smrgmesa_format
137b8e80941Smrg_mesa_get_linear_format_srgb(mesa_format format)
138b8e80941Smrg{
139b8e80941Smrg   switch (format) {
140b8e80941Smrg   case MESA_FORMAT_A8B8G8R8_UNORM:
141b8e80941Smrg      return MESA_FORMAT_A8B8G8R8_SRGB;
142b8e80941Smrg   case MESA_FORMAT_B8G8R8A8_UNORM:
143b8e80941Smrg      return MESA_FORMAT_B8G8R8A8_SRGB;
144b8e80941Smrg   case MESA_FORMAT_A8R8G8B8_UNORM:
145b8e80941Smrg      return MESA_FORMAT_A8R8G8B8_SRGB;
146b8e80941Smrg   case MESA_FORMAT_B8G8R8X8_UNORM:
147b8e80941Smrg      return MESA_FORMAT_B8G8R8X8_SRGB;
148b8e80941Smrg   case MESA_FORMAT_X8R8G8B8_UNORM:
149b8e80941Smrg      return MESA_FORMAT_X8R8G8B8_SRGB;
150b8e80941Smrg   case MESA_FORMAT_R8G8B8A8_UNORM:
151b8e80941Smrg      return MESA_FORMAT_R8G8B8A8_SRGB;
152b8e80941Smrg   case MESA_FORMAT_R8G8B8X8_UNORM:
153b8e80941Smrg      return MESA_FORMAT_R8G8B8X8_SRGB;
154b8e80941Smrg   case MESA_FORMAT_X8B8G8R8_UNORM:
155b8e80941Smrg      return MESA_FORMAT_X8B8G8R8_SRGB;
156b8e80941Smrg   case MESA_FORMAT_L8A8_UNORM:
157b8e80941Smrg      return MESA_FORMAT_L8A8_SRGB;
158b8e80941Smrg   case MESA_FORMAT_A8L8_UNORM:
159b8e80941Smrg      return MESA_FORMAT_A8L8_SRGB;
160b8e80941Smrg   case MESA_FORMAT_R_UNORM8:
161b8e80941Smrg      return MESA_FORMAT_R_SRGB8;
162b8e80941Smrg   case MESA_FORMAT_L_UNORM8:
163b8e80941Smrg      return MESA_FORMAT_L_SRGB8;
164b8e80941Smrg   case MESA_FORMAT_BGR_UNORM8:
165b8e80941Smrg      return MESA_FORMAT_BGR_SRGB8;
166b8e80941Smrg   case MESA_FORMAT_RGB_DXT1:
167b8e80941Smrg      return MESA_FORMAT_SRGB_DXT1;
168b8e80941Smrg   case MESA_FORMAT_RGBA_DXT1:
169b8e80941Smrg      return MESA_FORMAT_SRGBA_DXT1;
170b8e80941Smrg   case MESA_FORMAT_RGBA_DXT3:
171b8e80941Smrg      return MESA_FORMAT_SRGBA_DXT3;
172b8e80941Smrg   case MESA_FORMAT_RGBA_DXT5:
173b8e80941Smrg      return MESA_FORMAT_SRGBA_DXT5;
174b8e80941Smrg   case MESA_FORMAT_ETC2_RGB8:
175b8e80941Smrg      return MESA_FORMAT_ETC2_SRGB8;
176b8e80941Smrg   case MESA_FORMAT_ETC2_RGBA8_EAC:
177b8e80941Smrg      return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
178b8e80941Smrg   case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
179b8e80941Smrg      return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
180b8e80941Smrg   case MESA_FORMAT_BPTC_RGBA_UNORM:
181b8e80941Smrg      return MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM;
182b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_4x4:
183b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4;
184b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_5x4:
185b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4;
186b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_5x5:
187b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5;
188b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_6x5:
189b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5;
190b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_6x6:
191b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6;
192b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_8x5:
193b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5;
194b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_8x6:
195b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6;
196b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_8x8:
197b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8;
198b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_10x5:
199b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5;
200b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_10x6:
201b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6;
202b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_10x8:
203b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8;
204b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_10x10:
205b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10;
206b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_12x10:
207b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10;
208b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_12x12:
209b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12;
210b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_3x3x3:
211b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_3x3x3;
212b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_4x3x3:
213b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x3x3;
214b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_4x4x3:
215b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x3;
216b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_4x4x4:
217b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x4;
218b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_5x4x4:
219b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4x4;
220b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_5x5x4:
221b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x4;
222b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_5x5x5:
223b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x5;
224b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_6x5x5:
225b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5x5;
226b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_6x6x5:
227b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x5;
228b8e80941Smrg   case MESA_FORMAT_RGBA_ASTC_6x6x6:
229b8e80941Smrg      return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x6;
230b8e80941Smrg   case MESA_FORMAT_A8B8G8R8_SRGB:
231b8e80941Smrg   case MESA_FORMAT_B8G8R8A8_SRGB:
232b8e80941Smrg   case MESA_FORMAT_A8R8G8B8_SRGB:
233b8e80941Smrg   case MESA_FORMAT_B8G8R8X8_SRGB:
234b8e80941Smrg   case MESA_FORMAT_X8R8G8B8_SRGB:
235b8e80941Smrg   case MESA_FORMAT_R8G8B8A8_SRGB:
236b8e80941Smrg   case MESA_FORMAT_R8G8B8X8_SRGB:
237b8e80941Smrg   case MESA_FORMAT_X8B8G8R8_SRGB:
238b8e80941Smrg   case MESA_FORMAT_L8A8_SRGB:
239b8e80941Smrg   case MESA_FORMAT_A8L8_SRGB:
240b8e80941Smrg   case MESA_FORMAT_R_SRGB8:
241b8e80941Smrg   case MESA_FORMAT_L_SRGB8:
242b8e80941Smrg   case MESA_FORMAT_BGR_SRGB8:
243b8e80941Smrg   case MESA_FORMAT_SRGB_DXT1:
244b8e80941Smrg   case MESA_FORMAT_SRGBA_DXT1:
245b8e80941Smrg   case MESA_FORMAT_SRGBA_DXT3:
246b8e80941Smrg   case MESA_FORMAT_SRGBA_DXT5:
247b8e80941Smrg   case MESA_FORMAT_ETC2_SRGB8:
248b8e80941Smrg   case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
249b8e80941Smrg   case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
250b8e80941Smrg   case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
251b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
252b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
253b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
254b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
255b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
256b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
257b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
258b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
259b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
260b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
261b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
262b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
263b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
264b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
265b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_3x3x3:
266b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x3x3:
267b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x3:
268b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4x4:
269b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4x4:
270b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x4:
271b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5x5:
272b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5x5:
273b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x5:
274b8e80941Smrg   case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6x6:
275b8e80941Smrg      return format;
276b8e80941Smrg   default:
277b8e80941Smrg      unreachable("Given format does not have an sRGB equivalent");
278b8e80941Smrg   }
279b8e80941Smrg}
280b8e80941Smrg
281b8e80941Smrg/**
282b8e80941Smrg * If the format has an alpha channel, and there exists a non-alpha
283b8e80941Smrg * variant of the format with an identical bit layout, then return
284b8e80941Smrg * the non-alpha format. Otherwise return the original format.
285b8e80941Smrg *
286b8e80941Smrg * Examples:
287b8e80941Smrg *    Fallback exists:
288b8e80941Smrg *       MESA_FORMAT_R8G8B8X8_UNORM -> MESA_FORMAT_R8G8B8A8_UNORM
289b8e80941Smrg *       MESA_FORMAT_RGBX_UNORM16 -> MESA_FORMAT_RGBA_UNORM16
290b8e80941Smrg *
291b8e80941Smrg *    No fallback:
292b8e80941Smrg *       MESA_FORMAT_R8G8B8A8_UNORM -> MESA_FORMAT_R8G8B8A8_UNORM
293b8e80941Smrg *       MESA_FORMAT_Z_FLOAT32 -> MESA_FORMAT_Z_FLOAT32
294b8e80941Smrg */
295b8e80941Smrgmesa_format
296b8e80941Smrg_mesa_format_fallback_rgbx_to_rgba(mesa_format format)
297b8e80941Smrg{
298b8e80941Smrg   switch (format) {
299b8e80941Smrg   case MESA_FORMAT_X8B8G8R8_UNORM:
300b8e80941Smrg      return MESA_FORMAT_A8B8G8R8_UNORM;
301b8e80941Smrg   case MESA_FORMAT_R8G8B8X8_UNORM:
302b8e80941Smrg      return MESA_FORMAT_R8G8B8A8_UNORM;
303b8e80941Smrg   case MESA_FORMAT_B8G8R8X8_UNORM:
304b8e80941Smrg      return MESA_FORMAT_B8G8R8A8_UNORM;
305b8e80941Smrg   case MESA_FORMAT_X8R8G8B8_UNORM:
306b8e80941Smrg      return MESA_FORMAT_A8R8G8B8_UNORM;
307b8e80941Smrg   case MESA_FORMAT_B4G4R4X4_UNORM:
308b8e80941Smrg      return MESA_FORMAT_B4G4R4A4_UNORM;
309b8e80941Smrg   case MESA_FORMAT_X1B5G5R5_UNORM:
310b8e80941Smrg      return MESA_FORMAT_A1B5G5R5_UNORM;
311b8e80941Smrg   case MESA_FORMAT_B5G5R5X1_UNORM:
312b8e80941Smrg      return MESA_FORMAT_B5G5R5A1_UNORM;
313b8e80941Smrg   case MESA_FORMAT_B10G10R10X2_UNORM:
314b8e80941Smrg      return MESA_FORMAT_B10G10R10A2_UNORM;
315b8e80941Smrg   case MESA_FORMAT_R10G10B10X2_UNORM:
316b8e80941Smrg      return MESA_FORMAT_R10G10B10A2_UNORM;
317b8e80941Smrg   case MESA_FORMAT_RGBX_UNORM16:
318b8e80941Smrg      return MESA_FORMAT_RGBA_UNORM16;
319b8e80941Smrg   case MESA_FORMAT_X8B8G8R8_SNORM:
320b8e80941Smrg      return MESA_FORMAT_A8B8G8R8_SNORM;
321b8e80941Smrg   case MESA_FORMAT_R8G8B8X8_SNORM:
322b8e80941Smrg      return MESA_FORMAT_R8G8B8A8_SNORM;
323b8e80941Smrg   case MESA_FORMAT_RGBX_SNORM16:
324b8e80941Smrg      return MESA_FORMAT_RGBA_SNORM16;
325b8e80941Smrg   case MESA_FORMAT_B8G8R8X8_SRGB:
326b8e80941Smrg      return MESA_FORMAT_B8G8R8A8_SRGB;
327b8e80941Smrg   case MESA_FORMAT_X8R8G8B8_SRGB:
328b8e80941Smrg      return MESA_FORMAT_A8R8G8B8_SRGB;
329b8e80941Smrg   case MESA_FORMAT_R8G8B8X8_SRGB:
330b8e80941Smrg      return MESA_FORMAT_R8G8B8A8_SRGB;
331b8e80941Smrg   case MESA_FORMAT_X8B8G8R8_SRGB:
332b8e80941Smrg      return MESA_FORMAT_A8B8G8R8_SRGB;
333b8e80941Smrg   case MESA_FORMAT_RGBX_FLOAT16:
334b8e80941Smrg      return MESA_FORMAT_RGBA_FLOAT16;
335b8e80941Smrg   case MESA_FORMAT_RGBX_FLOAT32:
336b8e80941Smrg      return MESA_FORMAT_RGBA_FLOAT32;
337b8e80941Smrg   case MESA_FORMAT_RGBX_UINT8:
338b8e80941Smrg      return MESA_FORMAT_RGBA_UINT8;
339b8e80941Smrg   case MESA_FORMAT_RGBX_UINT16:
340b8e80941Smrg      return MESA_FORMAT_RGBA_UINT16;
341b8e80941Smrg   case MESA_FORMAT_RGBX_UINT32:
342b8e80941Smrg      return MESA_FORMAT_RGBA_UINT32;
343b8e80941Smrg   case MESA_FORMAT_RGBX_SINT8:
344b8e80941Smrg      return MESA_FORMAT_RGBA_SINT8;
345b8e80941Smrg   case MESA_FORMAT_RGBX_SINT16:
346b8e80941Smrg      return MESA_FORMAT_RGBA_SINT16;
347b8e80941Smrg   case MESA_FORMAT_RGBX_SINT32:
348b8e80941Smrg      return MESA_FORMAT_RGBA_SINT32;
349b8e80941Smrg   default:
350b8e80941Smrg      return format;
351b8e80941Smrg   }
352b8e80941Smrg}
353