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