svga: split / update svga3d header files
[mesa.git] / src / gallium / drivers / svga / svga_format.c
1 /**********************************************************
2 * Copyright 2011 VMware, Inc. All rights reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 *
24 **********************************************************/
25
26
27 #include "pipe/p_format.h"
28 #include "util/u_debug.h"
29 #include "util/u_memory.h"
30
31 #include "svga_winsys.h"
32 #include "svga_screen.h"
33 #include "svga_format.h"
34
35
36 /*
37 * Translate from gallium format to SVGA3D format.
38 */
39 SVGA3dSurfaceFormat
40 svga_translate_format(struct svga_screen *ss,
41 enum pipe_format format,
42 unsigned bind)
43 {
44 switch(format) {
45
46 case PIPE_FORMAT_B8G8R8A8_UNORM:
47 return SVGA3D_A8R8G8B8;
48 case PIPE_FORMAT_B8G8R8X8_UNORM:
49 return SVGA3D_X8R8G8B8;
50
51 /* sRGB required for GL2.1 */
52 case PIPE_FORMAT_B8G8R8A8_SRGB:
53 return SVGA3D_A8R8G8B8;
54 case PIPE_FORMAT_DXT1_SRGB:
55 case PIPE_FORMAT_DXT1_SRGBA:
56 return SVGA3D_DXT1;
57 case PIPE_FORMAT_DXT3_SRGBA:
58 return SVGA3D_DXT3;
59 case PIPE_FORMAT_DXT5_SRGBA:
60 return SVGA3D_DXT5;
61
62 case PIPE_FORMAT_B5G6R5_UNORM:
63 return SVGA3D_R5G6B5;
64 case PIPE_FORMAT_B5G5R5A1_UNORM:
65 return SVGA3D_A1R5G5B5;
66 case PIPE_FORMAT_B4G4R4A4_UNORM:
67 return SVGA3D_A4R4G4B4;
68
69 case PIPE_FORMAT_R16G16B16A16_UNORM:
70 return SVGA3D_A16B16G16R16;
71
72 case PIPE_FORMAT_Z16_UNORM:
73 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16;
74 case PIPE_FORMAT_S8_UINT_Z24_UNORM:
75 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8;
76 case PIPE_FORMAT_X8Z24_UNORM:
77 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8;
78
79 case PIPE_FORMAT_A8_UNORM:
80 return SVGA3D_ALPHA8;
81 case PIPE_FORMAT_L8_UNORM:
82 return SVGA3D_LUMINANCE8;
83
84 case PIPE_FORMAT_DXT1_RGB:
85 case PIPE_FORMAT_DXT1_RGBA:
86 return SVGA3D_DXT1;
87 case PIPE_FORMAT_DXT3_RGBA:
88 return SVGA3D_DXT3;
89 case PIPE_FORMAT_DXT5_RGBA:
90 return SVGA3D_DXT5;
91
92 /* Float formats (only 1, 2 and 4-component formats supported) */
93 case PIPE_FORMAT_R32_FLOAT:
94 return SVGA3D_R_S23E8;
95 case PIPE_FORMAT_R32G32_FLOAT:
96 return SVGA3D_RG_S23E8;
97 case PIPE_FORMAT_R32G32B32A32_FLOAT:
98 return SVGA3D_ARGB_S23E8;
99 case PIPE_FORMAT_R16_FLOAT:
100 return SVGA3D_R_S10E5;
101 case PIPE_FORMAT_R16G16_FLOAT:
102 return SVGA3D_RG_S10E5;
103 case PIPE_FORMAT_R16G16B16A16_FLOAT:
104 return SVGA3D_ARGB_S10E5;
105
106 case PIPE_FORMAT_Z32_UNORM:
107 /* SVGA3D_Z_D32 is not yet unsupported */
108 /* fall-through */
109 default:
110 return SVGA3D_FORMAT_INVALID;
111 }
112 }
113
114
115 /*
116 * Format capability description entry.
117 */
118 struct format_cap {
119 SVGA3dSurfaceFormat format;
120
121 /*
122 * Capability index corresponding to the format.
123 */
124 SVGA3dDevCapIndex index;
125
126 /*
127 * Mask of supported SVGA3dFormatOp operations, to be inferred when the
128 * capability is not explicitly present.
129 */
130 uint32 defaultOperations;
131 };
132
133
134 /*
135 * Format capability description table.
136 *
137 * Ordererd by increasing SVGA3dSurfaceFormat value, but with gaps.
138 */
139 static const struct format_cap format_cap_table[] = {
140 {
141 SVGA3D_X8R8G8B8,
142 SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8,
143 SVGA3DFORMAT_OP_TEXTURE |
144 SVGA3DFORMAT_OP_CUBETEXTURE |
145 SVGA3DFORMAT_OP_VOLUMETEXTURE |
146 SVGA3DFORMAT_OP_DISPLAYMODE |
147 SVGA3DFORMAT_OP_3DACCELERATION |
148 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
149 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
150 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
151 SVGA3DFORMAT_OP_SRGBREAD |
152 SVGA3DFORMAT_OP_SRGBWRITE |
153 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
154 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
155 },
156 {
157 SVGA3D_A8R8G8B8,
158 SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8,
159 SVGA3DFORMAT_OP_TEXTURE |
160 SVGA3DFORMAT_OP_CUBETEXTURE |
161 SVGA3DFORMAT_OP_VOLUMETEXTURE |
162 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
163 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
164 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
165 SVGA3DFORMAT_OP_SRGBREAD |
166 SVGA3DFORMAT_OP_SRGBWRITE |
167 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
168 SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
169 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
170 },
171 {
172 SVGA3D_R5G6B5,
173 SVGA3D_DEVCAP_SURFACEFMT_R5G6B5,
174 SVGA3DFORMAT_OP_TEXTURE |
175 SVGA3DFORMAT_OP_CUBETEXTURE |
176 SVGA3DFORMAT_OP_VOLUMETEXTURE |
177 SVGA3DFORMAT_OP_DISPLAYMODE |
178 SVGA3DFORMAT_OP_3DACCELERATION |
179 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
180 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
181 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
182 SVGA3DFORMAT_OP_SRGBREAD |
183 SVGA3DFORMAT_OP_SRGBWRITE |
184 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
185 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
186 },
187 {
188 SVGA3D_X1R5G5B5,
189 SVGA3D_DEVCAP_SURFACEFMT_X1R5G5B5,
190 SVGA3DFORMAT_OP_TEXTURE |
191 SVGA3DFORMAT_OP_CUBETEXTURE |
192 SVGA3DFORMAT_OP_VOLUMETEXTURE |
193 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
194 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
195 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
196 SVGA3DFORMAT_OP_SRGBREAD |
197 SVGA3DFORMAT_OP_SRGBWRITE |
198 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
199 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
200 },
201 {
202 SVGA3D_A1R5G5B5,
203 SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5,
204 SVGA3DFORMAT_OP_TEXTURE |
205 SVGA3DFORMAT_OP_CUBETEXTURE |
206 SVGA3DFORMAT_OP_VOLUMETEXTURE |
207 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
208 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
209 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
210 SVGA3DFORMAT_OP_SRGBREAD |
211 SVGA3DFORMAT_OP_SRGBWRITE |
212 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
213 SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
214 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
215 },
216 {
217 SVGA3D_A4R4G4B4,
218 SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4,
219 SVGA3DFORMAT_OP_TEXTURE |
220 SVGA3DFORMAT_OP_CUBETEXTURE |
221 SVGA3DFORMAT_OP_VOLUMETEXTURE |
222 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
223 SVGA3DFORMAT_OP_SRGBREAD |
224 SVGA3DFORMAT_OP_SRGBWRITE |
225 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
226 SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
227 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
228 },
229 /*
230 * SVGA3D_Z_D32 is not yet supported, and has no corresponding
231 * SVGA3D_DEVCAP_xxx.
232 */
233 {
234 SVGA3D_Z_D16,
235 SVGA3D_DEVCAP_SURFACEFMT_Z_D16,
236 SVGA3DFORMAT_OP_ZSTENCIL |
237 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
238 },
239 {
240 SVGA3D_Z_D24S8,
241 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8,
242 SVGA3DFORMAT_OP_ZSTENCIL |
243 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
244 },
245 {
246 SVGA3D_Z_D15S1,
247 SVGA3D_DEVCAP_MAX,
248 SVGA3DFORMAT_OP_ZSTENCIL |
249 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
250 },
251 {
252 SVGA3D_LUMINANCE8,
253 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8,
254 SVGA3DFORMAT_OP_TEXTURE |
255 SVGA3DFORMAT_OP_CUBETEXTURE |
256 SVGA3DFORMAT_OP_VOLUMETEXTURE |
257 SVGA3DFORMAT_OP_OFFSCREENPLAIN
258 },
259 {
260 SVGA3D_LUMINANCE8_ALPHA8,
261 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8_ALPHA8,
262 SVGA3DFORMAT_OP_TEXTURE |
263 SVGA3DFORMAT_OP_CUBETEXTURE |
264 SVGA3DFORMAT_OP_VOLUMETEXTURE |
265 SVGA3DFORMAT_OP_OFFSCREENPLAIN
266 },
267 /*
268 * SVGA3D_LUMINANCE4_ALPHA4 is not supported, and has no corresponding
269 * SVGA3D_DEVCAP_xxx.
270 */
271 {
272 SVGA3D_LUMINANCE16,
273 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE16,
274 SVGA3DFORMAT_OP_TEXTURE |
275 SVGA3DFORMAT_OP_CUBETEXTURE |
276 SVGA3DFORMAT_OP_VOLUMETEXTURE |
277 SVGA3DFORMAT_OP_OFFSCREENPLAIN
278 },
279 {
280 SVGA3D_DXT1,
281 SVGA3D_DEVCAP_SURFACEFMT_DXT1,
282 SVGA3DFORMAT_OP_TEXTURE |
283 SVGA3DFORMAT_OP_SRGBREAD |
284 SVGA3DFORMAT_OP_CUBETEXTURE |
285 SVGA3DFORMAT_OP_OFFSCREENPLAIN
286 },
287 {
288 SVGA3D_DXT2,
289 SVGA3D_DEVCAP_SURFACEFMT_DXT2,
290 SVGA3DFORMAT_OP_TEXTURE |
291 SVGA3DFORMAT_OP_SRGBREAD |
292 SVGA3DFORMAT_OP_CUBETEXTURE |
293 SVGA3DFORMAT_OP_OFFSCREENPLAIN
294 },
295 {
296 SVGA3D_DXT3,
297 SVGA3D_DEVCAP_SURFACEFMT_DXT3,
298 SVGA3DFORMAT_OP_TEXTURE |
299 SVGA3DFORMAT_OP_SRGBREAD |
300 SVGA3DFORMAT_OP_CUBETEXTURE |
301 SVGA3DFORMAT_OP_OFFSCREENPLAIN
302 },
303 {
304 SVGA3D_DXT4,
305 SVGA3D_DEVCAP_SURFACEFMT_DXT4,
306 SVGA3DFORMAT_OP_TEXTURE |
307 SVGA3DFORMAT_OP_SRGBREAD |
308 SVGA3DFORMAT_OP_CUBETEXTURE |
309 SVGA3DFORMAT_OP_OFFSCREENPLAIN
310 },
311 {
312 SVGA3D_DXT5,
313 SVGA3D_DEVCAP_SURFACEFMT_DXT5,
314 SVGA3DFORMAT_OP_TEXTURE |
315 SVGA3DFORMAT_OP_SRGBREAD |
316 SVGA3DFORMAT_OP_CUBETEXTURE |
317 SVGA3DFORMAT_OP_OFFSCREENPLAIN
318 },
319 {
320 SVGA3D_BUMPU8V8,
321 SVGA3D_DEVCAP_SURFACEFMT_BUMPU8V8,
322 SVGA3DFORMAT_OP_TEXTURE |
323 SVGA3DFORMAT_OP_CUBETEXTURE |
324 SVGA3DFORMAT_OP_VOLUMETEXTURE |
325 SVGA3DFORMAT_OP_BUMPMAP |
326 SVGA3DFORMAT_OP_OFFSCREENPLAIN
327 },
328 /*
329 * SVGA3D_BUMPL6V5U5 is unsupported; it has no corresponding
330 * SVGA3D_DEVCAP_xxx.
331 */
332 {
333 SVGA3D_BUMPX8L8V8U8,
334 SVGA3D_DEVCAP_SURFACEFMT_BUMPX8L8V8U8,
335 SVGA3DFORMAT_OP_TEXTURE |
336 SVGA3DFORMAT_OP_CUBETEXTURE |
337 SVGA3DFORMAT_OP_BUMPMAP |
338 SVGA3DFORMAT_OP_OFFSCREENPLAIN
339 },
340 /*
341 * SVGA3D_BUMPL8V8U8 is unsupported; it has no corresponding
342 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
343 */
344 {
345 SVGA3D_ARGB_S10E5,
346 SVGA3D_DEVCAP_SURFACEFMT_ARGB_S10E5,
347 SVGA3DFORMAT_OP_TEXTURE |
348 SVGA3DFORMAT_OP_CUBETEXTURE |
349 SVGA3DFORMAT_OP_VOLUMETEXTURE |
350 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
351 SVGA3DFORMAT_OP_SRGBREAD |
352 SVGA3DFORMAT_OP_SRGBWRITE |
353 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
354 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
355 },
356 {
357 SVGA3D_ARGB_S23E8,
358 SVGA3D_DEVCAP_SURFACEFMT_ARGB_S23E8,
359 SVGA3DFORMAT_OP_TEXTURE |
360 SVGA3DFORMAT_OP_CUBETEXTURE |
361 SVGA3DFORMAT_OP_VOLUMETEXTURE |
362 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
363 SVGA3DFORMAT_OP_SRGBREAD |
364 SVGA3DFORMAT_OP_SRGBWRITE |
365 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
366 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
367 },
368 {
369 SVGA3D_A2R10G10B10,
370 SVGA3D_DEVCAP_SURFACEFMT_A2R10G10B10,
371 SVGA3DFORMAT_OP_TEXTURE |
372 SVGA3DFORMAT_OP_CUBETEXTURE |
373 SVGA3DFORMAT_OP_VOLUMETEXTURE |
374 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
375 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
376 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
377 SVGA3DFORMAT_OP_SRGBREAD |
378 SVGA3DFORMAT_OP_SRGBWRITE |
379 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
380 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
381 },
382 /*
383 * SVGA3D_V8U8 is unsupported; it has no corresponding
384 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPU8V8 should be used instead.
385 */
386 {
387 SVGA3D_Q8W8V8U8,
388 SVGA3D_DEVCAP_SURFACEFMT_Q8W8V8U8,
389 SVGA3DFORMAT_OP_TEXTURE |
390 SVGA3DFORMAT_OP_CUBETEXTURE |
391 SVGA3DFORMAT_OP_BUMPMAP |
392 SVGA3DFORMAT_OP_OFFSCREENPLAIN
393 },
394 {
395 SVGA3D_CxV8U8,
396 SVGA3D_DEVCAP_SURFACEFMT_CxV8U8,
397 SVGA3DFORMAT_OP_TEXTURE |
398 SVGA3DFORMAT_OP_BUMPMAP |
399 SVGA3DFORMAT_OP_OFFSCREENPLAIN
400 },
401 /*
402 * SVGA3D_X8L8V8U8 is unsupported; it has no corresponding
403 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
404 */
405 {
406 SVGA3D_A2W10V10U10,
407 SVGA3D_DEVCAP_SURFACEFMT_A2W10V10U10,
408 SVGA3DFORMAT_OP_TEXTURE |
409 SVGA3DFORMAT_OP_BUMPMAP |
410 SVGA3DFORMAT_OP_OFFSCREENPLAIN
411 },
412 {
413 SVGA3D_ALPHA8,
414 SVGA3D_DEVCAP_SURFACEFMT_ALPHA8,
415 SVGA3DFORMAT_OP_TEXTURE |
416 SVGA3DFORMAT_OP_CUBETEXTURE |
417 SVGA3DFORMAT_OP_VOLUMETEXTURE |
418 SVGA3DFORMAT_OP_OFFSCREENPLAIN
419 },
420 {
421 SVGA3D_R_S10E5,
422 SVGA3D_DEVCAP_SURFACEFMT_R_S10E5,
423 SVGA3DFORMAT_OP_TEXTURE |
424 SVGA3DFORMAT_OP_VOLUMETEXTURE |
425 SVGA3DFORMAT_OP_CUBETEXTURE |
426 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
427 SVGA3DFORMAT_OP_SRGBREAD |
428 SVGA3DFORMAT_OP_SRGBWRITE |
429 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
430 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
431 },
432 {
433 SVGA3D_R_S23E8,
434 SVGA3D_DEVCAP_SURFACEFMT_R_S23E8,
435 SVGA3DFORMAT_OP_TEXTURE |
436 SVGA3DFORMAT_OP_VOLUMETEXTURE |
437 SVGA3DFORMAT_OP_CUBETEXTURE |
438 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
439 SVGA3DFORMAT_OP_SRGBREAD |
440 SVGA3DFORMAT_OP_SRGBWRITE |
441 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
442 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
443 },
444 {
445 SVGA3D_RG_S10E5,
446 SVGA3D_DEVCAP_SURFACEFMT_RG_S10E5,
447 SVGA3DFORMAT_OP_TEXTURE |
448 SVGA3DFORMAT_OP_VOLUMETEXTURE |
449 SVGA3DFORMAT_OP_CUBETEXTURE |
450 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
451 SVGA3DFORMAT_OP_SRGBREAD |
452 SVGA3DFORMAT_OP_SRGBWRITE |
453 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
454 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
455 },
456 {
457 SVGA3D_RG_S23E8,
458 SVGA3D_DEVCAP_SURFACEFMT_RG_S23E8,
459 SVGA3DFORMAT_OP_TEXTURE |
460 SVGA3DFORMAT_OP_VOLUMETEXTURE |
461 SVGA3DFORMAT_OP_CUBETEXTURE |
462 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
463 SVGA3DFORMAT_OP_SRGBREAD |
464 SVGA3DFORMAT_OP_SRGBWRITE |
465 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
466 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
467 },
468 /*
469 * SVGA3D_BUFFER is a placeholder format for index/vertex buffers.
470 */
471 {
472 SVGA3D_Z_D24X8,
473 SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8,
474 SVGA3DFORMAT_OP_ZSTENCIL |
475 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
476 },
477 {
478 SVGA3D_V16U16,
479 SVGA3D_DEVCAP_SURFACEFMT_V16U16,
480 SVGA3DFORMAT_OP_TEXTURE |
481 SVGA3DFORMAT_OP_CUBETEXTURE |
482 SVGA3DFORMAT_OP_VOLUMETEXTURE |
483 SVGA3DFORMAT_OP_BUMPMAP |
484 SVGA3DFORMAT_OP_OFFSCREENPLAIN
485 },
486 {
487 SVGA3D_G16R16,
488 SVGA3D_DEVCAP_SURFACEFMT_G16R16,
489 SVGA3DFORMAT_OP_TEXTURE |
490 SVGA3DFORMAT_OP_CUBETEXTURE |
491 SVGA3DFORMAT_OP_VOLUMETEXTURE |
492 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
493 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
494 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
495 },
496 {
497 SVGA3D_A16B16G16R16,
498 SVGA3D_DEVCAP_SURFACEFMT_A16B16G16R16,
499 SVGA3DFORMAT_OP_TEXTURE |
500 SVGA3DFORMAT_OP_CUBETEXTURE |
501 SVGA3DFORMAT_OP_VOLUMETEXTURE |
502 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
503 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
504 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
505 },
506 {
507 SVGA3D_UYVY,
508 SVGA3D_DEVCAP_SURFACEFMT_UYVY,
509 0
510 },
511 {
512 SVGA3D_YUY2,
513 SVGA3D_DEVCAP_SURFACEFMT_YUY2,
514 0
515 },
516 {
517 SVGA3D_NV12,
518 SVGA3D_DEVCAP_SURFACEFMT_NV12,
519 0
520 },
521 {
522 SVGA3D_AYUV,
523 SVGA3D_DEVCAP_SURFACEFMT_AYUV,
524 0
525 },
526 {
527 SVGA3D_Z_DF16,
528 SVGA3D_DEVCAP_SURFACEFMT_Z_DF16,
529 0
530 },
531 {
532 SVGA3D_Z_DF24,
533 SVGA3D_DEVCAP_SURFACEFMT_Z_DF24,
534 0
535 },
536 {
537 SVGA3D_Z_D24S8_INT,
538 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT,
539 0
540 },
541 };
542
543
544 /*
545 * Get format capabilities from the host. It takes in consideration
546 * deprecated/unsupported formats, and formats which are implicitely assumed to
547 * be supported when the host does not provide an explicit capability entry.
548 */
549 void
550 svga_get_format_cap(struct svga_screen *ss,
551 SVGA3dSurfaceFormat format,
552 SVGA3dSurfaceFormatCaps *caps)
553 {
554 const struct format_cap *entry;
555
556 for (entry = format_cap_table; entry < format_cap_table + Elements(format_cap_table); ++entry) {
557 if (entry->format == format) {
558 struct svga_winsys_screen *sws = ss->sws;
559 SVGA3dDevCapResult result;
560
561 if (sws->get_cap(sws, entry->index, &result)) {
562 /* Explicitly advertised format */
563 caps->value = result.u;
564 } else {
565 /* Implicitly advertised format -- use default caps */
566 caps->value = entry->defaultOperations;
567 }
568
569 return;
570 }
571 }
572
573 /* Unsupported format */
574 caps->value = 0;
575 }
576
577
578 /**
579 * Return block size and bytes per block for the given SVGA3D format.
580 * block_width and block_height are one for uncompressed formats and
581 * greater than one for compressed formats.
582 * Note: we don't handle formats that are unsupported, according to
583 * the format_cap_table above.
584 */
585 void
586 svga_format_size(SVGA3dSurfaceFormat format,
587 unsigned *block_width,
588 unsigned *block_height,
589 unsigned *bytes_per_block)
590 {
591 *block_width = *block_height = 1;
592
593 switch (format) {
594 case SVGA3D_X8R8G8B8:
595 case SVGA3D_A8R8G8B8:
596 *bytes_per_block = 4;
597 return;
598
599 case SVGA3D_R5G6B5:
600 case SVGA3D_X1R5G5B5:
601 case SVGA3D_A1R5G5B5:
602 case SVGA3D_A4R4G4B4:
603 *bytes_per_block = 2;
604 return;
605
606 case SVGA3D_Z_D32:
607 *bytes_per_block = 4;
608 return;
609
610 case SVGA3D_Z_D16:
611 *bytes_per_block = 2;
612 return;
613
614 case SVGA3D_Z_D24S8:
615 *bytes_per_block = 4;
616 return;
617
618 case SVGA3D_Z_D15S1:
619 *bytes_per_block = 2;
620 return;
621
622 case SVGA3D_LUMINANCE8:
623 case SVGA3D_LUMINANCE4_ALPHA4:
624 *bytes_per_block = 1;
625 return;
626
627 case SVGA3D_LUMINANCE16:
628 case SVGA3D_LUMINANCE8_ALPHA8:
629 *bytes_per_block = 2;
630 return;
631
632 case SVGA3D_DXT1:
633 case SVGA3D_DXT2:
634 *block_width = *block_height = 4;
635 *bytes_per_block = 8;
636 return;
637
638 case SVGA3D_DXT3:
639 case SVGA3D_DXT4:
640 case SVGA3D_DXT5:
641 *block_width = *block_height = 4;
642 *bytes_per_block = 16;
643 return;
644
645 case SVGA3D_BUMPU8V8:
646 case SVGA3D_BUMPL6V5U5:
647 *bytes_per_block = 2;
648 return;
649
650 case SVGA3D_BUMPX8L8V8U8:
651 *bytes_per_block = 4;
652 return;
653
654 case SVGA3D_ARGB_S10E5:
655 *bytes_per_block = 8;
656 return;
657
658 case SVGA3D_ARGB_S23E8:
659 *bytes_per_block = 16;
660 return;
661
662 case SVGA3D_A2R10G10B10:
663 *bytes_per_block = 4;
664 return;
665
666 case SVGA3D_Q8W8V8U8:
667 *bytes_per_block = 4;
668 return;
669
670 case SVGA3D_CxV8U8:
671 *bytes_per_block = 2;
672 return;
673
674 case SVGA3D_X8L8V8U8:
675 case SVGA3D_A2W10V10U10:
676 *bytes_per_block = 4;
677 return;
678
679 case SVGA3D_ALPHA8:
680 *bytes_per_block = 1;
681 return;
682
683 case SVGA3D_R_S10E5:
684 *bytes_per_block = 2;
685 return;
686 case SVGA3D_R_S23E8:
687 *bytes_per_block = 4;
688 return;
689 case SVGA3D_RG_S10E5:
690 *bytes_per_block = 4;
691 return;
692 case SVGA3D_RG_S23E8:
693 *bytes_per_block = 8;
694 return;
695
696 case SVGA3D_BUFFER:
697 *bytes_per_block = 1;
698 return;
699
700 case SVGA3D_Z_D24X8:
701 *bytes_per_block = 4;
702 return;
703
704 case SVGA3D_V16U16:
705 *bytes_per_block = 4;
706 return;
707
708 case SVGA3D_G16R16:
709 *bytes_per_block = 4;
710 return;
711
712 case SVGA3D_A16B16G16R16:
713 *bytes_per_block = 8;
714 return;
715
716 case SVGA3D_Z_DF16:
717 *bytes_per_block = 2;
718 return;
719 case SVGA3D_Z_DF24:
720 *bytes_per_block = 4;
721 return;
722 case SVGA3D_Z_D24S8_INT:
723 *bytes_per_block = 4;
724 return;
725
726 default:
727 debug_printf("format %u\n", (unsigned) format);
728 assert(!"unexpected format in svga_format_size()");
729 *bytes_per_block = 4;
730 }
731 }