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