• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2008-2024 Broadcom. All Rights Reserved.
3  * The term “Broadcom” refers to Broadcom Inc.
4  * and/or its subsidiaries.
5  * SPDX-License-Identifier: MIT
6  */
7 
8 #include "git_sha1.h" /* For MESA_GIT_SHA1 */
9 #include "compiler/nir/nir.h"
10 #include "util/format/u_format.h"
11 #include "util/u_memory.h"
12 #include "util/u_inlines.h"
13 #include "util/u_process.h"
14 #include "util/u_screen.h"
15 #include "util/u_string.h"
16 #include "util/u_math.h"
17 
18 #include "svga_winsys.h"
19 #include "svga_public.h"
20 #include "svga_context.h"
21 #include "svga_format.h"
22 #include "svga_screen.h"
23 #include "svga_tgsi.h"
24 #include "svga_resource_texture.h"
25 #include "svga_resource.h"
26 #include "svga_debug.h"
27 
28 #include "vm_basic_types.h"
29 #include "svga3d_shaderdefs.h"
30 #include "VGPU10ShaderTokens.h"
31 
32 /* NOTE: this constant may get moved into a svga3d*.h header file */
33 #define SVGA3D_DX_MAX_RESOURCE_SIZE (128 * 1024 * 1024)
34 
35 #ifndef MESA_GIT_SHA1
36 #define MESA_GIT_SHA1 "(unknown git revision)"
37 #endif
38 
39 #if MESA_DEBUG
40 int SVGA_DEBUG = 0;
41 
42 static const struct debug_named_value svga_debug_flags[] = {
43    { "dma",         DEBUG_DMA, NULL },
44    { "tgsi",        DEBUG_TGSI, NULL },
45    { "pipe",        DEBUG_PIPE, NULL },
46    { "state",       DEBUG_STATE, NULL },
47    { "screen",      DEBUG_SCREEN, NULL },
48    { "tex",         DEBUG_TEX, NULL },
49    { "swtnl",       DEBUG_SWTNL, NULL },
50    { "const",       DEBUG_CONSTS, NULL },
51    { "viewport",    DEBUG_VIEWPORT, NULL },
52    { "views",       DEBUG_VIEWS, NULL },
53    { "perf",        DEBUG_PERF, NULL },
54    { "flush",       DEBUG_FLUSH, NULL },
55    { "sync",        DEBUG_SYNC, NULL },
56    { "cache",       DEBUG_CACHE, NULL },
57    { "streamout",   DEBUG_STREAMOUT, NULL },
58    { "query",       DEBUG_QUERY, NULL },
59    { "samplers",    DEBUG_SAMPLERS, NULL },
60    { "image",       DEBUG_IMAGE, NULL },
61    { "uav",         DEBUG_UAV, NULL },
62    { "retry",       DEBUG_RETRY, NULL },
63    DEBUG_NAMED_VALUE_END
64 };
65 #endif
66 
67 static const char *
svga_get_vendor(struct pipe_screen * pscreen)68 svga_get_vendor( struct pipe_screen *pscreen )
69 {
70    return "VMware, Inc.";
71 }
72 
73 
74 static const char *
svga_get_name(struct pipe_screen * pscreen)75 svga_get_name( struct pipe_screen *pscreen )
76 {
77    const char *build = "", *llvm = "", *mutex = "";
78    static char name[100];
79 #if MESA_DEBUG
80    /* Only return internal details in the MESA_DEBUG version:
81     */
82    build = "build: DEBUG;";
83    mutex = "mutex: " PIPE_ATOMIC ";";
84 #else
85    build = "build: RELEASE;";
86 #endif
87 #if DRAW_LLVM_AVAILABLE
88    llvm = "LLVM;";
89 #endif
90 
91    snprintf(name, sizeof(name), "SVGA3D; %s %s %s", build, mutex, llvm);
92    return name;
93 }
94 
95 
96 /** Helper for querying float-valued device cap */
97 static float
get_float_cap(struct svga_winsys_screen * sws,SVGA3dDevCapIndex cap,float defaultVal)98 get_float_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap,
99               float defaultVal)
100 {
101    SVGA3dDevCapResult result;
102    if (sws->get_cap(sws, cap, &result))
103       return result.f;
104    else
105       return defaultVal;
106 }
107 
108 
109 /** Helper for querying uint-valued device cap */
110 static unsigned
get_uint_cap(struct svga_winsys_screen * sws,SVGA3dDevCapIndex cap,unsigned defaultVal)111 get_uint_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap,
112              unsigned defaultVal)
113 {
114    SVGA3dDevCapResult result;
115    if (sws->get_cap(sws, cap, &result))
116       return result.u;
117    else
118       return defaultVal;
119 }
120 
121 
122 /** Helper for querying boolean-valued device cap */
123 static bool
get_bool_cap(struct svga_winsys_screen * sws,SVGA3dDevCapIndex cap,bool defaultVal)124 get_bool_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap,
125              bool defaultVal)
126 {
127    SVGA3dDevCapResult result;
128    if (sws->get_cap(sws, cap, &result))
129       return result.b;
130    else
131       return defaultVal;
132 }
133 
134 
135 static int
vgpu9_get_shader_param(struct pipe_screen * screen,enum pipe_shader_type shader,enum pipe_shader_cap param)136 vgpu9_get_shader_param(struct pipe_screen *screen,
137                        enum pipe_shader_type shader,
138                        enum pipe_shader_cap param)
139 {
140    struct svga_screen *svgascreen = svga_screen(screen);
141    struct svga_winsys_screen *sws = svgascreen->sws;
142    unsigned val;
143 
144    assert(!sws->have_vgpu10);
145 
146    switch (shader)
147    {
148    case PIPE_SHADER_FRAGMENT:
149       switch (param)
150       {
151       case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
152       case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
153          return get_uint_cap(sws,
154                              SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_INSTRUCTIONS,
155                              512);
156       case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
157       case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
158          return 512;
159       case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
160          return SVGA3D_MAX_NESTING_LEVEL;
161       case PIPE_SHADER_CAP_MAX_INPUTS:
162          return 10;
163       case PIPE_SHADER_CAP_MAX_OUTPUTS:
164          return svgascreen->max_color_buffers;
165       case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
166          return 224 * sizeof(float[4]);
167       case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
168          return 1;
169       case PIPE_SHADER_CAP_MAX_TEMPS:
170          val = get_uint_cap(sws, SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_TEMPS, 32);
171          return MIN2(val, SVGA3D_TEMPREG_MAX);
172       case PIPE_SHADER_CAP_CONT_SUPPORTED:
173          return 0;
174       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
175          return 0;
176       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
177       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
178          return 0;
179       case PIPE_SHADER_CAP_SUBROUTINES:
180          return 0;
181       case PIPE_SHADER_CAP_INT64_ATOMICS:
182       case PIPE_SHADER_CAP_INTEGERS:
183          return 0;
184       case PIPE_SHADER_CAP_FP16:
185       case PIPE_SHADER_CAP_FP16_DERIVATIVES:
186       case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
187       case PIPE_SHADER_CAP_INT16:
188       case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
189          return 0;
190       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
191       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
192          return 16;
193       case PIPE_SHADER_CAP_SUPPORTED_IRS:
194          return (1 << PIPE_SHADER_IR_TGSI) | (1 << PIPE_SHADER_IR_NIR);
195       case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
196       case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
197       case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
198       case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
199       case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
200          return 0;
201       }
202       /* If we get here, we failed to handle a cap above */
203       debug_printf("Unexpected fragment shader query %u\n", param);
204       return 0;
205    case PIPE_SHADER_VERTEX:
206       switch (param)
207       {
208       case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
209       case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
210          return get_uint_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_INSTRUCTIONS,
211                              512);
212       case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
213       case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
214          /* XXX: until we have vertex texture support */
215          return 0;
216       case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
217          return SVGA3D_MAX_NESTING_LEVEL;
218       case PIPE_SHADER_CAP_MAX_INPUTS:
219          return 16;
220       case PIPE_SHADER_CAP_MAX_OUTPUTS:
221          return 10;
222       case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
223          return 256 * sizeof(float[4]);
224       case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
225          return 1;
226       case PIPE_SHADER_CAP_MAX_TEMPS:
227          val = get_uint_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, 32);
228          return MIN2(val, SVGA3D_TEMPREG_MAX);
229       case PIPE_SHADER_CAP_CONT_SUPPORTED:
230          return 0;
231       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
232          return 0;
233       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
234          return 0;
235       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
236          return 1;
237       case PIPE_SHADER_CAP_SUBROUTINES:
238          return 0;
239       case PIPE_SHADER_CAP_INT64_ATOMICS:
240       case PIPE_SHADER_CAP_INTEGERS:
241          return 0;
242       case PIPE_SHADER_CAP_FP16:
243       case PIPE_SHADER_CAP_FP16_DERIVATIVES:
244       case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
245       case PIPE_SHADER_CAP_INT16:
246       case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
247          return 0;
248       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
249       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
250          return 0;
251       case PIPE_SHADER_CAP_SUPPORTED_IRS:
252          return (1 << PIPE_SHADER_IR_TGSI) | (1 << PIPE_SHADER_IR_NIR);
253       case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
254       case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
255       case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
256       case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
257       case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
258          return 0;
259       }
260       /* If we get here, we failed to handle a cap above */
261       debug_printf("Unexpected vertex shader query %u\n", param);
262       return 0;
263    case PIPE_SHADER_GEOMETRY:
264    case PIPE_SHADER_COMPUTE:
265    case PIPE_SHADER_TESS_CTRL:
266    case PIPE_SHADER_TESS_EVAL:
267       /* no support for geometry, tess or compute shaders at this time */
268       return 0;
269    case PIPE_SHADER_MESH:
270    case PIPE_SHADER_TASK:
271       return 0;
272    default:
273       debug_printf("Unexpected shader type (%u) query\n", shader);
274       return 0;
275    }
276    return 0;
277 }
278 
279 
280 static int
vgpu10_get_shader_param(struct pipe_screen * screen,enum pipe_shader_type shader,enum pipe_shader_cap param)281 vgpu10_get_shader_param(struct pipe_screen *screen,
282                         enum pipe_shader_type shader,
283                         enum pipe_shader_cap param)
284 {
285    struct svga_screen *svgascreen = svga_screen(screen);
286    struct svga_winsys_screen *sws = svgascreen->sws;
287 
288    assert(sws->have_vgpu10);
289    (void) sws;  /* silence unused var warnings in non-debug builds */
290 
291    if (shader == PIPE_SHADER_MESH || shader == PIPE_SHADER_TASK)
292       return 0;
293 
294    if ((!sws->have_sm5) &&
295        (shader == PIPE_SHADER_TESS_CTRL || shader == PIPE_SHADER_TESS_EVAL))
296       return 0;
297 
298    if ((!sws->have_gl43) && (shader == PIPE_SHADER_COMPUTE))
299       return 0;
300 
301    /* NOTE: we do not query the device for any caps/limits at this time */
302 
303    /* Generally the same limits for vertex, geometry and fragment shaders */
304    switch (param) {
305    case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
306    case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
307    case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
308    case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
309       return 64 * 1024;
310    case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
311       return 64;
312    case PIPE_SHADER_CAP_MAX_INPUTS:
313       if (shader == PIPE_SHADER_FRAGMENT)
314          return VGPU10_MAX_PS_INPUTS;
315       else if (shader == PIPE_SHADER_GEOMETRY)
316          return svgascreen->max_gs_inputs;
317       else if (shader == PIPE_SHADER_TESS_CTRL)
318          return VGPU11_MAX_HS_INPUT_CONTROL_POINTS;
319       else if (shader == PIPE_SHADER_TESS_EVAL)
320          return VGPU11_MAX_DS_INPUT_CONTROL_POINTS;
321       else
322          return svgascreen->max_vs_inputs;
323    case PIPE_SHADER_CAP_MAX_OUTPUTS:
324       if (shader == PIPE_SHADER_FRAGMENT)
325          return VGPU10_MAX_PS_OUTPUTS;
326       else if (shader == PIPE_SHADER_GEOMETRY)
327          return VGPU10_MAX_GS_OUTPUTS;
328       else if (shader == PIPE_SHADER_TESS_CTRL)
329          return VGPU11_MAX_HS_OUTPUTS;
330       else if (shader == PIPE_SHADER_TESS_EVAL)
331          return VGPU11_MAX_DS_OUTPUTS;
332       else
333          return svgascreen->max_vs_outputs;
334 
335    case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
336       return VGPU10_MAX_CONSTANT_BUFFER_ELEMENT_COUNT * sizeof(float[4]);
337    case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
338       return svgascreen->max_const_buffers;
339    case PIPE_SHADER_CAP_MAX_TEMPS:
340       return VGPU10_MAX_TEMPS;
341    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
342    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
343       return true; /* XXX verify */
344    case PIPE_SHADER_CAP_CONT_SUPPORTED:
345    case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
346    case PIPE_SHADER_CAP_SUBROUTINES:
347    case PIPE_SHADER_CAP_INTEGERS:
348       return true;
349    case PIPE_SHADER_CAP_FP16:
350    case PIPE_SHADER_CAP_FP16_DERIVATIVES:
351    case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
352    case PIPE_SHADER_CAP_INT16:
353    case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
354       return false;
355    case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
356    case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
357       return sws->have_gl43 ? PIPE_MAX_SAMPLERS : SVGA3D_DX_MAX_SAMPLERS;
358    case PIPE_SHADER_CAP_SUPPORTED_IRS:
359       if (sws->have_gl43)
360          return (1 << PIPE_SHADER_IR_TGSI) | (1 << PIPE_SHADER_IR_NIR);
361       else
362          return 0;
363 
364    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
365       return sws->have_gl43 ? SVGA_MAX_IMAGES : 0;
366 
367    case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
368       return sws->have_gl43 ? SVGA_MAX_SHADER_BUFFERS : 0;
369 
370    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
371    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
372       return sws->have_gl43 ? SVGA_MAX_ATOMIC_BUFFERS : 0;
373 
374    case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
375    case PIPE_SHADER_CAP_INT64_ATOMICS:
376       return 0;
377    default:
378       debug_printf("Unexpected vgpu10 shader query %u\n", param);
379       return 0;
380    }
381    return 0;
382 }
383 
384 #define COMMON_OPTIONS                                                        \
385    .lower_extract_byte = true,                                                \
386    .lower_extract_word = true,                                                \
387    .lower_insert_byte = true,                                                 \
388    .lower_insert_word = true,                                                 \
389    .lower_int64_options = nir_lower_imul_2x32_64 | nir_lower_divmod64,        \
390    .lower_fdph = true,                                                        \
391    .lower_flrp64 = true,                                                      \
392    .lower_ldexp = true,                                                       \
393    .lower_uniforms_to_ubo = true,                                             \
394    .lower_vector_cmp = true,                                                  \
395    .lower_cs_local_index_to_id = true,                                        \
396    .max_unroll_iterations = 32
397 
398 #define VGPU10_OPTIONS                                                        \
399    .lower_doubles_options = nir_lower_dfloor | nir_lower_dsign | nir_lower_dceil | nir_lower_dtrunc | nir_lower_dround_even, \
400    .lower_fmod = true,                                                        \
401    .lower_fpow = true,                                                        \
402    .support_indirect_inputs = (uint8_t)BITFIELD_MASK(PIPE_SHADER_TYPES),      \
403    .support_indirect_outputs = (uint8_t)BITFIELD_MASK(PIPE_SHADER_TYPES)
404 
405 static const nir_shader_compiler_options svga_vgpu9_fragment_compiler_options = {
406    COMMON_OPTIONS,
407    .lower_bitops = true,
408    .force_indirect_unrolling = nir_var_all,
409    .force_indirect_unrolling_sampler = true,
410    .no_integers = true,
411 };
412 
413 static const nir_shader_compiler_options svga_vgpu9_vertex_compiler_options = {
414    COMMON_OPTIONS,
415    .lower_bitops = true,
416    .force_indirect_unrolling = nir_var_function_temp,
417    .force_indirect_unrolling_sampler = true,
418    .no_integers = true,
419    .support_indirect_inputs = BITFIELD_BIT(MESA_SHADER_VERTEX),
420    .support_indirect_outputs = BITFIELD_BIT(MESA_SHADER_VERTEX),
421 };
422 
423 static const nir_shader_compiler_options svga_vgpu10_compiler_options = {
424    COMMON_OPTIONS,
425    VGPU10_OPTIONS,
426    .force_indirect_unrolling_sampler = true,
427 };
428 
429 static const nir_shader_compiler_options svga_gl4_compiler_options = {
430    COMMON_OPTIONS,
431    VGPU10_OPTIONS,
432 };
433 
434 static const void *
svga_get_compiler_options(struct pipe_screen * pscreen,enum pipe_shader_ir ir,enum pipe_shader_type shader)435 svga_get_compiler_options(struct pipe_screen *pscreen,
436                           enum pipe_shader_ir ir,
437                           enum pipe_shader_type shader)
438 {
439    struct svga_screen *svgascreen = svga_screen(pscreen);
440    struct svga_winsys_screen *sws = svgascreen->sws;
441 
442    assert(ir == PIPE_SHADER_IR_NIR);
443 
444    if (sws->have_gl43 || sws->have_sm5)
445       return &svga_gl4_compiler_options;
446    else if (sws->have_vgpu10)
447       return &svga_vgpu10_compiler_options;
448    else {
449       if (shader == PIPE_SHADER_FRAGMENT)
450          return &svga_vgpu9_fragment_compiler_options;
451       else
452          return &svga_vgpu9_vertex_compiler_options;
453    }
454 }
455 
456 static int
svga_get_shader_param(struct pipe_screen * screen,enum pipe_shader_type shader,enum pipe_shader_cap param)457 svga_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader,
458                       enum pipe_shader_cap param)
459 {
460    struct svga_screen *svgascreen = svga_screen(screen);
461    struct svga_winsys_screen *sws = svgascreen->sws;
462    if (sws->have_vgpu10) {
463       return vgpu10_get_shader_param(screen, shader, param);
464    }
465    else {
466       return vgpu9_get_shader_param(screen, shader, param);
467    }
468 }
469 
470 
471 static int
svga_sm5_get_compute_param(struct pipe_screen * screen,enum pipe_shader_ir ir_type,enum pipe_compute_cap param,void * ret)472 svga_sm5_get_compute_param(struct pipe_screen *screen,
473                            enum pipe_shader_ir ir_type,
474                            enum pipe_compute_cap param,
475                            void *ret)
476 {
477    ASSERTED struct svga_screen *svgascreen = svga_screen(screen);
478    ASSERTED struct svga_winsys_screen *sws = svgascreen->sws;
479    uint64_t *iret = (uint64_t *)ret;
480 
481    assert(sws->have_gl43);
482 
483    switch (param) {
484    case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:
485       iret[0] = 65535;
486       iret[1] = 65535;
487       iret[2] = 65535;
488       return 3 * sizeof(uint64_t);
489    case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:
490       iret[0] = 1024;
491       iret[1] = 1024;
492       iret[2] = 64;
493       return 3 * sizeof(uint64_t);
494    case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:
495       *iret = 1024;
496       return sizeof(uint64_t);
497    case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:
498       *iret = 32768;
499       return sizeof(uint64_t);
500    case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:
501       *iret = 0;
502       return sizeof(uint64_t);
503    default:
504       debug_printf("Unexpected compute param %u\n", param);
505    }
506    return 0;
507 }
508 
509 static void
svga_init_screen_caps(struct svga_screen * svgascreen)510 svga_init_screen_caps(struct svga_screen *svgascreen)
511 {
512    struct pipe_caps *caps = (struct pipe_caps *)&svgascreen->screen.caps;
513 
514    u_init_pipe_screen_caps(&svgascreen->screen, 0);
515 
516    struct svga_winsys_screen *sws = svgascreen->sws;
517    SVGA3dDevCapResult result;
518 
519    caps->npot_textures = true;
520    caps->mixed_framebuffer_sizes = true;
521    caps->mixed_color_depth_bits = true;
522    /*
523     * "In virtually every OpenGL implementation and hardware,
524     * GL_MAX_DUAL_SOURCE_DRAW_BUFFERS is 1"
525     * http://www.opengl.org/wiki/Blending
526     */
527    caps->max_dual_source_render_targets = sws->have_vgpu10 ? 1 : 0;
528    caps->anisotropic_filter = true;
529    caps->max_render_targets = svgascreen->max_color_buffers;
530    caps->occlusion_query = true;
531    caps->texture_buffer_objects = sws->have_vgpu10;
532    caps->texture_buffer_offset_alignment = sws->have_vgpu10 ? 16 : 0;
533 
534    caps->texture_swizzle = true;
535    caps->constant_buffer_offset_alignment = 256;
536 
537    unsigned size = 1 << (SVGA_MAX_TEXTURE_LEVELS - 1);
538    if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_WIDTH, &result))
539       size = MIN2(result.u, size);
540    else
541       size = 2048;
542    if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_HEIGHT, &result))
543       size = MIN2(result.u, size);
544    else
545       size = 2048;
546    caps->max_texture_2d_size = size;
547 
548    caps->max_texture_3d_levels =
549       sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VOLUME_EXTENT, &result) ?
550       MIN2(util_logbase2(result.u) + 1, SVGA_MAX_TEXTURE_LEVELS) : 8; /* max 128x128x128 */
551 
552    caps->max_texture_cube_levels = util_last_bit(caps->max_texture_2d_size);
553 
554    caps->max_texture_array_layers =
555       sws->have_sm5 ? SVGA3D_SM5_MAX_SURFACE_ARRAYSIZE :
556       (sws->have_vgpu10 ? SVGA3D_SM4_MAX_SURFACE_ARRAYSIZE : 0);
557 
558    caps->blend_equation_separate = true; /* req. for GL 1.5 */
559 
560    caps->fs_coord_origin_upper_left = true;
561    caps->fs_coord_pixel_center_half_integer = sws->have_vgpu10;
562    caps->fs_coord_pixel_center_integer = !sws->have_vgpu10;
563 
564    /* The color outputs of vertex shaders are not clamped */
565    caps->vertex_color_unclamped = true;
566    caps->vertex_color_clamped = sws->have_vgpu10;
567 
568    caps->glsl_feature_level =
569    caps->glsl_feature_level_compatibility =
570       sws->have_gl43 ? 430 : (sws->have_sm5 ? 410 : (sws->have_vgpu10 ? 330 : 120));
571 
572    caps->texture_transfer_modes = 0;
573 
574    caps->fragment_shader_texture_lod = true;
575    caps->fragment_shader_derivatives = true;
576 
577    caps->depth_clip_disable =
578    caps->indep_blend_enable =
579    caps->conditional_render =
580    caps->query_timestamp =
581    caps->vs_instanceid =
582    caps->vertex_element_instance_divisor =
583    caps->seamless_cube_map =
584    caps->fake_sw_msaa = sws->have_vgpu10;
585 
586    caps->max_stream_output_buffers = sws->have_vgpu10 ? SVGA3D_DX_MAX_SOTARGETS : 0;
587    caps->max_stream_output_separate_components = sws->have_vgpu10 ? 4 : 0;
588    caps->max_stream_output_interleaved_components =
589       sws->have_sm5 ? SVGA3D_MAX_STREAMOUT_DECLS :
590       (sws->have_vgpu10 ? SVGA3D_MAX_DX10_STREAMOUT_DECLS : 0);
591    caps->stream_output_pause_resume = sws->have_sm5;
592    caps->stream_output_interleave_buffers = sws->have_sm5;
593    caps->texture_multisample = svgascreen->ms_samples;
594 
595    /* convert bytes to texels for the case of the largest texel
596     * size: float[4].
597     */
598    caps->max_texel_buffer_elements =
599       SVGA3D_DX_MAX_RESOURCE_SIZE / (4 * sizeof(float));
600 
601    caps->min_texel_offset = sws->have_vgpu10 ? VGPU10_MIN_TEXEL_FETCH_OFFSET : 0;
602    caps->max_texel_offset = sws->have_vgpu10 ? VGPU10_MAX_TEXEL_FETCH_OFFSET : 0;
603 
604    caps->min_texture_gather_offset = 0;
605    caps->max_texture_gather_offset = 0;
606 
607    caps->max_geometry_output_vertices = sws->have_vgpu10 ? 256 : 0;
608    caps->max_geometry_total_output_components = sws->have_vgpu10 ? 1024 : 0;
609 
610    /* may be a sw fallback, depending on restart index */
611    caps->primitive_restart = true;
612    caps->primitive_restart_fixed_index = true;
613 
614    caps->generate_mipmap = sws->have_generate_mipmap_cmd;
615 
616    caps->native_fence_fd = sws->have_fence_fd;
617 
618    caps->quads_follow_provoking_vertex_convention = true;
619 
620    caps->cube_map_array =
621    caps->indep_blend_func =
622    caps->sample_shading =
623    caps->force_persample_interp =
624    caps->texture_query_lod = sws->have_sm4_1;
625 
626    /* SM4_1 supports only single-channel textures where as SM5 supports
627     * all four channel textures */
628    caps->max_texture_gather_components = sws->have_sm5 ? 4 : (sws->have_sm4_1 ? 1 : 0);
629    caps->draw_indirect = sws->have_sm5;
630    caps->max_vertex_streams = sws->have_sm5 ? 4 : 0;
631    caps->compute = sws->have_gl43;
632    /* According to the spec, max varyings does not include the components
633     * for position, so remove one count from the max for position.
634     */
635    caps->max_varyings = sws->have_vgpu10 ? VGPU10_MAX_PS_INPUTS-1 : 10;
636    caps->buffer_map_persistent_coherent = sws->have_coherent;
637 
638    caps->start_instance = sws->have_sm5;
639    caps->robust_buffer_access_behavior = sws->have_sm5;
640 
641    caps->sampler_view_target = sws->have_gl43;
642 
643    caps->framebuffer_no_attachment = sws->have_gl43;
644 
645    caps->clip_halfz = sws->have_gl43;
646    caps->shareable_shaders = false;
647 
648    caps->pci_group =
649    caps->pci_bus =
650    caps->pci_device =
651    caps->pci_function = 0;
652    caps->shader_buffer_offset_alignment = sws->have_gl43 ? 16 : 0;
653 
654    caps->max_combined_shader_output_resources =
655    caps->max_combined_shader_buffers = sws->have_gl43 ? SVGA_MAX_SHADER_BUFFERS : 0;
656    caps->max_combined_hw_atomic_counters =
657    caps->max_combined_hw_atomic_counter_buffers =
658       sws->have_gl43 ? SVGA_MAX_ATOMIC_BUFFERS : 0;
659    caps->min_map_buffer_alignment = 64;
660    caps->vertex_input_alignment =
661       sws->have_vgpu10 ? PIPE_VERTEX_INPUT_ALIGNMENT_ELEMENT : PIPE_VERTEX_INPUT_ALIGNMENT_4BYTE;
662    caps->max_vertex_attrib_stride = 2048;
663 
664    assert((!sws->have_vgpu10 && svgascreen->max_viewports == 1) ||
665           (sws->have_vgpu10 &&
666            svgascreen->max_viewports == SVGA3D_DX_MAX_VIEWPORTS));
667    caps->max_viewports = svgascreen->max_viewports;
668 
669    caps->endianness = PIPE_ENDIAN_LITTLE;
670 
671    caps->vendor_id = 0x15ad; /* VMware Inc. */
672    caps->device_id = sws->device_id ? sws->device_id : 0x0405; /* assume SVGA II */
673    caps->video_memory = 1; /* XXX: Query the host ? */
674    caps->copy_between_compressed_and_plain_formats = sws->have_vgpu10;
675    caps->doubles = sws->have_sm5;
676    caps->uma = false;
677    caps->allow_mapped_buffers_during_execution = false;
678    caps->tgsi_div = true;
679    caps->max_gs_invocations = 32;
680    caps->max_shader_buffer_size = 1 << 27;
681    /* Verify this once protocol is finalized. Setting it to minimum value. */
682    caps->max_shader_patch_varyings = sws->have_sm5 ? 30 : 0;
683    caps->texture_float_linear = true;
684    caps->texture_half_float_linear = true;
685    caps->tgsi_texcoord = sws->have_vgpu10 ? 1 : 0;
686    caps->image_store_formatted = sws->have_gl43;
687 
688    caps->min_line_width =
689    caps->min_line_width_aa =
690    caps->min_point_size =
691    caps->min_point_size_aa = 1;
692    caps->point_size_granularity =
693    caps->line_width_granularity = 0.1;
694    caps->max_line_width = svgascreen->maxLineWidth;
695    caps->max_line_width_aa = svgascreen->maxLineWidthAA;
696 
697    caps->max_point_size =
698    caps->max_point_size_aa = svgascreen->maxPointSize;
699 
700    caps->max_texture_anisotropy =
701       get_uint_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_ANISOTROPY, 4);
702 
703    caps->max_texture_lod_bias = 15.0;
704 }
705 
706 static void
svga_fence_reference(struct pipe_screen * screen,struct pipe_fence_handle ** ptr,struct pipe_fence_handle * fence)707 svga_fence_reference(struct pipe_screen *screen,
708                      struct pipe_fence_handle **ptr,
709                      struct pipe_fence_handle *fence)
710 {
711    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
712    sws->fence_reference(sws, ptr, fence);
713 }
714 
715 
716 static bool
svga_fence_finish(struct pipe_screen * screen,struct pipe_context * ctx,struct pipe_fence_handle * fence,uint64_t timeout)717 svga_fence_finish(struct pipe_screen *screen,
718                   struct pipe_context *ctx,
719                   struct pipe_fence_handle *fence,
720                   uint64_t timeout)
721 {
722    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
723    bool retVal;
724 
725    SVGA_STATS_TIME_PUSH(sws, SVGA_STATS_TIME_FENCEFINISH);
726 
727    if (!timeout) {
728       retVal = sws->fence_signalled(sws, fence, 0) == 0;
729    }
730    else {
731       SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s fence_ptr %p\n",
732                __func__, fence);
733 
734       retVal = sws->fence_finish(sws, fence, timeout, 0) == 0;
735    }
736 
737    SVGA_STATS_TIME_POP(sws);
738 
739    return retVal;
740 }
741 
742 
743 static int
svga_fence_get_fd(struct pipe_screen * screen,struct pipe_fence_handle * fence)744 svga_fence_get_fd(struct pipe_screen *screen,
745                   struct pipe_fence_handle *fence)
746 {
747    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
748 
749    return sws->fence_get_fd(sws, fence, true);
750 }
751 
752 
753 static int
svga_get_driver_query_info(struct pipe_screen * screen,unsigned index,struct pipe_driver_query_info * info)754 svga_get_driver_query_info(struct pipe_screen *screen,
755                            unsigned index,
756                            struct pipe_driver_query_info *info)
757 {
758 #define QUERY(NAME, ENUM, UNITS) \
759    {NAME, ENUM, {0}, UNITS, PIPE_DRIVER_QUERY_RESULT_TYPE_AVERAGE, 0, 0x0}
760 
761    static const struct pipe_driver_query_info queries[] = {
762       /* per-frame counters */
763       QUERY("num-draw-calls", SVGA_QUERY_NUM_DRAW_CALLS,
764             PIPE_DRIVER_QUERY_TYPE_UINT64),
765       QUERY("num-fallbacks", SVGA_QUERY_NUM_FALLBACKS,
766             PIPE_DRIVER_QUERY_TYPE_UINT64),
767       QUERY("num-flushes", SVGA_QUERY_NUM_FLUSHES,
768             PIPE_DRIVER_QUERY_TYPE_UINT64),
769       QUERY("num-validations", SVGA_QUERY_NUM_VALIDATIONS,
770             PIPE_DRIVER_QUERY_TYPE_UINT64),
771       QUERY("map-buffer-time", SVGA_QUERY_MAP_BUFFER_TIME,
772             PIPE_DRIVER_QUERY_TYPE_MICROSECONDS),
773       QUERY("num-buffers-mapped", SVGA_QUERY_NUM_BUFFERS_MAPPED,
774             PIPE_DRIVER_QUERY_TYPE_UINT64),
775       QUERY("num-textures-mapped", SVGA_QUERY_NUM_TEXTURES_MAPPED,
776             PIPE_DRIVER_QUERY_TYPE_UINT64),
777       QUERY("num-bytes-uploaded", SVGA_QUERY_NUM_BYTES_UPLOADED,
778             PIPE_DRIVER_QUERY_TYPE_BYTES),
779       QUERY("num-command-buffers", SVGA_QUERY_NUM_COMMAND_BUFFERS,
780             PIPE_DRIVER_QUERY_TYPE_UINT64),
781       QUERY("command-buffer-size", SVGA_QUERY_COMMAND_BUFFER_SIZE,
782             PIPE_DRIVER_QUERY_TYPE_BYTES),
783       QUERY("flush-time", SVGA_QUERY_FLUSH_TIME,
784             PIPE_DRIVER_QUERY_TYPE_MICROSECONDS),
785       QUERY("surface-write-flushes", SVGA_QUERY_SURFACE_WRITE_FLUSHES,
786             PIPE_DRIVER_QUERY_TYPE_UINT64),
787       QUERY("num-readbacks", SVGA_QUERY_NUM_READBACKS,
788             PIPE_DRIVER_QUERY_TYPE_UINT64),
789       QUERY("num-resource-updates", SVGA_QUERY_NUM_RESOURCE_UPDATES,
790             PIPE_DRIVER_QUERY_TYPE_UINT64),
791       QUERY("num-buffer-uploads", SVGA_QUERY_NUM_BUFFER_UPLOADS,
792             PIPE_DRIVER_QUERY_TYPE_UINT64),
793       QUERY("num-const-buf-updates", SVGA_QUERY_NUM_CONST_BUF_UPDATES,
794             PIPE_DRIVER_QUERY_TYPE_UINT64),
795       QUERY("num-const-updates", SVGA_QUERY_NUM_CONST_UPDATES,
796             PIPE_DRIVER_QUERY_TYPE_UINT64),
797       QUERY("num-shader-relocations", SVGA_QUERY_NUM_SHADER_RELOCATIONS,
798             PIPE_DRIVER_QUERY_TYPE_UINT64),
799       QUERY("num-surface-relocations", SVGA_QUERY_NUM_SURFACE_RELOCATIONS,
800             PIPE_DRIVER_QUERY_TYPE_UINT64),
801 
802       /* running total counters */
803       QUERY("memory-used", SVGA_QUERY_MEMORY_USED,
804             PIPE_DRIVER_QUERY_TYPE_BYTES),
805       QUERY("num-shaders", SVGA_QUERY_NUM_SHADERS,
806             PIPE_DRIVER_QUERY_TYPE_UINT64),
807       QUERY("num-resources", SVGA_QUERY_NUM_RESOURCES,
808             PIPE_DRIVER_QUERY_TYPE_UINT64),
809       QUERY("num-state-objects", SVGA_QUERY_NUM_STATE_OBJECTS,
810             PIPE_DRIVER_QUERY_TYPE_UINT64),
811       QUERY("num-surface-views", SVGA_QUERY_NUM_SURFACE_VIEWS,
812             PIPE_DRIVER_QUERY_TYPE_UINT64),
813       QUERY("num-generate-mipmap", SVGA_QUERY_NUM_GENERATE_MIPMAP,
814             PIPE_DRIVER_QUERY_TYPE_UINT64),
815       QUERY("num-failed-allocations", SVGA_QUERY_NUM_FAILED_ALLOCATIONS,
816             PIPE_DRIVER_QUERY_TYPE_UINT64),
817       QUERY("num-commands-per-draw", SVGA_QUERY_NUM_COMMANDS_PER_DRAW,
818             PIPE_DRIVER_QUERY_TYPE_FLOAT),
819       QUERY("shader-mem-used", SVGA_QUERY_SHADER_MEM_USED,
820             PIPE_DRIVER_QUERY_TYPE_UINT64),
821    };
822 #undef QUERY
823 
824    if (!info)
825       return ARRAY_SIZE(queries);
826 
827    if (index >= ARRAY_SIZE(queries))
828       return 0;
829 
830    *info = queries[index];
831    return 1;
832 }
833 
834 
835 static void
init_logging(struct pipe_screen * screen)836 init_logging(struct pipe_screen *screen)
837 {
838    struct svga_screen *svgascreen = svga_screen(screen);
839    static const char *log_prefix = "Mesa: ";
840    char host_log[1000];
841 
842    /* Log Version to Host */
843    snprintf(host_log, sizeof(host_log) - strlen(log_prefix),
844             "%s%s\n", log_prefix, svga_get_name(screen));
845    svgascreen->sws->host_log(svgascreen->sws, host_log);
846 
847    snprintf(host_log, sizeof(host_log) - strlen(log_prefix),
848             "%s" PACKAGE_VERSION MESA_GIT_SHA1, log_prefix);
849    svgascreen->sws->host_log(svgascreen->sws, host_log);
850 
851    /* If the SVGA_EXTRA_LOGGING env var is set, log the process's command
852     * line (program name and arguments).
853     */
854    if (debug_get_bool_option("SVGA_EXTRA_LOGGING", false)) {
855       char cmdline[1000];
856       if (util_get_command_line(cmdline, sizeof(cmdline))) {
857          snprintf(host_log, sizeof(host_log) - strlen(log_prefix),
858                   "%s%s\n", log_prefix, cmdline);
859          svgascreen->sws->host_log(svgascreen->sws, host_log);
860       }
861    }
862 }
863 
864 
865 /**
866  * no-op logging function to use when SVGA_NO_LOGGING is set.
867  */
868 static void
nop_host_log(struct svga_winsys_screen * sws,const char * message)869 nop_host_log(struct svga_winsys_screen *sws, const char *message)
870 {
871    /* nothing */
872 }
873 
874 
875 static void
svga_destroy_screen(struct pipe_screen * screen)876 svga_destroy_screen( struct pipe_screen *screen )
877 {
878    struct svga_screen *svgascreen = svga_screen(screen);
879 
880    svga_screen_cache_cleanup(svgascreen);
881 
882    mtx_destroy(&svgascreen->swc_mutex);
883    mtx_destroy(&svgascreen->tex_mutex);
884 
885    svgascreen->sws->destroy(svgascreen->sws);
886 
887    FREE(svgascreen);
888 }
889 
890 
891 static int
svga_screen_get_fd(struct pipe_screen * screen)892 svga_screen_get_fd( struct pipe_screen *screen )
893 {
894    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
895 
896    return sws->get_fd(sws);
897 }
898 
899 
900 /**
901  * Create a new svga_screen object
902  */
903 struct pipe_screen *
svga_screen_create(struct svga_winsys_screen * sws)904 svga_screen_create(struct svga_winsys_screen *sws)
905 {
906    struct svga_screen *svgascreen;
907    struct pipe_screen *screen;
908 
909 #if MESA_DEBUG
910    SVGA_DEBUG = debug_get_flags_option("SVGA_DEBUG", svga_debug_flags, 0 );
911 #endif
912 
913    svgascreen = CALLOC_STRUCT(svga_screen);
914    if (!svgascreen)
915       goto error1;
916 
917    svgascreen->debug.force_level_surface_view =
918       debug_get_bool_option("SVGA_FORCE_LEVEL_SURFACE_VIEW", false);
919    svgascreen->debug.force_surface_view =
920       debug_get_bool_option("SVGA_FORCE_SURFACE_VIEW", false);
921    svgascreen->debug.force_sampler_view =
922       debug_get_bool_option("SVGA_FORCE_SAMPLER_VIEW", false);
923    svgascreen->debug.no_surface_view =
924       debug_get_bool_option("SVGA_NO_SURFACE_VIEW", false);
925    svgascreen->debug.no_sampler_view =
926       debug_get_bool_option("SVGA_NO_SAMPLER_VIEW", false);
927    svgascreen->debug.no_cache_index_buffers =
928       debug_get_bool_option("SVGA_NO_CACHE_INDEX_BUFFERS", false);
929 
930    screen = &svgascreen->screen;
931 
932    screen->destroy = svga_destroy_screen;
933    screen->get_name = svga_get_name;
934    screen->get_vendor = svga_get_vendor;
935    screen->get_device_vendor = svga_get_vendor; // TODO actual device vendor
936    screen->get_screen_fd = svga_screen_get_fd;
937    screen->get_shader_param = svga_get_shader_param;
938    screen->get_compiler_options = svga_get_compiler_options;
939    screen->get_timestamp = NULL;
940    screen->is_format_supported = svga_is_format_supported;
941    screen->context_create = svga_context_create;
942    screen->fence_reference = svga_fence_reference;
943    screen->fence_finish = svga_fence_finish;
944    screen->fence_get_fd = svga_fence_get_fd;
945 
946    screen->get_driver_query_info = svga_get_driver_query_info;
947 
948    screen->get_compute_param = svga_sm5_get_compute_param;
949 
950    svgascreen->sws = sws;
951 
952    svga_init_screen_resource_functions(svgascreen);
953 
954    if (sws->get_hw_version) {
955       svgascreen->hw_version = sws->get_hw_version(sws);
956    } else {
957       svgascreen->hw_version = SVGA3D_HWVERSION_WS65_B1;
958    }
959 
960    if (svgascreen->hw_version < SVGA3D_HWVERSION_WS8_B1) {
961       /* too old for 3D acceleration */
962       debug_printf("Hardware version 0x%x is too old for accerated 3D\n",
963                    svgascreen->hw_version);
964       goto error2;
965    }
966 
967    if (sws->have_gl43) {
968       svgascreen->forcedSampleCount =
969          get_uint_cap(sws, SVGA3D_DEVCAP_MAX_FORCED_SAMPLE_COUNT, 0);
970 
971       sws->have_gl43 = sws->have_gl43 && (svgascreen->forcedSampleCount >= 4);
972 
973       /* Allow a temporary environment variable to enable/disable GL43 support.
974        */
975       sws->have_gl43 =
976          debug_get_bool_option("SVGA_GL43", sws->have_gl43);
977 
978       svgascreen->debug.sampler_state_mapping =
979          debug_get_bool_option("SVGA_SAMPLER_STATE_MAPPING", false);
980    }
981    else {
982       /* sampler state mapping code is only enabled with GL43
983        * due to the limitation in SW Renderer. (VMware bug 2825014)
984        */
985       svgascreen->debug.sampler_state_mapping = false;
986    }
987 
988    debug_printf("%s enabled\n",
989                 sws->have_gl43 ? "SM5+" :
990                 sws->have_sm5 ? "SM5" :
991                 sws->have_sm4_1 ? "SM4_1" :
992                 sws->have_vgpu10 ? "VGPU10" : "VGPU9");
993 
994    debug_printf("Mesa: %s %s (%s)\n", svga_get_name(screen),
995                 PACKAGE_VERSION, MESA_GIT_SHA1);
996 
997    /*
998     * The D16, D24X8, and D24S8 formats always do an implicit shadow compare
999     * when sampled from, where as the DF16, DF24, and D24S8_INT do not.  So
1000     * we prefer the later when available.
1001     *
1002     * This mimics hardware vendors extensions for D3D depth sampling. See also
1003     * http://aras-p.info/texts/D3D9GPUHacks.html
1004     */
1005 
1006    {
1007       bool has_df16, has_df24, has_d24s8_int;
1008       SVGA3dSurfaceFormatCaps caps;
1009       SVGA3dSurfaceFormatCaps mask;
1010       mask.value = 0;
1011       mask.zStencil = 1;
1012       mask.texture = 1;
1013 
1014       svgascreen->depth.z16 = SVGA3D_Z_D16;
1015       svgascreen->depth.x8z24 = SVGA3D_Z_D24X8;
1016       svgascreen->depth.s8z24 = SVGA3D_Z_D24S8;
1017 
1018       svga_get_format_cap(svgascreen, SVGA3D_Z_DF16, &caps);
1019       has_df16 = (caps.value & mask.value) == mask.value;
1020 
1021       svga_get_format_cap(svgascreen, SVGA3D_Z_DF24, &caps);
1022       has_df24 = (caps.value & mask.value) == mask.value;
1023 
1024       svga_get_format_cap(svgascreen, SVGA3D_Z_D24S8_INT, &caps);
1025       has_d24s8_int = (caps.value & mask.value) == mask.value;
1026 
1027       /* XXX: We might want some other logic here.
1028        * Like if we only have d24s8_int we should
1029        * emulate the other formats with that.
1030        */
1031       if (has_df16) {
1032          svgascreen->depth.z16 = SVGA3D_Z_DF16;
1033       }
1034       if (has_df24) {
1035          svgascreen->depth.x8z24 = SVGA3D_Z_DF24;
1036       }
1037       if (has_d24s8_int) {
1038          svgascreen->depth.s8z24 = SVGA3D_Z_D24S8_INT;
1039       }
1040    }
1041 
1042    /* Query device caps
1043     */
1044    if (sws->have_vgpu10) {
1045       svgascreen->haveProvokingVertex
1046          = get_bool_cap(sws, SVGA3D_DEVCAP_DX_PROVOKING_VERTEX, false);
1047       svgascreen->haveLineSmooth = true;
1048       svgascreen->maxPointSize = 80.0F;
1049       svgascreen->max_color_buffers = SVGA3D_DX_MAX_RENDER_TARGETS;
1050 
1051       /* Multisample samples per pixel */
1052       if (sws->have_sm4_1 && debug_get_bool_option("SVGA_MSAA", true)) {
1053          if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_2X, false))
1054             svgascreen->ms_samples |= 1 << 1;
1055          if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_4X, false))
1056             svgascreen->ms_samples |= 1 << 3;
1057       }
1058 
1059       if (sws->have_sm5 && debug_get_bool_option("SVGA_MSAA", true)) {
1060          if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_8X, false))
1061             svgascreen->ms_samples |= 1 << 7;
1062       }
1063 
1064       /* Maximum number of constant buffers */
1065       if (sws->have_gl43) {
1066          svgascreen->max_const_buffers = SVGA_MAX_CONST_BUFS;
1067       }
1068       else {
1069          svgascreen->max_const_buffers =
1070             get_uint_cap(sws, SVGA3D_DEVCAP_DX_MAX_CONSTANT_BUFFERS, 1);
1071          svgascreen->max_const_buffers = MIN2(svgascreen->max_const_buffers,
1072                                               SVGA_MAX_CONST_BUFS);
1073       }
1074 
1075       svgascreen->haveBlendLogicops =
1076          get_bool_cap(sws, SVGA3D_DEVCAP_LOGIC_BLENDOPS, false);
1077 
1078       screen->is_format_supported = svga_is_dx_format_supported;
1079 
1080       svgascreen->max_viewports = SVGA3D_DX_MAX_VIEWPORTS;
1081 
1082       /* Shader limits */
1083       if (sws->have_sm4_1) {
1084          svgascreen->max_vs_inputs  = VGPU10_1_MAX_VS_INPUTS;
1085          svgascreen->max_vs_outputs = VGPU10_1_MAX_VS_OUTPUTS;
1086          svgascreen->max_gs_inputs  = VGPU10_1_MAX_GS_INPUTS;
1087       }
1088       else {
1089          svgascreen->max_vs_inputs  = VGPU10_MAX_VS_INPUTS;
1090          svgascreen->max_vs_outputs = VGPU10_MAX_VS_OUTPUTS;
1091          svgascreen->max_gs_inputs  = VGPU10_MAX_GS_INPUTS;
1092       }
1093    }
1094    else {
1095       /* VGPU9 */
1096       unsigned vs_ver = get_uint_cap(sws, SVGA3D_DEVCAP_VERTEX_SHADER_VERSION,
1097                                      SVGA3DVSVERSION_NONE);
1098       unsigned fs_ver = get_uint_cap(sws, SVGA3D_DEVCAP_FRAGMENT_SHADER_VERSION,
1099                                      SVGA3DPSVERSION_NONE);
1100 
1101       /* we require Shader model 3.0 or later */
1102       if (fs_ver < SVGA3DPSVERSION_30 || vs_ver < SVGA3DVSVERSION_30) {
1103          goto error2;
1104       }
1105 
1106       svgascreen->haveProvokingVertex = false;
1107 
1108       svgascreen->haveLineSmooth =
1109          get_bool_cap(sws, SVGA3D_DEVCAP_LINE_AA, false);
1110 
1111       svgascreen->maxPointSize =
1112          get_float_cap(sws, SVGA3D_DEVCAP_MAX_POINT_SIZE, 1.0f);
1113       /* Keep this to a reasonable size to avoid failures in conform/pntaa.c */
1114       svgascreen->maxPointSize = MIN2(svgascreen->maxPointSize, 80.0f);
1115 
1116       /* The SVGA3D device always supports 4 targets at this time, regardless
1117        * of what querying SVGA3D_DEVCAP_MAX_RENDER_TARGETS might return.
1118        */
1119       svgascreen->max_color_buffers = 4;
1120 
1121       /* Only support one constant buffer
1122        */
1123       svgascreen->max_const_buffers = 1;
1124 
1125       /* No multisampling */
1126       svgascreen->ms_samples = 0;
1127 
1128       /* Only one viewport */
1129       svgascreen->max_viewports = 1;
1130 
1131       /* Shader limits */
1132       svgascreen->max_vs_inputs  = 16;
1133       svgascreen->max_vs_outputs = 10;
1134       svgascreen->max_gs_inputs  = 0;
1135    }
1136 
1137    /* common VGPU9 / VGPU10 caps */
1138    svgascreen->haveLineStipple =
1139       get_bool_cap(sws, SVGA3D_DEVCAP_LINE_STIPPLE, false);
1140 
1141    svgascreen->maxLineWidth =
1142       MAX2(1.0, get_float_cap(sws, SVGA3D_DEVCAP_MAX_LINE_WIDTH, 1.0f));
1143 
1144    svgascreen->maxLineWidthAA =
1145       MAX2(1.0, get_float_cap(sws, SVGA3D_DEVCAP_MAX_AA_LINE_WIDTH, 1.0f));
1146 
1147    if (0) {
1148       debug_printf("svga: haveProvokingVertex %u\n",
1149                    svgascreen->haveProvokingVertex);
1150       debug_printf("svga: haveLineStip %u  "
1151                    "haveLineSmooth %u  maxLineWidth %.2f  maxLineWidthAA %.2f\n",
1152                    svgascreen->haveLineStipple, svgascreen->haveLineSmooth,
1153                    svgascreen->maxLineWidth, svgascreen->maxLineWidthAA);
1154       debug_printf("svga: maxPointSize %g\n", svgascreen->maxPointSize);
1155       debug_printf("svga: msaa samples mask: 0x%x\n", svgascreen->ms_samples);
1156    }
1157 
1158    (void) mtx_init(&svgascreen->tex_mutex, mtx_plain);
1159    (void) mtx_init(&svgascreen->swc_mutex, mtx_plain | mtx_recursive);
1160 
1161    svga_screen_cache_init(svgascreen);
1162 
1163    svga_init_screen_caps(svgascreen);
1164 
1165    if (debug_get_bool_option("SVGA_NO_LOGGING", false) == true) {
1166       svgascreen->sws->host_log = nop_host_log;
1167    } else {
1168       init_logging(screen);
1169    }
1170 
1171    return screen;
1172 error2:
1173    FREE(svgascreen);
1174 error1:
1175    return NULL;
1176 }
1177 
1178 
1179 struct svga_winsys_screen *
svga_winsys_screen(struct pipe_screen * screen)1180 svga_winsys_screen(struct pipe_screen *screen)
1181 {
1182    return svga_screen(screen)->sws;
1183 }
1184 
1185 
1186 #if MESA_DEBUG
1187 struct svga_screen *
svga_screen(struct pipe_screen * screen)1188 svga_screen(struct pipe_screen *screen)
1189 {
1190    assert(screen);
1191    assert(screen->destroy == svga_destroy_screen);
1192    return (struct svga_screen *)screen;
1193 }
1194 #endif
1195