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