Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 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
 
510
   },
511
   {
512
      SVGA3D_YUY2,
513
      SVGA3D_DEVCAP_SURFACEFMT_YUY2,
514
 
515
   },
516
   {
517
      SVGA3D_NV12,
518
      SVGA3D_DEVCAP_SURFACEFMT_NV12,
519
 
520
   },
521
   {
522
      SVGA3D_AYUV,
523
      SVGA3D_DEVCAP_SURFACEFMT_AYUV,
524
 
525
   },
526
   {
527
      SVGA3D_Z_DF16,
528
      SVGA3D_DEVCAP_SURFACEFMT_Z_DF16,
529
 
530
   },
531
   {
532
      SVGA3D_Z_DF24,
533
      SVGA3D_DEVCAP_SURFACEFMT_Z_DF24,
534
 
535
   },
536
   {
537
      SVGA3D_Z_D24S8_INT,
538
      SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT,
539
 
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
}