Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
/*
2
 * Copyright (C) 2013 Rob Clark 
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * Software is furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice (including the next
12
 * paragraph) shall be included in all copies or substantial portions of the
13
 * Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
 * SOFTWARE.
22
 *
23
 */
24
 
25
#include "pipe/p_defines.h"
26
#include "util/u_format.h"
27
 
28
#include "fd3_format.h"
29
 
30
/* Specifies the table of all the formats and their features. Also supplies
31
 * the helpers that look up various data in those tables.
32
 */
33
 
34
struct fd3_format {
35
	enum a3xx_vtx_fmt vtx;
36
	enum a3xx_tex_fmt tex;
37
	enum a3xx_color_fmt rb;
38
	enum a3xx_color_swap swap;
39
	boolean present;
40
};
41
 
42
#define RB_NONE ~0
43
 
44
/* vertex + texture */
45
#define VT(pipe, fmt, rbfmt, swapfmt) \
46
	[PIPE_FORMAT_ ## pipe] = { \
47
		.present = 1, \
48
		.vtx = VFMT_ ## fmt, \
49
		.tex = TFMT_ ## fmt, \
50
		.rb = RB_ ## rbfmt, \
51
		.swap = swapfmt \
52
	}
53
 
54
/* texture-only */
55
#define _T(pipe, fmt, rbfmt, swapfmt) \
56
	[PIPE_FORMAT_ ## pipe] = { \
57
		.present = 1, \
58
		.vtx = ~0, \
59
		.tex = TFMT_ ## fmt, \
60
		.rb = RB_ ## rbfmt, \
61
		.swap = swapfmt \
62
	}
63
 
64
/* vertex-only */
65
#define V_(pipe, fmt, rbfmt, swapfmt) \
66
	[PIPE_FORMAT_ ## pipe] = { \
67
		.present = 1, \
68
		.vtx = VFMT_ ## fmt, \
69
		.tex = ~0, \
70
		.rb = RB_ ## rbfmt, \
71
		.swap = swapfmt \
72
	}
73
 
