1 /**********************************************************
2 * Copyright 2011 VMware, Inc. All rights reserved.
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:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
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
24 **********************************************************/
27 #include "pipe/p_format.h"
28 #include "util/u_debug.h"
29 #include "util/u_memory.h"
31 #include "svga_winsys.h"
32 #include "svga_screen.h"
33 #include "svga_format.h"
37 * Translate from gallium format to SVGA3D format.
40 svga_translate_format(struct svga_screen
*ss
,
41 enum pipe_format format
,
46 case PIPE_FORMAT_B8G8R8A8_UNORM
:
47 return SVGA3D_A8R8G8B8
;
48 case PIPE_FORMAT_B8G8R8X8_UNORM
:
49 return SVGA3D_X8R8G8B8
;
51 /* Required for GL2.1:
53 case PIPE_FORMAT_B8G8R8A8_SRGB
:
54 return SVGA3D_A8R8G8B8
;
56 case PIPE_FORMAT_B5G6R5_UNORM
:
58 case PIPE_FORMAT_B5G5R5A1_UNORM
:
59 return SVGA3D_A1R5G5B5
;
60 case PIPE_FORMAT_B4G4R4A4_UNORM
:
61 return SVGA3D_A4R4G4B4
;
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
;
70 case PIPE_FORMAT_A8_UNORM
:
72 case PIPE_FORMAT_L8_UNORM
:
73 return SVGA3D_LUMINANCE8
;
75 case PIPE_FORMAT_DXT1_RGB
:
76 case PIPE_FORMAT_DXT1_RGBA
:
78 case PIPE_FORMAT_DXT3_RGBA
:
80 case PIPE_FORMAT_DXT5_RGBA
:
83 case PIPE_FORMAT_Z32_UNORM
:
84 /* SVGA3D_Z_D32 is not yet unsupported */
87 return SVGA3D_FORMAT_INVALID
;
93 * Format capability description entry.
96 SVGA3dSurfaceFormat format
;
99 * Capability index corresponding to the format.
101 SVGA3dDevCapIndex index
;
104 * Mask of supported SVGA3dFormatOp operations, to be inferred when the
105 * capability is not explicitly present.
107 uint32 defaultOperations
;
112 * Format capability description table.
114 * Ordererd by increasing SVGA3dSurfaceFormat value, but with gaps.
116 static const struct format_cap format_cap_table
[] = {
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
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
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
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
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
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
207 * SVGA3D_Z_D32 is not yet supported, and has no corresponding
212 SVGA3D_DEVCAP_SURFACEFMT_Z_D16
,
213 SVGA3DFORMAT_OP_ZSTENCIL
|
214 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
218 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8
,
219 SVGA3DFORMAT_OP_ZSTENCIL
|
220 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
225 SVGA3DFORMAT_OP_ZSTENCIL
|
226 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
230 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8
,
231 SVGA3DFORMAT_OP_TEXTURE
|
232 SVGA3DFORMAT_OP_CUBETEXTURE
|
233 SVGA3DFORMAT_OP_VOLUMETEXTURE
|
234 SVGA3DFORMAT_OP_OFFSCREENPLAIN
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
245 * SVGA3D_LUMINANCE4_ALPHA4 is not supported, and has no corresponding
250 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE16
,
251 SVGA3DFORMAT_OP_TEXTURE
|
252 SVGA3DFORMAT_OP_CUBETEXTURE
|
253 SVGA3DFORMAT_OP_VOLUMETEXTURE
|
254 SVGA3DFORMAT_OP_OFFSCREENPLAIN
258 SVGA3D_DEVCAP_SURFACEFMT_DXT1
,
259 SVGA3DFORMAT_OP_TEXTURE
|
260 SVGA3DFORMAT_OP_SRGBREAD
|
261 SVGA3DFORMAT_OP_CUBETEXTURE
|
262 SVGA3DFORMAT_OP_OFFSCREENPLAIN
266 SVGA3D_DEVCAP_SURFACEFMT_DXT2
,
267 SVGA3DFORMAT_OP_TEXTURE
|
268 SVGA3DFORMAT_OP_SRGBREAD
|
269 SVGA3DFORMAT_OP_CUBETEXTURE
|
270 SVGA3DFORMAT_OP_OFFSCREENPLAIN
274 SVGA3D_DEVCAP_SURFACEFMT_DXT3
,
275 SVGA3DFORMAT_OP_TEXTURE
|
276 SVGA3DFORMAT_OP_SRGBREAD
|
277 SVGA3DFORMAT_OP_CUBETEXTURE
|
278 SVGA3DFORMAT_OP_OFFSCREENPLAIN
282 SVGA3D_DEVCAP_SURFACEFMT_DXT4
,
283 SVGA3DFORMAT_OP_TEXTURE
|
284 SVGA3DFORMAT_OP_SRGBREAD
|
285 SVGA3DFORMAT_OP_CUBETEXTURE
|
286 SVGA3DFORMAT_OP_OFFSCREENPLAIN
290 SVGA3D_DEVCAP_SURFACEFMT_DXT5
,
291 SVGA3DFORMAT_OP_TEXTURE
|
292 SVGA3DFORMAT_OP_SRGBREAD
|
293 SVGA3DFORMAT_OP_CUBETEXTURE
|
294 SVGA3DFORMAT_OP_OFFSCREENPLAIN
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
306 * SVGA3D_BUMPL6V5U5 is unsupported; it has no corresponding
311 SVGA3D_DEVCAP_SURFACEFMT_BUMPX8L8V8U8
,
312 SVGA3DFORMAT_OP_TEXTURE
|
313 SVGA3DFORMAT_OP_CUBETEXTURE
|
314 SVGA3DFORMAT_OP_BUMPMAP
|
315 SVGA3DFORMAT_OP_OFFSCREENPLAIN
318 * SVGA3D_BUMPL8V8U8 is unsupported; it has no corresponding
319 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
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
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
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
360 * SVGA3D_V8U8 is unsupported; it has no corresponding
361 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPU8V8 should be used instead.
365 SVGA3D_DEVCAP_SURFACEFMT_Q8W8V8U8
,
366 SVGA3DFORMAT_OP_TEXTURE
|
367 SVGA3DFORMAT_OP_CUBETEXTURE
|
368 SVGA3DFORMAT_OP_BUMPMAP
|
369 SVGA3DFORMAT_OP_OFFSCREENPLAIN
373 SVGA3D_DEVCAP_SURFACEFMT_CxV8U8
,
374 SVGA3DFORMAT_OP_TEXTURE
|
375 SVGA3DFORMAT_OP_BUMPMAP
|
376 SVGA3DFORMAT_OP_OFFSCREENPLAIN
379 * SVGA3D_X8L8V8U8 is unsupported; it has no corresponding
380 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
384 SVGA3D_DEVCAP_SURFACEFMT_A2W10V10U10
,
385 SVGA3DFORMAT_OP_TEXTURE
|
386 SVGA3DFORMAT_OP_BUMPMAP
|
387 SVGA3DFORMAT_OP_OFFSCREENPLAIN
391 SVGA3D_DEVCAP_SURFACEFMT_ALPHA8
,
392 SVGA3DFORMAT_OP_TEXTURE
|
393 SVGA3DFORMAT_OP_CUBETEXTURE
|
394 SVGA3DFORMAT_OP_VOLUMETEXTURE
|
395 SVGA3DFORMAT_OP_OFFSCREENPLAIN
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
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
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
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
446 * SVGA3D_BUFFER is a placeholder format for index/vertex buffers.
450 SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8
,
451 SVGA3DFORMAT_OP_ZSTENCIL
|
452 SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
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
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
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
485 SVGA3D_DEVCAP_SURFACEFMT_UYVY
,
490 SVGA3D_DEVCAP_SURFACEFMT_YUY2
,
495 SVGA3D_DEVCAP_SURFACEFMT_NV12
,
500 SVGA3D_DEVCAP_SURFACEFMT_AYUV
,
505 SVGA3D_DEVCAP_SURFACEFMT_BC4_UNORM
,
510 SVGA3D_DEVCAP_SURFACEFMT_BC5_UNORM
,
515 SVGA3D_DEVCAP_SURFACEFMT_Z_DF16
,
520 SVGA3D_DEVCAP_SURFACEFMT_Z_DF24
,
525 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT
,
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.
537 svga_get_format_cap(struct svga_screen
*ss
,
538 SVGA3dSurfaceFormat format
,
539 SVGA3dSurfaceFormatCaps
*caps
)
541 const struct format_cap
*entry
;
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
;
548 if (sws
->get_cap(sws
, entry
->index
, &result
)) {
549 /* Explicitly advertised format */
550 caps
->value
= result
.u
;
552 /* Implicitly advertised format -- use default caps */
553 caps
->value
= entry
->defaultOperations
;
560 /* Unsupported format */