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