74
static struct fd3_format formats[PIPE_FORMAT_COUNT] = {
75
	/* 8-bit */
76
	VT(R8_UNORM,   8_UNORM, R8_UNORM, WZYX),
77
	VT(R8_SNORM,   8_SNORM, NONE,     WZYX),
78
	VT(R8_UINT,    8_UINT,  R8_UINT,  WZYX),
79
	VT(R8_SINT,    8_SINT,  R8_SINT,  WZYX),
80
	V_(R8_USCALED, 8_UINT,  NONE,     WZYX),
81
	V_(R8_SSCALED, 8_UINT,  NONE,     WZYX),
82
 
83
	_T(A8_UNORM,   8_UNORM, A8_UNORM, WZYX),
84
	_T(L8_UNORM,   8_UNORM, R8_UNORM, WZYX),
85
	_T(I8_UNORM,   8_UNORM, NONE,     WZYX),
86
 
87
	_T(A8_UINT,    8_UINT,  NONE,     WZYX),
88
	_T(A8_SINT,    8_SINT,  NONE,     WZYX),
89
	_T(L8_UINT,    8_UINT,  NONE,     WZYX),
90
	_T(L8_SINT,    8_SINT,  NONE,     WZYX),
91
	_T(I8_UINT,    8_UINT,  NONE,     WZYX),
92
	_T(I8_SINT,    8_SINT,  NONE,     WZYX),
93
 
94
	_T(S8_UINT,    8_UINT,  R8_UNORM, WZYX),
95
 
96
	/* 16-bit */
97
	VT(R16_UNORM,   16_UNORM, NONE,     WZYX),
98
	VT(R16_SNORM,   16_SNORM, NONE,     WZYX),
99
	VT(R16_UINT,    16_UINT,  R16_UINT, WZYX),
100
	VT(R16_SINT,    16_SINT,  R16_SINT, WZYX),
101
	V_(R16_USCALED, 16_UINT,  NONE,     WZYX),
102
	V_(R16_SSCALED, 16_UINT,  NONE,     WZYX),
103
	VT(R16_FLOAT,   16_FLOAT, R16_FLOAT,WZYX),
104
 
105
	_T(A16_UINT,    16_UINT,  NONE,     WZYX),
106
	_T(A16_SINT,    16_SINT,  NONE,     WZYX),
107
	_T(L16_UINT,    16_UINT,  NONE,     WZYX),
108
	_T(L16_SINT,    16_SINT,  NONE,     WZYX),
109
	_T(I16_UINT,    16_UINT,  NONE,     WZYX),
110
	_T(I16_SINT,    16_SINT,  NONE,     WZYX),
111
 
112
	VT(R8G8_UNORM,   8_8_UNORM, R8G8_UNORM, WZYX),
113
	VT(R8G8_SNORM,   8_8_SNORM, R8G8_SNORM, WZYX),
114
	VT(R8G8_UINT,    8_8_UINT,  NONE,       WZYX),
115
	VT(R8G8_SINT,    8_8_SINT,  NONE,       WZYX),
116
	V_(R8G8_USCALED, 8_8_UINT,  NONE,       WZYX),
117
	V_(R8G8_SSCALED, 8_8_SINT,  NONE,       WZYX),
118
 
119
	_T(L8A8_UINT,    8_8_UINT,  NONE,       WZYX),
120
	_T(L8A8_SINT,    8_8_SINT,  NONE,       WZYX),
121
 
122
	_T(Z16_UNORM,      Z16_UNORM,     R8G8_UNORM,     WZYX),
123
	_T(B5G6R5_UNORM,   5_6_5_UNORM,   R5G6B5_UNORM,   WXYZ),
124
	_T(B5G5R5A1_UNORM, 5_5_5_1_UNORM, R5G5B5A1_UNORM, WXYZ),
125
	_T(B5G5R5X1_UNORM, 5_5_5_1_UNORM, R5G5B5A1_UNORM, WXYZ),
126
	_T(B4G4R4A4_UNORM, 4_4_4_4_UNORM, R4G4B4A4_UNORM, WXYZ),
127
 
128
	/* 24-bit */
129
	V_(R8G8B8_UNORM,   8_8_8_UNORM, NONE, WZYX),
130
	V_(R8G8B8_SNORM,   8_8_8_SNORM, NONE, WZYX),
131
	V_(R8G8B8_UINT,    8_8_8_UINT,  NONE, WZYX),
132
	V_(R8G8B8_SINT,    8_8_8_SINT,  NONE, WZYX),
133
	V_(R8G8B8_USCALED, 8_8_8_UINT,  NONE, WZYX),
134
	V_(R8G8B8_SSCALED, 8_8_8_SINT,  NONE, WZYX),
135
 
136
	/* 32-bit */
137
	VT(R32_UINT,    32_UINT,  R32_UINT, WZYX),
138
	VT(R32_SINT,    32_SINT,  R32_SINT, WZYX),
139
	V_(R32_USCALED, 32_UINT,  NONE,     WZYX),
140
	V_(R32_SSCALED, 32_UINT,  NONE,     WZYX),
141
	VT(R32_FLOAT,   32_FLOAT, R32_FLOAT,WZYX),
142
	V_(R32_FIXED,   32_FIXED, NONE,     WZYX),
143
 
144
	_T(A32_UINT,    32_UINT,  NONE,     WZYX),
145
	_T(A32_SINT,    32_SINT,  NONE,     WZYX),
146
	_T(L32_UINT,    32_UINT,  NONE,     WZYX),
147
	_T(L32_SINT,    32_SINT,  NONE,     WZYX),
148
	_T(I32_UINT,    32_UINT,  NONE,     WZYX),
149
	_T(I32_SINT,    32_SINT,  NONE,     WZYX),
150
 
151
	VT(R16G16_UNORM,   16_16_UNORM, NONE,        WZYX),
152
	VT(R16G16_SNORM,   16_16_SNORM, NONE,        WZYX),
153
	VT(R16G16_UINT,    16_16_UINT,  R16G16_UINT, WZYX),
154
	VT(R16G16_SINT,    16_16_SINT,  R16G16_SINT, WZYX),
155
	V_(R16G16_USCALED, 16_16_UINT,  NONE,        WZYX),
156
	V_(R16G16_SSCALED, 16_16_SINT,  NONE,        WZYX),
157
	VT(R16G16_FLOAT,   16_16_FLOAT, R16G16_FLOAT,WZYX),
158
 
159
	_T(L16A16_UINT,    16_16_UINT,  NONE,        WZYX),
160
	_T(L16A16_SINT,    16_16_SINT,  NONE,        WZYX),
161
 
162
	VT(R8G8B8A8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
163
	_T(R8G8B8X8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
164
	_T(R8G8B8A8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
165
	_T(R8G8B8X8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
166
	VT(R8G8B8A8_SNORM,   8_8_8_8_SNORM, R8G8B8A8_SNORM, WZYX),
167
	VT(R8G8B8A8_UINT,    8_8_8_8_UINT,  R8G8B8A8_UINT,  WZYX),
168
	VT(R8G8B8A8_SINT,    8_8_8_8_SINT,  R8G8B8A8_SINT,  WZYX),
169
	V_(R8G8B8A8_USCALED, 8_8_8_8_UINT,  NONE,           WZYX),
170
	V_(R8G8B8A8_SSCALED, 8_8_8_8_SINT,  NONE,           WZYX),
171
 
172
	VT(B8G8R8A8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
173
	_T(B8G8R8X8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
174
	VT(B8G8R8A8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
175
	_T(B8G8R8X8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
176
 
177
	VT(A8B8G8R8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
178
	_T(X8B8G8R8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
179
	_T(A8B8G8R8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
180
	_T(X8B8G8R8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
181
 
182
	VT(A8R8G8B8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
183
	_T(X8R8G8B8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
184
	_T(A8R8G8B8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
185
	_T(X8R8G8B8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
186
 
187
	VT(R10G10B10A2_UNORM,   10_10_10_2_UNORM, R10G10B10A2_UNORM, WZYX),
188
	VT(B10G10R10A2_UNORM,   10_10_10_2_UNORM, R10G10B10A2_UNORM, WXYZ),
189
	_T(B10G10R10X2_UNORM,   10_10_10_2_UNORM, R10G10B10A2_UNORM, WXYZ),
190
	V_(R10G10B10A2_SNORM,   10_10_10_2_SNORM, NONE,              WZYX),
191
	V_(R10G10B10A2_UINT,    10_10_10_2_UINT,  NONE,              WZYX),
192
	V_(R10G10B10A2_USCALED, 10_10_10_2_UINT,  NONE,              WZYX),
193
	V_(R10G10B10A2_SSCALED, 10_10_10_2_SINT,  NONE,              WZYX),
194
 
195
	_T(R11G11B10_FLOAT, 11_11_10_FLOAT, R11G11B10_FLOAT, WZYX),
196
	_T(R9G9B9E5_FLOAT,  9_9_9_E5_FLOAT, NONE,            WZYX),
197
 
198
	_T(Z24X8_UNORM,       X8Z24_UNORM, R8G8B8A8_UNORM, WZYX),
199
	_T(Z24_UNORM_S8_UINT, X8Z24_UNORM, R8G8B8A8_UNORM, WZYX),
200
	_T(Z32_FLOAT,         Z32_FLOAT,   R8G8B8A8_UNORM, WZYX),
201
	_T(Z32_FLOAT_S8X24_UINT, Z32_FLOAT,R8G8B8A8_UNORM, WZYX),
202
 
203
	/* 48-bit */
204
	V_(R16G16B16_UNORM,   16_16_16_UNORM, NONE, WZYX),
205
	V_(R16G16B16_SNORM,   16_16_16_SNORM, NONE, WZYX),
206
	V_(R16G16B16_UINT,    16_16_16_UINT,  NONE, WZYX),
207
	V_(R16G16B16_SINT,    16_16_16_SINT,  NONE, WZYX),
208
	V_(R16G16B16_USCALED, 16_16_16_UINT,  NONE, WZYX),
209
	V_(R16G16B16_SSCALED, 16_16_16_SINT,  NONE, WZYX),
210
	V_(R16G16B16_FLOAT,   16_16_16_FLOAT, NONE, WZYX),
211
 
212
	/* 64-bit */
213
	VT(R16G16B16A16_UNORM,   16_16_16_16_UNORM, NONE,               WZYX),
214
	VT(R16G16B16A16_SNORM,   16_16_16_16_SNORM, NONE,               WZYX),
215
	VT(R16G16B16A16_UINT,    16_16_16_16_UINT,  R16G16B16A16_UINT,  WZYX),
216
	_T(R16G16B16X16_UINT,    16_16_16_16_UINT,  R16G16B16A16_UINT,  WZYX),
217
	VT(R16G16B16A16_SINT,    16_16_16_16_SINT,  R16G16B16A16_SINT,  WZYX),
218
	_T(R16G16B16X16_SINT,    16_16_16_16_SINT,  R16G16B16A16_SINT,  WZYX),
219
	V_(R16G16B16A16_USCALED, 16_16_16_16_UINT,  NONE,               WZYX),
220
	V_(R16G16B16A16_SSCALED, 16_16_16_16_SINT,  NONE,               WZYX),
221
	VT(R16G16B16A16_FLOAT,   16_16_16_16_FLOAT, R16G16B16A16_FLOAT, WZYX),
222
	_T(R16G16B16X16_FLOAT,   16_16_16_16_FLOAT, R16G16B16A16_FLOAT, WZYX),
223
 
224
	VT(R32G32_UINT,    32_32_UINT,  R32G32_UINT, WZYX),
225
	VT(R32G32_SINT,    32_32_SINT,  R32G32_SINT, WZYX),
226
	V_(R32G32_USCALED, 32_32_UINT,  NONE,        WZYX),
227
	V_(R32G32_SSCALED, 32_32_SINT,  NONE,        WZYX),
228
	VT(R32G32_FLOAT,   32_32_FLOAT, R32G32_FLOAT,WZYX),
229
	V_(R32G32_FIXED,   32_32_FIXED, NONE,        WZYX),
230
 
231
	_T(L32A32_UINT,    32_32_UINT,  NONE,        WZYX),
232
	_T(L32A32_SINT,    32_32_SINT,  NONE,        WZYX),
233
 
234
	/* 96-bit */
235
	V_(R32G32B32_UINT,    32_32_32_UINT,  NONE, WZYX),
236
	V_(R32G32B32_SINT,    32_32_32_SINT,  NONE, WZYX),
237
	V_(R32G32B32_USCALED, 32_32_32_UINT,  NONE, WZYX),
238
	V_(R32G32B32_SSCALED, 32_32_32_SINT,  NONE, WZYX),
239
	V_(R32G32B32_FLOAT,   32_32_32_FLOAT, NONE, WZYX),
240
	V_(R32G32B32_FIXED,   32_32_32_FIXED, NONE, WZYX),
241
 
242
	/* 128-bit */
243
	VT(R32G32B32A32_UINT,    32_32_32_32_UINT,  R32G32B32A32_UINT,  WZYX),
244
	_T(R32G32B32X32_UINT,    32_32_32_32_UINT,  R32G32B32A32_UINT,  WZYX),
245
	VT(R32G32B32A32_SINT,    32_32_32_32_SINT,  R32G32B32A32_SINT,  WZYX),
246
	_T(R32G32B32X32_SINT,    32_32_32_32_SINT,  R32G32B32A32_SINT,  WZYX),
247
	V_(R32G32B32A32_USCALED, 32_32_32_32_UINT,  NONE,               WZYX),
248
	V_(R32G32B32A32_SSCALED, 32_32_32_32_SINT,  NONE,               WZYX),
249
	VT(R32G32B32A32_FLOAT,   32_32_32_32_FLOAT, R32G32B32A32_FLOAT, WZYX),
250
	_T(R32G32B32X32_FLOAT,   32_32_32_32_FLOAT, R32G32B32A32_FLOAT, WZYX),
251
	V_(R32G32B32A32_FIXED,   32_32_32_32_FIXED, NONE,               WZYX),
252
 
253
	/* compressed */
254
	_T(ETC1_RGB8, ETC1, NONE, WZYX),
255
	_T(ETC2_RGB8, ETC2_RGB8, NONE, WZYX),
256
	_T(ETC2_SRGB8, ETC2_RGB8, NONE, WZYX),
257
	_T(ETC2_RGB8A1, ETC2_RGB8A1, NONE, WZYX),
258
	_T(ETC2_SRGB8A1, ETC2_RGB8A1, NONE, WZYX),
259
	_T(ETC2_RGBA8, ETC2_RGBA8, NONE, WZYX),
260
	_T(ETC2_SRGBA8, ETC2_RGBA8, NONE, WZYX),
261
	_T(ETC2_R11_UNORM, ETC2_R11_UNORM, NONE, WZYX),
262
	_T(ETC2_R11_SNORM, ETC2_R11_SNORM, NONE, WZYX),
263
	_T(ETC2_RG11_UNORM, ETC2_RG11_UNORM, NONE, WZYX),
264
	_T(ETC2_RG11_SNORM, ETC2_RG11_SNORM, NONE, WZYX),
265
};
266
 
267
enum a3xx_vtx_fmt
268
fd3_pipe2vtx(enum pipe_format format)
269
{
270
	if (!formats[format].present)
271
		return ~0;
272
	return formats[format].vtx;
273
}
274
 
275
enum a3xx_tex_fmt
276
fd3_pipe2tex(enum pipe_format format)
277
{
278
	if (!formats[format].present)
279
		return ~0;
280
	return formats[format].tex;
281
}
282
 
283
enum a3xx_color_fmt
284
fd3_pipe2color(enum pipe_format format)
285
{
286
	if (!formats[format].present)
287
		return ~0;
288
	return formats[format].rb;
289
}
290
 
291
enum a3xx_color_swap
292
fd3_pipe2swap(enum pipe_format format)
293
{
294
	if (!formats[format].present)
295
		return WZYX;
296
	return formats[format].swap;
297
}
298
 
299
enum a3xx_tex_fetchsize
300
fd3_pipe2fetchsize(enum pipe_format format)
301
{
302
	if (format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)
303
		format = PIPE_FORMAT_Z32_FLOAT;
304
	switch (util_format_get_blocksizebits(format)) {
305
	case 8: return TFETCH_1_BYTE;
306
	case 16: return TFETCH_2_BYTE;
307
	case 32: return TFETCH_4_BYTE;
308
	case 64: return TFETCH_8_BYTE;
309
	case 128: return TFETCH_16_BYTE;
310
	default:
311
		debug_printf("Unknown block size for format %s: %d\n",
312
					 util_format_name(format),
313
					 util_format_get_blocksizebits(format));
314
		return TFETCH_DISABLE;
315
	}
316
}
317
 
318
/* we need to special case a bit the depth/stencil restore, because we are
319
 * using the texture sampler to blit into the depth/stencil buffer, *not*
320
 * into a color buffer.  Otherwise fd3_tex_swiz() will do the wrong thing,
321
 * as it is assuming that you are sampling into normal render target..
322
 */
323
enum pipe_format
324
fd3_gmem_restore_format(enum pipe_format format)
325
{
326
	switch (format) {
327
	case PIPE_FORMAT_Z24X8_UNORM:
328
	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
329
		return PIPE_FORMAT_R8G8B8A8_UNORM;
330
	case PIPE_FORMAT_Z16_UNORM:
331
		return PIPE_FORMAT_R8G8_UNORM;
332
	case PIPE_FORMAT_S8_UINT:
333
		return PIPE_FORMAT_R8_UNORM;
334
	default:
335
		return format;
336
	}
337
}
338
 
339
enum a3xx_color_fmt
340
fd3_fs_output_format(enum pipe_format format)
341
{
342
	if (util_format_is_srgb(format))
343
		return RB_R16G16B16A16_FLOAT;
344
	switch (format) {
345
	case PIPE_FORMAT_R16_FLOAT:
346
	case PIPE_FORMAT_R16G16_FLOAT:
347
	case PIPE_FORMAT_R11G11B10_FLOAT:
348
		return RB_R16G16B16A16_FLOAT;
349
	default:
350
		return fd3_pipe2color(format);
351
	}
352
}
353
 
354
static inline enum a3xx_tex_swiz
355
tex_swiz(unsigned swiz)
356
{
357
	switch (swiz) {
358
	default:
359
	case PIPE_SWIZZLE_RED:   return A3XX_TEX_X;
360
	case PIPE_SWIZZLE_GREEN: return A3XX_TEX_Y;
361
	case PIPE_SWIZZLE_BLUE:  return A3XX_TEX_Z;
362
	case PIPE_SWIZZLE_ALPHA: return A3XX_TEX_W;
363
	case PIPE_SWIZZLE_ZERO:  return A3XX_TEX_ZERO;
364
	case PIPE_SWIZZLE_ONE:   return A3XX_TEX_ONE;
365
	}
366
}
367
 
368
uint32_t
369
fd3_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g,
370
		unsigned swizzle_b, unsigned swizzle_a)
371
{
372
	const struct util_format_description *desc =
373
			util_format_description(format);
374
	unsigned char swiz[4] = {
375
			swizzle_r, swizzle_g, swizzle_b, swizzle_a,
376
	}, rswiz[4];
377
 
378
	util_format_compose_swizzles(desc->swizzle, swiz, rswiz);
379
 
380
	return A3XX_TEX_CONST_0_SWIZ_X(tex_swiz(rswiz[0])) |
381
			A3XX_TEX_CONST_0_SWIZ_Y(tex_swiz(rswiz[1])) |
382
			A3XX_TEX_CONST_0_SWIZ_Z(tex_swiz(rswiz[2])) |
383
			A3XX_TEX_CONST_0_SWIZ_W(tex_swiz(rswiz[3]));
384
}