xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/svga/svga_screen.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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