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