OSDN Git Service

freedreno: gallium driver for adreno
[android-x86/external-mesa.git] / src / gallium / drivers / freedreno / freedreno_util.c
1 /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
2
3 /*
4  * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the next
14  * paragraph) shall be included in all copies or substantial portions of the
15  * Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  *
25  * Authors:
26  *    Rob Clark <robclark@freedesktop.org>
27  */
28
29 #include "pipe/p_defines.h"
30 #include "util/u_format.h"
31
32 #include "freedreno_util.h"
33
34 enum sq_surfaceformat
35 fd_pipe2surface(enum pipe_format format)
36 {
37         switch (format) {
38         /* 8-bit buffers. */
39         case PIPE_FORMAT_A8_UNORM:
40         case PIPE_FORMAT_A8_SNORM:
41         case PIPE_FORMAT_A8_UINT:
42         case PIPE_FORMAT_A8_SINT:
43         case PIPE_FORMAT_I8_UNORM:
44         case PIPE_FORMAT_I8_SNORM:
45         case PIPE_FORMAT_I8_UINT:
46         case PIPE_FORMAT_I8_SINT:
47         case PIPE_FORMAT_L8_UNORM:
48         case PIPE_FORMAT_L8_SNORM:
49         case PIPE_FORMAT_L8_UINT:
50         case PIPE_FORMAT_L8_SINT:
51         case PIPE_FORMAT_L8_SRGB:
52         case PIPE_FORMAT_R8_UNORM:
53         case PIPE_FORMAT_R8_SNORM:
54         case PIPE_FORMAT_R8_UINT:
55         case PIPE_FORMAT_R8_SINT:
56                 return FMT_8;
57
58         /* 16-bit buffers. */
59         case PIPE_FORMAT_B5G6R5_UNORM:
60                 return FMT_5_6_5;
61         case PIPE_FORMAT_B5G5R5A1_UNORM:
62         case PIPE_FORMAT_B5G5R5X1_UNORM:
63                 return FMT_1_5_5_5;
64         case PIPE_FORMAT_B4G4R4A4_UNORM:
65         case PIPE_FORMAT_B4G4R4X4_UNORM:
66                 return FMT_4_4_4_4;
67         case PIPE_FORMAT_Z16_UNORM:
68                 return FMT_16;
69         case PIPE_FORMAT_L8A8_UNORM:
70         case PIPE_FORMAT_L8A8_SNORM:
71         case PIPE_FORMAT_L8A8_UINT:
72         case PIPE_FORMAT_L8A8_SINT:
73         case PIPE_FORMAT_L8A8_SRGB:
74         case PIPE_FORMAT_R8G8_UNORM:
75         case PIPE_FORMAT_R8G8_SNORM:
76         case PIPE_FORMAT_R8G8_UINT:
77         case PIPE_FORMAT_R8G8_SINT:
78                 return FMT_8_8;
79         case PIPE_FORMAT_R16_UNORM:
80         case PIPE_FORMAT_R16_SNORM:
81         case PIPE_FORMAT_R16_UINT:
82         case PIPE_FORMAT_R16_SINT:
83         case PIPE_FORMAT_A16_UNORM:
84         case PIPE_FORMAT_A16_SNORM:
85         case PIPE_FORMAT_A16_UINT:
86         case PIPE_FORMAT_A16_SINT:
87         case PIPE_FORMAT_L16_UNORM:
88         case PIPE_FORMAT_L16_SNORM:
89         case PIPE_FORMAT_L16_UINT:
90         case PIPE_FORMAT_L16_SINT:
91         case PIPE_FORMAT_I16_UNORM:
92         case PIPE_FORMAT_I16_SNORM:
93         case PIPE_FORMAT_I16_UINT:
94         case PIPE_FORMAT_I16_SINT:
95                 return FMT_16;
96         case PIPE_FORMAT_R16_FLOAT:
97         case PIPE_FORMAT_A16_FLOAT:
98         case PIPE_FORMAT_L16_FLOAT:
99         case PIPE_FORMAT_I16_FLOAT:
100                 return FMT_16_FLOAT;
101
102         /* 32-bit buffers. */
103         case PIPE_FORMAT_A8B8G8R8_SRGB:
104         case PIPE_FORMAT_A8B8G8R8_UNORM:
105         case PIPE_FORMAT_A8R8G8B8_UNORM:
106         case PIPE_FORMAT_B8G8R8A8_SRGB:
107         case PIPE_FORMAT_B8G8R8A8_UNORM:
108         case PIPE_FORMAT_B8G8R8X8_UNORM:
109         case PIPE_FORMAT_R8G8B8A8_SNORM:
110         case PIPE_FORMAT_R8G8B8A8_UNORM:
111         case PIPE_FORMAT_R8G8B8X8_UNORM:
112         case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
113         case PIPE_FORMAT_X8B8G8R8_UNORM:
114         case PIPE_FORMAT_X8R8G8B8_UNORM:
115         case PIPE_FORMAT_R8G8B8_UNORM:
116         case PIPE_FORMAT_R8G8B8A8_SINT:
117         case PIPE_FORMAT_R8G8B8A8_UINT:
118                 return FMT_8_8_8_8;
119         case PIPE_FORMAT_R10G10B10A2_UNORM:
120         case PIPE_FORMAT_R10G10B10X2_SNORM:
121         case PIPE_FORMAT_B10G10R10A2_UNORM:
122         case PIPE_FORMAT_B10G10R10A2_UINT:
123         case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
124                 return FMT_2_10_10_10;
125         case PIPE_FORMAT_Z24X8_UNORM:
126         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
127                 return FMT_24_8;
128         case PIPE_FORMAT_R32_UINT:
129         case PIPE_FORMAT_R32_SINT:
130         case PIPE_FORMAT_A32_UINT:
131         case PIPE_FORMAT_A32_SINT:
132         case PIPE_FORMAT_L32_UINT:
133         case PIPE_FORMAT_L32_SINT:
134         case PIPE_FORMAT_I32_UINT:
135         case PIPE_FORMAT_I32_SINT:
136                 return FMT_32;
137         case PIPE_FORMAT_R32_FLOAT:
138         case PIPE_FORMAT_A32_FLOAT:
139         case PIPE_FORMAT_L32_FLOAT:
140         case PIPE_FORMAT_I32_FLOAT:
141         case PIPE_FORMAT_Z32_FLOAT:
142                 return FMT_32_FLOAT;
143         case PIPE_FORMAT_R16G16_FLOAT:
144         case PIPE_FORMAT_L16A16_FLOAT:
145                 return FMT_16_16_FLOAT;
146         case PIPE_FORMAT_R16G16_UNORM:
147         case PIPE_FORMAT_R16G16_SNORM:
148         case PIPE_FORMAT_R16G16_UINT:
149         case PIPE_FORMAT_R16G16_SINT:
150         case PIPE_FORMAT_L16A16_UNORM:
151         case PIPE_FORMAT_L16A16_SNORM:
152         case PIPE_FORMAT_L16A16_UINT:
153         case PIPE_FORMAT_L16A16_SINT:
154                 return FMT_16_16;
155
156         /* 64-bit buffers. */
157         case PIPE_FORMAT_R16G16B16A16_UINT:
158         case PIPE_FORMAT_R16G16B16A16_SINT:
159         case PIPE_FORMAT_R16G16B16A16_UNORM:
160         case PIPE_FORMAT_R16G16B16A16_SNORM:
161                 return FMT_16_16_16_16;
162         case PIPE_FORMAT_R16G16B16A16_FLOAT:
163                 return FMT_16_16_16_16_FLOAT;
164         case PIPE_FORMAT_R32G32_FLOAT:
165         case PIPE_FORMAT_L32A32_FLOAT:
166                 return FMT_32_32_FLOAT;
167         case PIPE_FORMAT_R32G32_SINT:
168         case PIPE_FORMAT_R32G32_UINT:
169         case PIPE_FORMAT_L32A32_UINT:
170         case PIPE_FORMAT_L32A32_SINT:
171                 return FMT_32_32;
172
173         /* 96-bit buffers. */
174         case PIPE_FORMAT_R32G32B32_FLOAT:
175                 return FMT_32_32_32_FLOAT;
176
177         /* 128-bit buffers. */
178         case PIPE_FORMAT_R32G32B32A32_SNORM:
179         case PIPE_FORMAT_R32G32B32A32_UNORM:
180         case PIPE_FORMAT_R32G32B32A32_SINT:
181         case PIPE_FORMAT_R32G32B32A32_UINT:
182                 return FMT_32_32_32_32;
183         case PIPE_FORMAT_R32G32B32A32_FLOAT:
184                 return FMT_32_32_32_32_FLOAT;
185
186         /* YUV buffers. */
187         case PIPE_FORMAT_UYVY:
188                 return FMT_Cr_Y1_Cb_Y0;
189         case PIPE_FORMAT_YUYV:
190                 return FMT_Y1_Cr_Y0_Cb;
191
192         default:
193                 return FMT_INVALID;
194         }
195 }
196
197 enum rb_colorformatx
198 fd_pipe2color(enum pipe_format format)
199 {
200         switch (format) {
201         /* 8-bit buffers. */
202         case PIPE_FORMAT_A8_UNORM:
203         case PIPE_FORMAT_A8_SNORM:
204         case PIPE_FORMAT_A8_UINT:
205         case PIPE_FORMAT_A8_SINT:
206         case PIPE_FORMAT_I8_UNORM:
207         case PIPE_FORMAT_I8_SNORM:
208         case PIPE_FORMAT_I8_UINT:
209         case PIPE_FORMAT_I8_SINT:
210         case PIPE_FORMAT_L8_UNORM:
211         case PIPE_FORMAT_L8_SNORM:
212         case PIPE_FORMAT_L8_UINT:
213         case PIPE_FORMAT_L8_SINT:
214         case PIPE_FORMAT_L8_SRGB:
215         case PIPE_FORMAT_R8_UNORM:
216         case PIPE_FORMAT_R8_SNORM:
217         case PIPE_FORMAT_R8_UINT:
218         case PIPE_FORMAT_R8_SINT:
219                 return COLORX_8;
220
221         /* 16-bit buffers. */
222         case PIPE_FORMAT_B5G6R5_UNORM:
223                 return COLORX_5_6_5;
224         case PIPE_FORMAT_B5G5R5A1_UNORM:
225         case PIPE_FORMAT_B5G5R5X1_UNORM:
226                 return COLORX_1_5_5_5;
227         case PIPE_FORMAT_B4G4R4A4_UNORM:
228         case PIPE_FORMAT_B4G4R4X4_UNORM:
229                 return COLORX_4_4_4_4;
230         case PIPE_FORMAT_L8A8_UNORM:
231         case PIPE_FORMAT_L8A8_SNORM:
232         case PIPE_FORMAT_L8A8_UINT:
233         case PIPE_FORMAT_L8A8_SINT:
234         case PIPE_FORMAT_L8A8_SRGB:
235         case PIPE_FORMAT_R8G8_UNORM:
236         case PIPE_FORMAT_R8G8_SNORM:
237         case PIPE_FORMAT_R8G8_UINT:
238         case PIPE_FORMAT_R8G8_SINT:
239         case PIPE_FORMAT_Z16_UNORM:
240                 return COLORX_8_8;
241         case PIPE_FORMAT_R16_FLOAT:
242         case PIPE_FORMAT_A16_FLOAT:
243         case PIPE_FORMAT_L16_FLOAT:
244         case PIPE_FORMAT_I16_FLOAT:
245                 return COLORX_16_FLOAT;
246
247         /* 32-bit buffers. */
248         case PIPE_FORMAT_A8B8G8R8_SRGB:
249         case PIPE_FORMAT_A8B8G8R8_UNORM:
250         case PIPE_FORMAT_A8R8G8B8_UNORM:
251         case PIPE_FORMAT_B8G8R8A8_SRGB:
252         case PIPE_FORMAT_B8G8R8A8_UNORM:
253         case PIPE_FORMAT_B8G8R8X8_UNORM:
254         case PIPE_FORMAT_R8G8B8A8_SNORM:
255         case PIPE_FORMAT_R8G8B8A8_UNORM:
256         case PIPE_FORMAT_R8G8B8X8_UNORM:
257         case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
258         case PIPE_FORMAT_X8B8G8R8_UNORM:
259         case PIPE_FORMAT_X8R8G8B8_UNORM:
260         case PIPE_FORMAT_R8G8B8_UNORM:
261         case PIPE_FORMAT_R8G8B8A8_SINT:
262         case PIPE_FORMAT_R8G8B8A8_UINT:
263         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
264         case PIPE_FORMAT_Z24X8_UNORM:
265                 return COLORX_8_8_8_8;
266         case PIPE_FORMAT_R32_FLOAT:
267         case PIPE_FORMAT_A32_FLOAT:
268         case PIPE_FORMAT_L32_FLOAT:
269         case PIPE_FORMAT_I32_FLOAT:
270         case PIPE_FORMAT_Z32_FLOAT:
271                 return COLORX_32_FLOAT;
272         case PIPE_FORMAT_R16G16_FLOAT:
273         case PIPE_FORMAT_L16A16_FLOAT:
274                 return COLORX_16_16_FLOAT;
275
276         /* 64-bit buffers. */
277         case PIPE_FORMAT_R16G16B16A16_FLOAT:
278                 return COLORX_16_16_16_16_FLOAT;
279         case PIPE_FORMAT_R32G32_FLOAT:
280         case PIPE_FORMAT_L32A32_FLOAT:
281                 return COLORX_32_32_FLOAT;
282
283         /* 128-bit buffers. */
284         case PIPE_FORMAT_R32G32B32A32_FLOAT:
285                 return COLORX_32_32_32_32_FLOAT;
286
287         default:
288                 return COLORX_INVALID;
289         }
290 }
291
292 enum rb_depth_format
293 fd_pipe2depth(enum pipe_format format)
294 {
295         switch (format) {
296         case PIPE_FORMAT_Z16_UNORM:
297                 return DEPTHX_16;
298         case PIPE_FORMAT_Z24X8_UNORM:
299         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
300                 return DEPTHX_24_8;
301         default:
302                 return DEPTHX_INVALID;
303         }
304 }
305
306 enum pc_di_index_size
307 fd_pipe2index(enum pipe_format format)
308 {
309         switch (format) {
310         case PIPE_FORMAT_I8_UINT:
311                 return INDEX_SIZE_8_BIT;
312         case PIPE_FORMAT_I16_UINT:
313                 return INDEX_SIZE_16_BIT;
314         case PIPE_FORMAT_I32_UINT:
315                 return INDEX_SIZE_32_BIT;
316         default:
317                 return INDEX_SIZE_INVALID;
318         }
319 }
320
321 static inline enum sq_tex_swiz
322 tex_swiz(unsigned swiz)
323 {
324         switch (swiz) {
325         default:
326         case PIPE_SWIZZLE_RED:   return SQ_TEX_X;
327         case PIPE_SWIZZLE_GREEN: return SQ_TEX_Y;
328         case PIPE_SWIZZLE_BLUE:  return SQ_TEX_Z;
329         case PIPE_SWIZZLE_ALPHA: return SQ_TEX_W;
330         case PIPE_SWIZZLE_ZERO:  return SQ_TEX_ZERO;
331         case PIPE_SWIZZLE_ONE:   return SQ_TEX_ONE;
332         }
333 }
334
335 uint32_t
336 fd_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g,
337                 unsigned swizzle_b, unsigned swizzle_a)
338 {
339         const struct util_format_description *desc =
340                         util_format_description(format);
341         uint8_t swiz[] = {
342                         swizzle_r, swizzle_g, swizzle_b, swizzle_a,
343                         PIPE_SWIZZLE_ZERO, PIPE_SWIZZLE_ONE,
344                         PIPE_SWIZZLE_ONE, PIPE_SWIZZLE_ONE,
345         };
346
347         return SQ_TEX3_SWIZ_X(tex_swiz(swiz[desc->swizzle[0]])) |
348                         SQ_TEX3_SWIZ_Y(tex_swiz(swiz[desc->swizzle[1]])) |
349                         SQ_TEX3_SWIZ_Z(tex_swiz(swiz[desc->swizzle[2]])) |
350                         SQ_TEX3_SWIZ_W(tex_swiz(swiz[desc->swizzle[3]]));
351 }