svga: add translation for float formats
[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 /* Required for GL2.1:
52 */
53 case PIPE_FORMAT_B8G8R8A8_SRGB:
54 return SVGA3D_A8R8G8B8;
55
56 case PIPE_FORMAT_B5G6R5_UNORM:
57 return SVGA3D_R5G6B5;
58 case PIPE_FORMAT_B5G5R5A1_UNORM:
59 return SVGA3D_A1R5G5B5;
60 case PIPE_FORMAT_B4G4R4A4_UNORM:
61 return SVGA3D_A4R4G4B4;
62
63 case PIPE_FORMAT_Z16_UNORM:
64 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16;
65 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
66 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8;
67 case PIPE_FORMAT_X8Z24_UNORM:
68 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8;
69
70 case PIPE_FORMAT_A8_UNORM:
71 return SVGA3D_ALPHA8;
72 case PIPE_FORMAT_L8_UNORM:
73 return SVGA3D_LUMINANCE8;
74
75 case PIPE_FORMAT_DXT1_RGB:
76 case PIPE_FORMAT_DXT1_RGBA:
77 return SVGA3D_DXT1;
78 case PIPE_FORMAT_DXT3_RGBA:
79 return SVGA3D_DXT3;
80 case PIPE_FORMAT_DXT5_RGBA:
81 return SVGA3D_DXT5;
82
83 /* Float formats (only 1, 2 and 4-component formats supported) */
84 case PIPE_FORMAT_R32_FLOAT:
85 return SVGA3D_R_S23E8;
86 case PIPE_FORMAT_R32G32_FLOAT:
87 return SVGA3D_RG_S23E8;
88 case PIPE_FORMAT_R32G32B32A32_FLOAT:
89 return SVGA3D_ARGB_S23E8;
90 case PIPE_FORMAT_R16_FLOAT:
91 return SVGA3D_R_S10E5;
92 case PIPE_FORMAT_R16G16_FLOAT:
93 return SVGA3D_RG_S10E5;
94 case PIPE_FORMAT_R16G16B16A16_FLOAT:
95 return SVGA3D_ARGB_S10E5;
96
97 case PIPE_FORMAT_Z32_UNORM:
98 /* SVGA3D_Z_D32 is not yet unsupported */
99 /* fall-through */
100 default:
101 return SVGA3D_FORMAT_INVALID;
102 }
103 }
104
105
106 /*
107 * Format capability description entry.
108 */
109 struct format_cap {
110 SVGA3dSurfaceFormat format;
111
112 /*
113 * Capability index corresponding to the format.
114 */
115 SVGA3dDevCapIndex index;
116
117 /*
118 * Mask of supported SVGA3dFormatOp operations, to be inferred when the
119 * capability is not explicitly present.
120 */
121 uint32 defaultOperations;
122 };
123
124
125 /*
126 * Format capability description table.
127 *
128 * Ordererd by increasing SVGA3dSurfaceFormat value, but with gaps.
129 */
130 static const struct format_cap format_cap_table[] = {
131 {
132 SVGA3D_X8R8G8B8,
133 SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8,
134 SVGA3DFORMAT_OP_TEXTURE |
135 SVGA3DFORMAT_OP_CUBETEXTURE |
136 SVGA3DFORMAT_OP_VOLUMETEXTURE |
137 SVGA3DFORMAT_OP_DISPLAYMODE |
138 SVGA3DFORMAT_OP_3DACCELERATION |
139 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
140 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
141 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
142 SVGA3DFORMAT_OP_SRGBREAD |
143 SVGA3DFORMAT_OP_SRGBWRITE |
144 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
145 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
146 },
147 {
148 SVGA3D_A8R8G8B8,
149 SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8,
150 SVGA3DFORMAT_OP_TEXTURE |
151 SVGA3DFORMAT_OP_CUBETEXTURE |
152 SVGA3DFORMAT_OP_VOLUMETEXTURE |
153 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
154 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
155 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
156 SVGA3DFORMAT_OP_SRGBREAD |
157 SVGA3DFORMAT_OP_SRGBWRITE |
158 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
159 SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
160 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
161 },
162 {
163 SVGA3D_R5G6B5,
164 SVGA3D_DEVCAP_SURFACEFMT_R5G6B5,
165 SVGA3DFORMAT_OP_TEXTURE |
166 SVGA3DFORMAT_OP_CUBETEXTURE |
167 SVGA3DFORMAT_OP_VOLUMETEXTURE |
168 SVGA3DFORMAT_OP_DISPLAYMODE |
169 SVGA3DFORMAT_OP_3DACCELERATION |
170 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
171 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
172 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
173 SVGA3DFORMAT_OP_SRGBREAD |
174 SVGA3DFORMAT_OP_SRGBWRITE |
175 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
176 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
177 },
178 {
179 SVGA3D_X1R5G5B5,
180 SVGA3D_DEVCAP_SURFACEFMT_X1R5G5B5,
181 SVGA3DFORMAT_OP_TEXTURE |
182 SVGA3DFORMAT_OP_CUBETEXTURE |
183 SVGA3DFORMAT_OP_VOLUMETEXTURE |
184 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
185 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
186 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
187 SVGA3DFORMAT_OP_SRGBREAD |
188 SVGA3DFORMAT_OP_SRGBWRITE |
189 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
190 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
191 },
192 {
193 SVGA3D_A1R5G5B5,
194 SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5,
195 SVGA3DFORMAT_OP_TEXTURE |
196 SVGA3DFORMAT_OP_CUBETEXTURE |
197 SVGA3DFORMAT_OP_VOLUMETEXTURE |
198 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
199 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
200 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
201 SVGA3DFORMAT_OP_SRGBREAD |
202 SVGA3DFORMAT_OP_SRGBWRITE |
203 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
204 SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
205 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
206 },
207 {
208 SVGA3D_A4R4G4B4,
209 SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4,
210 SVGA3DFORMAT_OP_TEXTURE |
211 SVGA3DFORMAT_OP_CUBETEXTURE |
212 SVGA3DFORMAT_OP_VOLUMETEXTURE |
213 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
214 SVGA3DFORMAT_OP_SRGBREAD |
215 SVGA3DFORMAT_OP_SRGBWRITE |
216 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
217 SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
218 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
219 },
220 /*
221 * SVGA3D_Z_D32 is not yet supported, and has no corresponding
222 * SVGA3D_DEVCAP_xxx.
223 */
224 {
225 SVGA3D_Z_D16,
226 SVGA3D_DEVCAP_SURFACEFMT_Z_D16,
227 SVGA3DFORMAT_OP_ZSTENCIL |
228 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
229 },
230 {
231 SVGA3D_Z_D24S8,
232 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8,
233 SVGA3DFORMAT_OP_ZSTENCIL |
234 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
235 },
236 {
237 SVGA3D_Z_D15S1,
238 SVGA3D_DEVCAP_MAX,
239 SVGA3DFORMAT_OP_ZSTENCIL |
240 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
241 },
242 {
243 SVGA3D_LUMINANCE8,
244 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8,
245 SVGA3DFORMAT_OP_TEXTURE |
246 SVGA3DFORMAT_OP_CUBETEXTURE |
247 SVGA3DFORMAT_OP_VOLUMETEXTURE |
248 SVGA3DFORMAT_OP_OFFSCREENPLAIN
249 },
250 {
251 SVGA3D_LUMINANCE8_ALPHA8,
252 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8_ALPHA8,
253 SVGA3DFORMAT_OP_TEXTURE |
254 SVGA3DFORMAT_OP_CUBETEXTURE |
255 SVGA3DFORMAT_OP_VOLUMETEXTURE |
256 SVGA3DFORMAT_OP_OFFSCREENPLAIN
257 },
258 /*
259 * SVGA3D_LUMINANCE4_ALPHA4 is not supported, and has no corresponding
260 * SVGA3D_DEVCAP_xxx.
261 */
262 {
263 SVGA3D_LUMINANCE16,
264 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE16,
265 SVGA3DFORMAT_OP_TEXTURE |
266 SVGA3DFORMAT_OP_CUBETEXTURE |
267 SVGA3DFORMAT_OP_VOLUMETEXTURE |
268 SVGA3DFORMAT_OP_OFFSCREENPLAIN
269 },
270 {
271 SVGA3D_DXT1,
272 SVGA3D_DEVCAP_SURFACEFMT_DXT1,
273 SVGA3DFORMAT_OP_TEXTURE |
274 SVGA3DFORMAT_OP_SRGBREAD |
275 SVGA3DFORMAT_OP_CUBETEXTURE |
276 SVGA3DFORMAT_OP_OFFSCREENPLAIN
277 },
278 {
279 SVGA3D_DXT2,
280 SVGA3D_DEVCAP_SURFACEFMT_DXT2,
281 SVGA3DFORMAT_OP_TEXTURE |
282 SVGA3DFORMAT_OP_SRGBREAD |
283 SVGA3DFORMAT_OP_CUBETEXTURE |
284 SVGA3DFORMAT_OP_OFFSCREENPLAIN
285 },
286 {
287 SVGA3D_DXT3,
288 SVGA3D_DEVCAP_SURFACEFMT_DXT3,
289 SVGA3DFORMAT_OP_TEXTURE |
290 SVGA3DFORMAT_OP_SRGBREAD |
291 SVGA3DFORMAT_OP_CUBETEXTURE |
292 SVGA3DFORMAT_OP_OFFSCREENPLAIN
293 },
294 {
295 SVGA3D_DXT4,
296 SVGA3D_DEVCAP_SURFACEFMT_DXT4,
297 SVGA3DFORMAT_OP_TEXTURE |
298 SVGA3DFORMAT_OP_SRGBREAD |
299 SVGA3DFORMAT_OP_CUBETEXTURE |
300 SVGA3DFORMAT_OP_OFFSCREENPLAIN
301 },
302 {
303 SVGA3D_DXT5,
304 SVGA3D_DEVCAP_SURFACEFMT_DXT5,
305 SVGA3DFORMAT_OP_TEXTURE |
306 SVGA3DFORMAT_OP_SRGBREAD |
307 SVGA3DFORMAT_OP_CUBETEXTURE |
308 SVGA3DFORMAT_OP_OFFSCREENPLAIN
309 },
310 {
311 SVGA3D_BUMPU8V8,
312 SVGA3D_DEVCAP_SURFACEFMT_BUMPU8V8,
313 SVGA3DFORMAT_OP_TEXTURE |
314 SVGA3DFORMAT_OP_CUBETEXTURE |
315 SVGA3DFORMAT_OP_VOLUMETEXTURE |
316 SVGA3DFORMAT_OP_BUMPMAP |
317 SVGA3DFORMAT_OP_OFFSCREENPLAIN
318 },
319 /*
320 * SVGA3D_BUMPL6V5U5 is unsupported; it has no corresponding
321 * SVGA3D_DEVCAP_xxx.
322 */
323 {
324 SVGA3D_BUMPX8L8V8U8,
325 SVGA3D_DEVCAP_SURFACEFMT_BUMPX8L8V8U8,
326 SVGA3DFORMAT_OP_TEXTURE |
327 SVGA3DFORMAT_OP_CUBETEXTURE |
328 SVGA3DFORMAT_OP_BUMPMAP |
329 SVGA3DFORMAT_OP_OFFSCREENPLAIN
330 },
331 /*
332 * SVGA3D_BUMPL8V8U8 is unsupported; it has no corresponding
333 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
334 */
335 {
336 SVGA3D_ARGB_S10E5,
337 SVGA3D_DEVCAP_SURFACEFMT_ARGB_S10E5,
338 SVGA3DFORMAT_OP_TEXTURE |
339 SVGA3DFORMAT_OP_CUBETEXTURE |
340 SVGA3DFORMAT_OP_VOLUMETEXTURE |
341 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
342 SVGA3DFORMAT_OP_SRGBREAD |
343 SVGA3DFORMAT_OP_SRGBWRITE |
344 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
345 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
346 },
347 {
348 SVGA3D_ARGB_S23E8,
349 SVGA3D_DEVCAP_SURFACEFMT_ARGB_S23E8,
350 SVGA3DFORMAT_OP_TEXTURE |
351 SVGA3DFORMAT_OP_CUBETEXTURE |
352 SVGA3DFORMAT_OP_VOLUMETEXTURE |
353 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
354 SVGA3DFORMAT_OP_SRGBREAD |
355 SVGA3DFORMAT_OP_SRGBWRITE |
356 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
357 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
358 },
359 {
360 SVGA3D_A2R10G10B10,
361 SVGA3D_DEVCAP_SURFACEFMT_A2R10G10B10,
362 SVGA3DFORMAT_OP_TEXTURE |
363 SVGA3DFORMAT_OP_CUBETEXTURE |
364 SVGA3DFORMAT_OP_VOLUMETEXTURE |
365 SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
366 SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
367 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
368 SVGA3DFORMAT_OP_SRGBREAD |
369 SVGA3DFORMAT_OP_SRGBWRITE |
370 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
371 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
372 },
373 /*
374 * SVGA3D_V8U8 is unsupported; it has no corresponding
375 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPU8V8 should be used instead.
376 */
377 {
378 SVGA3D_Q8W8V8U8,
379 SVGA3D_DEVCAP_SURFACEFMT_Q8W8V8U8,
380 SVGA3DFORMAT_OP_TEXTURE |
381 SVGA3DFORMAT_OP_CUBETEXTURE |
382 SVGA3DFORMAT_OP_BUMPMAP |
383 SVGA3DFORMAT_OP_OFFSCREENPLAIN
384 },
385 {
386 SVGA3D_CxV8U8,
387 SVGA3D_DEVCAP_SURFACEFMT_CxV8U8,
388 SVGA3DFORMAT_OP_TEXTURE |
389 SVGA3DFORMAT_OP_BUMPMAP |
390 SVGA3DFORMAT_OP_OFFSCREENPLAIN
391 },
392 /*
393 * SVGA3D_X8L8V8U8 is unsupported; it has no corresponding
394 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
395 */
396 {
397 SVGA3D_A2W10V10U10,
398 SVGA3D_DEVCAP_SURFACEFMT_A2W10V10U10,
399 SVGA3DFORMAT_OP_TEXTURE |
400 SVGA3DFORMAT_OP_BUMPMAP |
401 SVGA3DFORMAT_OP_OFFSCREENPLAIN
402 },
403 {
404 SVGA3D_ALPHA8,
405 SVGA3D_DEVCAP_SURFACEFMT_ALPHA8,
406 SVGA3DFORMAT_OP_TEXTURE |
407 SVGA3DFORMAT_OP_CUBETEXTURE |
408 SVGA3DFORMAT_OP_VOLUMETEXTURE |
409 SVGA3DFORMAT_OP_OFFSCREENPLAIN
410 },
411 {
412 SVGA3D_R_S10E5,
413 SVGA3D_DEVCAP_SURFACEFMT_R_S10E5,
414 SVGA3DFORMAT_OP_TEXTURE |
415 SVGA3DFORMAT_OP_VOLUMETEXTURE |
416 SVGA3DFORMAT_OP_CUBETEXTURE |
417 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
418 SVGA3DFORMAT_OP_SRGBREAD |
419 SVGA3DFORMAT_OP_SRGBWRITE |
420 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
421 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
422 },
423 {
424 SVGA3D_R_S23E8,
425 SVGA3D_DEVCAP_SURFACEFMT_R_S23E8,
426 SVGA3DFORMAT_OP_TEXTURE |
427 SVGA3DFORMAT_OP_VOLUMETEXTURE |
428 SVGA3DFORMAT_OP_CUBETEXTURE |
429 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
430 SVGA3DFORMAT_OP_SRGBREAD |
431 SVGA3DFORMAT_OP_SRGBWRITE |
432 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
433 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
434 },
435 {
436 SVGA3D_RG_S10E5,
437 SVGA3D_DEVCAP_SURFACEFMT_RG_S10E5,
438 SVGA3DFORMAT_OP_TEXTURE |
439 SVGA3DFORMAT_OP_VOLUMETEXTURE |
440 SVGA3DFORMAT_OP_CUBETEXTURE |
441 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
442 SVGA3DFORMAT_OP_SRGBREAD |
443 SVGA3DFORMAT_OP_SRGBWRITE |
444 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
445 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
446 },
447 {
448 SVGA3D_RG_S23E8,
449 SVGA3D_DEVCAP_SURFACEFMT_RG_S23E8,
450 SVGA3DFORMAT_OP_TEXTURE |
451 SVGA3DFORMAT_OP_VOLUMETEXTURE |
452 SVGA3DFORMAT_OP_CUBETEXTURE |
453 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
454 SVGA3DFORMAT_OP_SRGBREAD |
455 SVGA3DFORMAT_OP_SRGBWRITE |
456 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
457 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
458 },
459 /*
460 * SVGA3D_BUFFER is a placeholder format for index/vertex buffers.
461 */
462 {
463 SVGA3D_Z_D24X8,
464 SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8,
465 SVGA3DFORMAT_OP_ZSTENCIL |
466 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
467 },
468 {
469 SVGA3D_V16U16,
470 SVGA3D_DEVCAP_SURFACEFMT_V16U16,
471 SVGA3DFORMAT_OP_TEXTURE |
472 SVGA3DFORMAT_OP_CUBETEXTURE |
473 SVGA3DFORMAT_OP_VOLUMETEXTURE |
474 SVGA3DFORMAT_OP_BUMPMAP |
475 SVGA3DFORMAT_OP_OFFSCREENPLAIN
476 },
477 {
478 SVGA3D_G16R16,
479 SVGA3D_DEVCAP_SURFACEFMT_G16R16,
480 SVGA3DFORMAT_OP_TEXTURE |
481 SVGA3DFORMAT_OP_CUBETEXTURE |
482 SVGA3DFORMAT_OP_VOLUMETEXTURE |
483 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
484 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
485 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
486 },
487 {
488 SVGA3D_A16B16G16R16,
489 SVGA3D_DEVCAP_SURFACEFMT_A16B16G16R16,
490 SVGA3DFORMAT_OP_TEXTURE |
491 SVGA3DFORMAT_OP_CUBETEXTURE |
492 SVGA3DFORMAT_OP_VOLUMETEXTURE |
493 SVGA3DFORMAT_OP_OFFSCREENPLAIN |
494 SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
495 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
496 },
497 {
498 SVGA3D_UYVY,
499 SVGA3D_DEVCAP_SURFACEFMT_UYVY,
500 0
501 },
502 {
503 SVGA3D_YUY2,
504 SVGA3D_DEVCAP_SURFACEFMT_YUY2,
505 0
506 },
507 {
508 SVGA3D_NV12,
509 SVGA3D_DEVCAP_SURFACEFMT_NV12,
510 0
511 },
512 {
513 SVGA3D_AYUV,
514 SVGA3D_DEVCAP_SURFACEFMT_AYUV,
515 0
516 },
517 {
518 SVGA3D_BC4_UNORM,
519 SVGA3D_DEVCAP_SURFACEFMT_BC4_UNORM,
520 0
521 },
522 {
523 SVGA3D_BC5_UNORM,
524 SVGA3D_DEVCAP_SURFACEFMT_BC5_UNORM,
525 0
526 },
527 {
528 SVGA3D_Z_DF16,
529 SVGA3D_DEVCAP_SURFACEFMT_Z_DF16,
530 0
531 },
532 {
533 SVGA3D_Z_DF24,
534 SVGA3D_DEVCAP_SURFACEFMT_Z_DF24,
535 0
536 },
537 {
538 SVGA3D_Z_D24S8_INT,
539 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT,
540 0
541 },
542 };
543
544
545 /*
546 * Get format capabilities from the host. It takes in consideration
547 * deprecated/unsupported formats, and formats which are implicitely assumed to
548 * be supported when the host does not provide an explicit capability entry.
549 */
550 void
551 svga_get_format_cap(struct svga_screen *ss,
552 SVGA3dSurfaceFormat format,
553 SVGA3dSurfaceFormatCaps *caps)
554 {
555 const struct format_cap *entry;
556
557 for (entry = format_cap_table; entry < format_cap_table + Elements(format_cap_table); ++entry) {
558 if (entry->format == format) {
559 struct svga_winsys_screen *sws = ss->sws;
560 SVGA3dDevCapResult result;
561
562 if (sws->get_cap(sws, entry->index, &result)) {
563 /* Explicitly advertised format */
564 caps->value = result.u;
565 } else {
566 /* Implicitly advertised format -- use default caps */
567 caps->value = entry->defaultOperations;
568 }
569
570 return;
571 }
572 }
573
574 /* Unsupported format */
575 caps->value = 0;
576 }