Path: blob/21.2-virgl/src/gallium/drivers/svga/svga_screen.c
4570 views
/**********************************************************1* Copyright 2008-2009 VMware, Inc. All rights reserved.2*3* Permission is hereby granted, free of charge, to any person4* obtaining a copy of this software and associated documentation5* files (the "Software"), to deal in the Software without6* restriction, including without limitation the rights to use, copy,7* modify, merge, publish, distribute, sublicense, and/or sell copies8* of the Software, and to permit persons to whom the Software is9* furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice shall be12* included in all copies or substantial portions of the Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,15* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND17* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS18* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN19* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN20* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21* SOFTWARE.22*23**********************************************************/2425#include "git_sha1.h" /* For MESA_GIT_SHA1 */26#include "util/format/u_format.h"27#include "util/u_memory.h"28#include "util/u_inlines.h"29#include "util/u_screen.h"30#include "util/u_string.h"31#include "util/u_math.h"3233#include "os/os_process.h"3435#include "svga_winsys.h"36#include "svga_public.h"37#include "svga_context.h"38#include "svga_format.h"39#include "svga_screen.h"40#include "svga_tgsi.h"41#include "svga_resource_texture.h"42#include "svga_resource.h"43#include "svga_debug.h"4445#include "svga3d_shaderdefs.h"46#include "VGPU10ShaderTokens.h"4748/* NOTE: this constant may get moved into a svga3d*.h header file */49#define SVGA3D_DX_MAX_RESOURCE_SIZE (128 * 1024 * 1024)5051#ifndef MESA_GIT_SHA152#define MESA_GIT_SHA1 "(unknown git revision)"53#endif5455#ifdef DEBUG56int SVGA_DEBUG = 0;5758static const struct debug_named_value svga_debug_flags[] = {59{ "dma", DEBUG_DMA, NULL },60{ "tgsi", DEBUG_TGSI, NULL },61{ "pipe", DEBUG_PIPE, NULL },62{ "state", DEBUG_STATE, NULL },63{ "screen", DEBUG_SCREEN, NULL },64{ "tex", DEBUG_TEX, NULL },65{ "swtnl", DEBUG_SWTNL, NULL },66{ "const", DEBUG_CONSTS, NULL },67{ "viewport", DEBUG_VIEWPORT, NULL },68{ "views", DEBUG_VIEWS, NULL },69{ "perf", DEBUG_PERF, NULL },70{ "flush", DEBUG_FLUSH, NULL },71{ "sync", DEBUG_SYNC, NULL },72{ "cache", DEBUG_CACHE, NULL },73{ "streamout", DEBUG_STREAMOUT, NULL },74{ "query", DEBUG_QUERY, NULL },75{ "samplers", DEBUG_SAMPLERS, NULL },76DEBUG_NAMED_VALUE_END77};78#endif7980static const char *81svga_get_vendor( struct pipe_screen *pscreen )82{83return "VMware, Inc.";84}858687static const char *88svga_get_name( struct pipe_screen *pscreen )89{90const char *build = "", *llvm = "", *mutex = "";91static char name[100];92#ifdef DEBUG93/* Only return internal details in the DEBUG version:94*/95build = "build: DEBUG;";96mutex = "mutex: " PIPE_ATOMIC ";";97#else98build = "build: RELEASE;";99#endif100#ifdef DRAW_LLVM_AVAILABLE101llvm = "LLVM;";102#endif103104snprintf(name, sizeof(name), "SVGA3D; %s %s %s", build, mutex, llvm);105return name;106}107108109/** Helper for querying float-valued device cap */110static float111get_float_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap,112float defaultVal)113{114SVGA3dDevCapResult result;115if (sws->get_cap(sws, cap, &result))116return result.f;117else118return defaultVal;119}120121122/** Helper for querying uint-valued device cap */123static unsigned124get_uint_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap,125unsigned defaultVal)126{127SVGA3dDevCapResult result;128if (sws->get_cap(sws, cap, &result))129return result.u;130else131return defaultVal;132}133134135/** Helper for querying boolean-valued device cap */136static boolean137get_bool_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap,138boolean defaultVal)139{140SVGA3dDevCapResult result;141if (sws->get_cap(sws, cap, &result))142return result.b;143else144return defaultVal;145}146147148static float149svga_get_paramf(struct pipe_screen *screen, enum pipe_capf param)150{151struct svga_screen *svgascreen = svga_screen(screen);152struct svga_winsys_screen *sws = svgascreen->sws;153154switch (param) {155case PIPE_CAPF_MAX_LINE_WIDTH:156return svgascreen->maxLineWidth;157case PIPE_CAPF_MAX_LINE_WIDTH_AA:158return svgascreen->maxLineWidthAA;159160case PIPE_CAPF_MAX_POINT_WIDTH:161FALLTHROUGH;162case PIPE_CAPF_MAX_POINT_WIDTH_AA:163return svgascreen->maxPointSize;164165case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:166return (float) get_uint_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_ANISOTROPY, 4);167168case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:169return 15.0;170171case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:172FALLTHROUGH;173case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:174FALLTHROUGH;175case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:176return 0.0f;177178}179180debug_printf("Unexpected PIPE_CAPF_ query %u\n", param);181return 0;182}183184185static int186svga_get_param(struct pipe_screen *screen, enum pipe_cap param)187{188struct svga_screen *svgascreen = svga_screen(screen);189struct svga_winsys_screen *sws = svgascreen->sws;190SVGA3dDevCapResult result;191192switch (param) {193case PIPE_CAP_NPOT_TEXTURES:194case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:195case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:196return 1;197case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:198/*199* "In virtually every OpenGL implementation and hardware,200* GL_MAX_DUAL_SOURCE_DRAW_BUFFERS is 1"201* http://www.opengl.org/wiki/Blending202*/203return sws->have_vgpu10 ? 1 : 0;204case PIPE_CAP_ANISOTROPIC_FILTER:205return 1;206case PIPE_CAP_POINT_SPRITE:207return 1;208case PIPE_CAP_MAX_RENDER_TARGETS:209return svgascreen->max_color_buffers;210case PIPE_CAP_OCCLUSION_QUERY:211return 1;212case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:213return sws->have_vgpu10;214case PIPE_CAP_TEXTURE_SWIZZLE:215return 1;216case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:217return 256;218219case PIPE_CAP_MAX_TEXTURE_2D_SIZE:220{221unsigned size = 1 << (SVGA_MAX_TEXTURE_LEVELS - 1);222if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_WIDTH, &result))223size = MIN2(result.u, size);224else225size = 2048;226if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_HEIGHT, &result))227size = MIN2(result.u, size);228else229size = 2048;230return size;231}232233case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:234if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VOLUME_EXTENT, &result))235return 8; /* max 128x128x128 */236return MIN2(util_logbase2(result.u) + 1, SVGA_MAX_TEXTURE_LEVELS);237238case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:239/*240* No mechanism to query the host, and at least limited to 2048x2048 on241* certain hardware.242*/243return MIN2(util_last_bit(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE)),24412 /* 2048x2048 */);245246case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:247return sws->have_sm5 ? SVGA3D_SM5_MAX_SURFACE_ARRAYSIZE :248(sws->have_vgpu10 ? SVGA3D_SM4_MAX_SURFACE_ARRAYSIZE : 0);249250case PIPE_CAP_BLEND_EQUATION_SEPARATE: /* req. for GL 1.5 */251return 1;252253case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:254return 1;255case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:256return sws->have_vgpu10;257case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:258return !sws->have_vgpu10;259260case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:261return 1; /* The color outputs of vertex shaders are not clamped */262case PIPE_CAP_VERTEX_COLOR_CLAMPED:263return sws->have_vgpu10;264265case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:266return 1; /* expected for GL_ARB_framebuffer_object */267268case PIPE_CAP_GLSL_FEATURE_LEVEL:269if (sws->have_sm5) {270return 410;271} else if (sws->have_vgpu10) {272return 330;273} else {274return 120;275}276277case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:278return sws->have_sm5 ? 410 : (sws->have_vgpu10 ? 330 : 120);279280case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:281return 0;282283case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:284case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:285case PIPE_CAP_VERTEX_SHADER_SATURATE:286return 1;287288case PIPE_CAP_DEPTH_CLIP_DISABLE:289case PIPE_CAP_INDEP_BLEND_ENABLE:290case PIPE_CAP_CONDITIONAL_RENDER:291case PIPE_CAP_QUERY_TIMESTAMP:292case PIPE_CAP_TGSI_INSTANCEID:293case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:294case PIPE_CAP_SEAMLESS_CUBE_MAP:295case PIPE_CAP_FAKE_SW_MSAA:296return sws->have_vgpu10;297298case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:299return sws->have_vgpu10 ? SVGA3D_DX_MAX_SOTARGETS : 0;300case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:301return sws->have_vgpu10 ? 4 : 0;302case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:303return sws->have_sm5 ? SVGA3D_MAX_STREAMOUT_DECLS :304(sws->have_vgpu10 ? SVGA3D_MAX_DX10_STREAMOUT_DECLS : 0);305case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:306return sws->have_sm5;307case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:308return sws->have_sm5;309case PIPE_CAP_TEXTURE_MULTISAMPLE:310return svgascreen->ms_samples ? 1 : 0;311312case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:313/* convert bytes to texels for the case of the largest texel314* size: float[4].315*/316return SVGA3D_DX_MAX_RESOURCE_SIZE / (4 * sizeof(float));317318case PIPE_CAP_MIN_TEXEL_OFFSET:319return sws->have_vgpu10 ? VGPU10_MIN_TEXEL_FETCH_OFFSET : 0;320case PIPE_CAP_MAX_TEXEL_OFFSET:321return sws->have_vgpu10 ? VGPU10_MAX_TEXEL_FETCH_OFFSET : 0;322323case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:324case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:325return 0;326327case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:328return sws->have_vgpu10 ? 256 : 0;329case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:330return sws->have_vgpu10 ? 1024 : 0;331332case PIPE_CAP_PRIMITIVE_RESTART:333case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:334return 1; /* may be a sw fallback, depending on restart index */335336case PIPE_CAP_GENERATE_MIPMAP:337return sws->have_generate_mipmap_cmd;338339case PIPE_CAP_NATIVE_FENCE_FD:340return sws->have_fence_fd;341342case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:343return 1;344345case PIPE_CAP_CUBE_MAP_ARRAY:346case PIPE_CAP_INDEP_BLEND_FUNC:347case PIPE_CAP_SAMPLE_SHADING:348case PIPE_CAP_FORCE_PERSAMPLE_INTERP:349case PIPE_CAP_TEXTURE_QUERY_LOD:350return sws->have_sm4_1;351352case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:353/* SM4_1 supports only single-channel textures where as SM5 supports354* all four channel textures */355return sws->have_sm5 ? 4 :356(sws->have_sm4_1 ? 1 : 0);357case PIPE_CAP_DRAW_INDIRECT:358return sws->have_sm5;359case PIPE_CAP_MAX_VERTEX_STREAMS:360return sws->have_sm5 ? 4 : 0;361case PIPE_CAP_COMPUTE:362return 0;363case PIPE_CAP_MAX_VARYINGS:364return sws->have_vgpu10 ? VGPU10_MAX_FS_INPUTS : 10;365case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:366return sws->have_coherent;367368case PIPE_CAP_SHAREABLE_SHADERS:369return 0;370371case PIPE_CAP_PCI_GROUP:372case PIPE_CAP_PCI_BUS:373case PIPE_CAP_PCI_DEVICE:374case PIPE_CAP_PCI_FUNCTION:375return 0;376case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:377return 64;378case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:379case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:380case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:381return 1; /* need 4-byte alignment for all offsets and strides */382case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:383return 2048;384case PIPE_CAP_MAX_VIEWPORTS:385assert((!sws->have_vgpu10 && svgascreen->max_viewports == 1) ||386(sws->have_vgpu10 &&387svgascreen->max_viewports == SVGA3D_DX_MAX_VIEWPORTS));388return svgascreen->max_viewports;389case PIPE_CAP_ENDIANNESS:390return PIPE_ENDIAN_LITTLE;391392case PIPE_CAP_VENDOR_ID:393return 0x15ad; /* VMware Inc. */394case PIPE_CAP_DEVICE_ID:395return 0x0405; /* assume SVGA II */396case PIPE_CAP_ACCELERATED:397return 0; /* XXX: */398case PIPE_CAP_VIDEO_MEMORY:399/* XXX: Query the host ? */400return 1;401case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:402return sws->have_vgpu10;403case PIPE_CAP_CLEAR_TEXTURE:404return sws->have_vgpu10;405case PIPE_CAP_DOUBLES:406return sws->have_sm5;407case PIPE_CAP_UMA:408case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:409case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:410return 0;411case PIPE_CAP_TGSI_DIV:412return 1;413case PIPE_CAP_MAX_GS_INVOCATIONS:414return 32;415case PIPE_CAP_MAX_SHADER_BUFFER_SIZE:416return 1 << 27;417/* Verify this once protocol is finalized. Setting it to minimum value. */418case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:419return sws->have_sm5 ? 30 : 0;420default:421return u_pipe_screen_get_param_defaults(screen, param);422}423}424425426static int427vgpu9_get_shader_param(struct pipe_screen *screen,428enum pipe_shader_type shader,429enum pipe_shader_cap param)430{431struct svga_screen *svgascreen = svga_screen(screen);432struct svga_winsys_screen *sws = svgascreen->sws;433unsigned val;434435assert(!sws->have_vgpu10);436437switch (shader)438{439case PIPE_SHADER_FRAGMENT:440switch (param)441{442case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:443case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:444return get_uint_cap(sws,445SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_INSTRUCTIONS,446512);447case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:448case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:449return 512;450case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:451return SVGA3D_MAX_NESTING_LEVEL;452case PIPE_SHADER_CAP_MAX_INPUTS:453return 10;454case PIPE_SHADER_CAP_MAX_OUTPUTS:455return svgascreen->max_color_buffers;456case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:457return 224 * sizeof(float[4]);458case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:459return 1;460case PIPE_SHADER_CAP_MAX_TEMPS:461val = get_uint_cap(sws, SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_TEMPS, 32);462return MIN2(val, SVGA3D_TEMPREG_MAX);463case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:464/*465* Although PS 3.0 has some addressing abilities it can only represent466* loops that can be statically determined and unrolled. Given we can467* only handle a subset of the cases that the gallium frontend already468* does it is better to defer loop unrolling to the gallium frontend.469*/470return 0;471case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:472return 0;473case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:474return 0;475case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:476case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:477case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:478return 0;479case PIPE_SHADER_CAP_SUBROUTINES:480return 0;481case PIPE_SHADER_CAP_INT64_ATOMICS:482case PIPE_SHADER_CAP_INTEGERS:483return 0;484case PIPE_SHADER_CAP_FP16:485case PIPE_SHADER_CAP_FP16_DERIVATIVES:486case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:487case PIPE_SHADER_CAP_INT16:488case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:489return 0;490case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:491case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:492return 16;493case PIPE_SHADER_CAP_PREFERRED_IR:494return PIPE_SHADER_IR_TGSI;495case PIPE_SHADER_CAP_SUPPORTED_IRS:496return 1 << PIPE_SHADER_IR_TGSI;497case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:498case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:499case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:500case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:501case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:502case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:503case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:504case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:505case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:506case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:507case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:508return 0;509case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:510return 32;511}512/* If we get here, we failed to handle a cap above */513debug_printf("Unexpected fragment shader query %u\n", param);514return 0;515case PIPE_SHADER_VERTEX:516switch (param)517{518case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:519case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:520return get_uint_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_INSTRUCTIONS,521512);522case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:523case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:524/* XXX: until we have vertex texture support */525return 0;526case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:527return SVGA3D_MAX_NESTING_LEVEL;528case PIPE_SHADER_CAP_MAX_INPUTS:529return 16;530case PIPE_SHADER_CAP_MAX_OUTPUTS:531return 10;532case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:533return 256 * sizeof(float[4]);534case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:535return 1;536case PIPE_SHADER_CAP_MAX_TEMPS:537val = get_uint_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, 32);538return MIN2(val, SVGA3D_TEMPREG_MAX);539case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:540return 0;541case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:542return 0;543case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:544case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:545return 1;546case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:547return 0;548case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:549return 1;550case PIPE_SHADER_CAP_SUBROUTINES:551return 0;552case PIPE_SHADER_CAP_INT64_ATOMICS:553case PIPE_SHADER_CAP_INTEGERS:554return 0;555case PIPE_SHADER_CAP_FP16:556case PIPE_SHADER_CAP_FP16_DERIVATIVES:557case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:558case PIPE_SHADER_CAP_INT16:559case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:560return 0;561case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:562case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:563return 0;564case PIPE_SHADER_CAP_PREFERRED_IR:565return PIPE_SHADER_IR_TGSI;566case PIPE_SHADER_CAP_SUPPORTED_IRS:567return 1 << PIPE_SHADER_IR_TGSI;568case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:569case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:570case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:571case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:572case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:573case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:574case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:575case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:576case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:577case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:578case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:579return 0;580case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:581return 32;582}583/* If we get here, we failed to handle a cap above */584debug_printf("Unexpected vertex shader query %u\n", param);585return 0;586case PIPE_SHADER_GEOMETRY:587case PIPE_SHADER_COMPUTE:588case PIPE_SHADER_TESS_CTRL:589case PIPE_SHADER_TESS_EVAL:590/* no support for geometry, tess or compute shaders at this time */591return 0;592default:593debug_printf("Unexpected shader type (%u) query\n", shader);594return 0;595}596return 0;597}598599600static int601vgpu10_get_shader_param(struct pipe_screen *screen,602enum pipe_shader_type shader,603enum pipe_shader_cap param)604{605struct svga_screen *svgascreen = svga_screen(screen);606struct svga_winsys_screen *sws = svgascreen->sws;607608assert(sws->have_vgpu10);609(void) sws; /* silence unused var warnings in non-debug builds */610611if ((!sws->have_sm5) &&612(shader == PIPE_SHADER_TESS_CTRL || shader == PIPE_SHADER_TESS_EVAL))613return 0;614615if (shader == PIPE_SHADER_COMPUTE)616return 0;617618/* NOTE: we do not query the device for any caps/limits at this time */619620/* Generally the same limits for vertex, geometry and fragment shaders */621switch (param) {622case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:623case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:624case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:625case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:626return 64 * 1024;627case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:628return 64;629case PIPE_SHADER_CAP_MAX_INPUTS:630if (shader == PIPE_SHADER_FRAGMENT)631return VGPU10_MAX_FS_INPUTS;632else if (shader == PIPE_SHADER_GEOMETRY)633return VGPU10_MAX_GS_INPUTS;634else if (shader == PIPE_SHADER_TESS_CTRL)635return VGPU11_MAX_HS_INPUT_CONTROL_POINTS;636else if (shader == PIPE_SHADER_TESS_EVAL)637return VGPU11_MAX_DS_INPUT_CONTROL_POINTS;638else639return VGPU10_MAX_VS_INPUTS;640case PIPE_SHADER_CAP_MAX_OUTPUTS:641if (shader == PIPE_SHADER_FRAGMENT)642return VGPU10_MAX_FS_OUTPUTS;643else if (shader == PIPE_SHADER_GEOMETRY)644return VGPU10_MAX_GS_OUTPUTS;645else if (shader == PIPE_SHADER_TESS_CTRL)646return VGPU11_MAX_HS_OUTPUTS;647else if (shader == PIPE_SHADER_TESS_EVAL)648return VGPU11_MAX_DS_OUTPUTS;649else650return VGPU10_MAX_VS_OUTPUTS;651case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:652return VGPU10_MAX_CONSTANT_BUFFER_ELEMENT_COUNT * sizeof(float[4]);653case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:654return svgascreen->max_const_buffers;655case PIPE_SHADER_CAP_MAX_TEMPS:656return VGPU10_MAX_TEMPS;657case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:658case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:659case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:660case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:661return TRUE; /* XXX verify */662case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:663case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:664case PIPE_SHADER_CAP_SUBROUTINES:665case PIPE_SHADER_CAP_INTEGERS:666return TRUE;667case PIPE_SHADER_CAP_FP16:668case PIPE_SHADER_CAP_FP16_DERIVATIVES:669case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:670case PIPE_SHADER_CAP_INT16:671case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:672return FALSE;673case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:674case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:675return SVGA3D_DX_MAX_SAMPLERS;676case PIPE_SHADER_CAP_PREFERRED_IR:677return PIPE_SHADER_IR_TGSI;678case PIPE_SHADER_CAP_SUPPORTED_IRS:679return 1 << PIPE_SHADER_IR_TGSI;680case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:681case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:682case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:683case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:684case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:685case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:686case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:687case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:688case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:689case PIPE_SHADER_CAP_INT64_ATOMICS:690case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:691case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:692return 0;693case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:694return 32;695default:696debug_printf("Unexpected vgpu10 shader query %u\n", param);697return 0;698}699return 0;700}701702703static int704svga_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader,705enum pipe_shader_cap param)706{707struct svga_screen *svgascreen = svga_screen(screen);708struct svga_winsys_screen *sws = svgascreen->sws;709if (sws->have_vgpu10) {710return vgpu10_get_shader_param(screen, shader, param);711}712else {713return vgpu9_get_shader_param(screen, shader, param);714}715}716717718static void719svga_fence_reference(struct pipe_screen *screen,720struct pipe_fence_handle **ptr,721struct pipe_fence_handle *fence)722{723struct svga_winsys_screen *sws = svga_screen(screen)->sws;724sws->fence_reference(sws, ptr, fence);725}726727728static bool729svga_fence_finish(struct pipe_screen *screen,730struct pipe_context *ctx,731struct pipe_fence_handle *fence,732uint64_t timeout)733{734struct svga_winsys_screen *sws = svga_screen(screen)->sws;735bool retVal;736737SVGA_STATS_TIME_PUSH(sws, SVGA_STATS_TIME_FENCEFINISH);738739if (!timeout) {740retVal = sws->fence_signalled(sws, fence, 0) == 0;741}742else {743SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s fence_ptr %p\n",744__FUNCTION__, fence);745746retVal = sws->fence_finish(sws, fence, timeout, 0) == 0;747}748749SVGA_STATS_TIME_POP(sws);750751return retVal;752}753754755static int756svga_fence_get_fd(struct pipe_screen *screen,757struct pipe_fence_handle *fence)758{759struct svga_winsys_screen *sws = svga_screen(screen)->sws;760761return sws->fence_get_fd(sws, fence, TRUE);762}763764765static int766svga_get_driver_query_info(struct pipe_screen *screen,767unsigned index,768struct pipe_driver_query_info *info)769{770#define QUERY(NAME, ENUM, UNITS) \771{NAME, ENUM, {0}, UNITS, PIPE_DRIVER_QUERY_RESULT_TYPE_AVERAGE, 0, 0x0}772773static const struct pipe_driver_query_info queries[] = {774/* per-frame counters */775QUERY("num-draw-calls", SVGA_QUERY_NUM_DRAW_CALLS,776PIPE_DRIVER_QUERY_TYPE_UINT64),777QUERY("num-fallbacks", SVGA_QUERY_NUM_FALLBACKS,778PIPE_DRIVER_QUERY_TYPE_UINT64),779QUERY("num-flushes", SVGA_QUERY_NUM_FLUSHES,780PIPE_DRIVER_QUERY_TYPE_UINT64),781QUERY("num-validations", SVGA_QUERY_NUM_VALIDATIONS,782PIPE_DRIVER_QUERY_TYPE_UINT64),783QUERY("map-buffer-time", SVGA_QUERY_MAP_BUFFER_TIME,784PIPE_DRIVER_QUERY_TYPE_MICROSECONDS),785QUERY("num-buffers-mapped", SVGA_QUERY_NUM_BUFFERS_MAPPED,786PIPE_DRIVER_QUERY_TYPE_UINT64),787QUERY("num-textures-mapped", SVGA_QUERY_NUM_TEXTURES_MAPPED,788PIPE_DRIVER_QUERY_TYPE_UINT64),789QUERY("num-bytes-uploaded", SVGA_QUERY_NUM_BYTES_UPLOADED,790PIPE_DRIVER_QUERY_TYPE_BYTES),791QUERY("num-command-buffers", SVGA_QUERY_NUM_COMMAND_BUFFERS,792PIPE_DRIVER_QUERY_TYPE_UINT64),793QUERY("command-buffer-size", SVGA_QUERY_COMMAND_BUFFER_SIZE,794PIPE_DRIVER_QUERY_TYPE_BYTES),795QUERY("flush-time", SVGA_QUERY_FLUSH_TIME,796PIPE_DRIVER_QUERY_TYPE_MICROSECONDS),797QUERY("surface-write-flushes", SVGA_QUERY_SURFACE_WRITE_FLUSHES,798PIPE_DRIVER_QUERY_TYPE_UINT64),799QUERY("num-readbacks", SVGA_QUERY_NUM_READBACKS,800PIPE_DRIVER_QUERY_TYPE_UINT64),801QUERY("num-resource-updates", SVGA_QUERY_NUM_RESOURCE_UPDATES,802PIPE_DRIVER_QUERY_TYPE_UINT64),803QUERY("num-buffer-uploads", SVGA_QUERY_NUM_BUFFER_UPLOADS,804PIPE_DRIVER_QUERY_TYPE_UINT64),805QUERY("num-const-buf-updates", SVGA_QUERY_NUM_CONST_BUF_UPDATES,806PIPE_DRIVER_QUERY_TYPE_UINT64),807QUERY("num-const-updates", SVGA_QUERY_NUM_CONST_UPDATES,808PIPE_DRIVER_QUERY_TYPE_UINT64),809QUERY("num-shader-relocations", SVGA_QUERY_NUM_SHADER_RELOCATIONS,810PIPE_DRIVER_QUERY_TYPE_UINT64),811QUERY("num-surface-relocations", SVGA_QUERY_NUM_SURFACE_RELOCATIONS,812PIPE_DRIVER_QUERY_TYPE_UINT64),813814/* running total counters */815QUERY("memory-used", SVGA_QUERY_MEMORY_USED,816PIPE_DRIVER_QUERY_TYPE_BYTES),817QUERY("num-shaders", SVGA_QUERY_NUM_SHADERS,818PIPE_DRIVER_QUERY_TYPE_UINT64),819QUERY("num-resources", SVGA_QUERY_NUM_RESOURCES,820PIPE_DRIVER_QUERY_TYPE_UINT64),821QUERY("num-state-objects", SVGA_QUERY_NUM_STATE_OBJECTS,822PIPE_DRIVER_QUERY_TYPE_UINT64),823QUERY("num-surface-views", SVGA_QUERY_NUM_SURFACE_VIEWS,824PIPE_DRIVER_QUERY_TYPE_UINT64),825QUERY("num-generate-mipmap", SVGA_QUERY_NUM_GENERATE_MIPMAP,826PIPE_DRIVER_QUERY_TYPE_UINT64),827QUERY("num-failed-allocations", SVGA_QUERY_NUM_FAILED_ALLOCATIONS,828PIPE_DRIVER_QUERY_TYPE_UINT64),829QUERY("num-commands-per-draw", SVGA_QUERY_NUM_COMMANDS_PER_DRAW,830PIPE_DRIVER_QUERY_TYPE_FLOAT),831QUERY("shader-mem-used", SVGA_QUERY_SHADER_MEM_USED,832PIPE_DRIVER_QUERY_TYPE_UINT64),833};834#undef QUERY835836if (!info)837return ARRAY_SIZE(queries);838839if (index >= ARRAY_SIZE(queries))840return 0;841842*info = queries[index];843return 1;844}845846847static void848init_logging(struct pipe_screen *screen)849{850struct svga_screen *svgascreen = svga_screen(screen);851static const char *log_prefix = "Mesa: ";852char host_log[1000];853854/* Log Version to Host */855snprintf(host_log, sizeof(host_log) - strlen(log_prefix),856"%s%s\n", log_prefix, svga_get_name(screen));857svgascreen->sws->host_log(svgascreen->sws, host_log);858859snprintf(host_log, sizeof(host_log) - strlen(log_prefix),860"%s" PACKAGE_VERSION MESA_GIT_SHA1, log_prefix);861svgascreen->sws->host_log(svgascreen->sws, host_log);862863/* If the SVGA_EXTRA_LOGGING env var is set, log the process's command864* line (program name and arguments).865*/866if (debug_get_bool_option("SVGA_EXTRA_LOGGING", FALSE)) {867char cmdline[1000];868if (os_get_command_line(cmdline, sizeof(cmdline))) {869snprintf(host_log, sizeof(host_log) - strlen(log_prefix),870"%s%s\n", log_prefix, cmdline);871svgascreen->sws->host_log(svgascreen->sws, host_log);872}873}874}875876877/**878* no-op logging function to use when SVGA_NO_LOGGING is set.879*/880static void881nop_host_log(struct svga_winsys_screen *sws, const char *message)882{883/* nothing */884}885886887static void888svga_destroy_screen( struct pipe_screen *screen )889{890struct svga_screen *svgascreen = svga_screen(screen);891892svga_screen_cache_cleanup(svgascreen);893894mtx_destroy(&svgascreen->swc_mutex);895mtx_destroy(&svgascreen->tex_mutex);896897svgascreen->sws->destroy(svgascreen->sws);898899FREE(svgascreen);900}901902903/**904* Create a new svga_screen object905*/906struct pipe_screen *907svga_screen_create(struct svga_winsys_screen *sws)908{909struct svga_screen *svgascreen;910struct pipe_screen *screen;911912#ifdef DEBUG913SVGA_DEBUG = debug_get_flags_option("SVGA_DEBUG", svga_debug_flags, 0 );914#endif915916svgascreen = CALLOC_STRUCT(svga_screen);917if (!svgascreen)918goto error1;919920svgascreen->debug.force_level_surface_view =921debug_get_bool_option("SVGA_FORCE_LEVEL_SURFACE_VIEW", FALSE);922svgascreen->debug.force_surface_view =923debug_get_bool_option("SVGA_FORCE_SURFACE_VIEW", FALSE);924svgascreen->debug.force_sampler_view =925debug_get_bool_option("SVGA_FORCE_SAMPLER_VIEW", FALSE);926svgascreen->debug.no_surface_view =927debug_get_bool_option("SVGA_NO_SURFACE_VIEW", FALSE);928svgascreen->debug.no_sampler_view =929debug_get_bool_option("SVGA_NO_SAMPLER_VIEW", FALSE);930svgascreen->debug.no_cache_index_buffers =931debug_get_bool_option("SVGA_NO_CACHE_INDEX_BUFFERS", FALSE);932933screen = &svgascreen->screen;934935screen->destroy = svga_destroy_screen;936screen->get_name = svga_get_name;937screen->get_vendor = svga_get_vendor;938screen->get_device_vendor = svga_get_vendor; // TODO actual device vendor939screen->get_param = svga_get_param;940screen->get_shader_param = svga_get_shader_param;941screen->get_paramf = svga_get_paramf;942screen->get_timestamp = NULL;943screen->is_format_supported = svga_is_format_supported;944screen->context_create = svga_context_create;945screen->fence_reference = svga_fence_reference;946screen->fence_finish = svga_fence_finish;947screen->fence_get_fd = svga_fence_get_fd;948949screen->get_driver_query_info = svga_get_driver_query_info;950svgascreen->sws = sws;951952svga_init_screen_resource_functions(svgascreen);953954if (sws->get_hw_version) {955svgascreen->hw_version = sws->get_hw_version(sws);956} else {957svgascreen->hw_version = SVGA3D_HWVERSION_WS65_B1;958}959960if (svgascreen->hw_version < SVGA3D_HWVERSION_WS8_B1) {961/* too old for 3D acceleration */962debug_printf("Hardware version 0x%x is too old for accerated 3D\n",963svgascreen->hw_version);964goto error2;965}966967debug_printf("%s enabled\n",968sws->have_sm5 ? "SM5" :969sws->have_sm4_1 ? "SM4_1" :970sws->have_vgpu10 ? "VGPU10" : "VGPU9");971972debug_printf("Mesa: %s %s (%s)\n", svga_get_name(screen),973PACKAGE_VERSION, MESA_GIT_SHA1);974975/*976* The D16, D24X8, and D24S8 formats always do an implicit shadow compare977* when sampled from, where as the DF16, DF24, and D24S8_INT do not. So978* we prefer the later when available.979*980* This mimics hardware vendors extensions for D3D depth sampling. See also981* http://aras-p.info/texts/D3D9GPUHacks.html982*/983984{985boolean has_df16, has_df24, has_d24s8_int;986SVGA3dSurfaceFormatCaps caps;987SVGA3dSurfaceFormatCaps mask;988mask.value = 0;989mask.zStencil = 1;990mask.texture = 1;991992svgascreen->depth.z16 = SVGA3D_Z_D16;993svgascreen->depth.x8z24 = SVGA3D_Z_D24X8;994svgascreen->depth.s8z24 = SVGA3D_Z_D24S8;995996svga_get_format_cap(svgascreen, SVGA3D_Z_DF16, &caps);997has_df16 = (caps.value & mask.value) == mask.value;998999svga_get_format_cap(svgascreen, SVGA3D_Z_DF24, &caps);1000has_df24 = (caps.value & mask.value) == mask.value;10011002svga_get_format_cap(svgascreen, SVGA3D_Z_D24S8_INT, &caps);1003has_d24s8_int = (caps.value & mask.value) == mask.value;10041005/* XXX: We might want some other logic here.1006* Like if we only have d24s8_int we should1007* emulate the other formats with that.1008*/1009if (has_df16) {1010svgascreen->depth.z16 = SVGA3D_Z_DF16;1011}1012if (has_df24) {1013svgascreen->depth.x8z24 = SVGA3D_Z_DF24;1014}1015if (has_d24s8_int) {1016svgascreen->depth.s8z24 = SVGA3D_Z_D24S8_INT;1017}1018}10191020/* Query device caps1021*/1022if (sws->have_vgpu10) {1023svgascreen->haveProvokingVertex1024= get_bool_cap(sws, SVGA3D_DEVCAP_DX_PROVOKING_VERTEX, FALSE);1025svgascreen->haveLineSmooth = TRUE;1026svgascreen->maxPointSize = 80.0F;1027svgascreen->max_color_buffers = SVGA3D_DX_MAX_RENDER_TARGETS;10281029/* Multisample samples per pixel */1030if (sws->have_sm4_1 && debug_get_bool_option("SVGA_MSAA", TRUE)) {1031if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_2X, FALSE))1032svgascreen->ms_samples |= 1 << 1;1033if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_4X, FALSE))1034svgascreen->ms_samples |= 1 << 3;1035}10361037if (sws->have_sm5 && debug_get_bool_option("SVGA_MSAA", TRUE)) {1038if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_8X, FALSE))1039svgascreen->ms_samples |= 1 << 7;1040}10411042/* Maximum number of constant buffers */1043svgascreen->max_const_buffers =1044get_uint_cap(sws, SVGA3D_DEVCAP_DX_MAX_CONSTANT_BUFFERS, 1);1045svgascreen->max_const_buffers = MIN2(svgascreen->max_const_buffers,1046SVGA_MAX_CONST_BUFS);10471048svgascreen->haveBlendLogicops =1049get_bool_cap(sws, SVGA3D_DEVCAP_LOGIC_BLENDOPS, FALSE);10501051screen->is_format_supported = svga_is_dx_format_supported;10521053svgascreen->max_viewports = SVGA3D_DX_MAX_VIEWPORTS;1054}1055else {1056/* VGPU9 */1057unsigned vs_ver = get_uint_cap(sws, SVGA3D_DEVCAP_VERTEX_SHADER_VERSION,1058SVGA3DVSVERSION_NONE);1059unsigned fs_ver = get_uint_cap(sws, SVGA3D_DEVCAP_FRAGMENT_SHADER_VERSION,1060SVGA3DPSVERSION_NONE);10611062/* we require Shader model 3.0 or later */1063if (fs_ver < SVGA3DPSVERSION_30 || vs_ver < SVGA3DVSVERSION_30) {1064goto error2;1065}10661067svgascreen->haveProvokingVertex = FALSE;10681069svgascreen->haveLineSmooth =1070get_bool_cap(sws, SVGA3D_DEVCAP_LINE_AA, FALSE);10711072svgascreen->maxPointSize =1073get_float_cap(sws, SVGA3D_DEVCAP_MAX_POINT_SIZE, 1.0f);1074/* Keep this to a reasonable size to avoid failures in conform/pntaa.c */1075svgascreen->maxPointSize = MIN2(svgascreen->maxPointSize, 80.0f);10761077/* The SVGA3D device always supports 4 targets at this time, regardless1078* of what querying SVGA3D_DEVCAP_MAX_RENDER_TARGETS might return.1079*/1080svgascreen->max_color_buffers = 4;10811082/* Only support one constant buffer1083*/1084svgascreen->max_const_buffers = 1;10851086/* No multisampling */1087svgascreen->ms_samples = 0;10881089/* Only one viewport */1090svgascreen->max_viewports = 1;1091}10921093/* common VGPU9 / VGPU10 caps */1094svgascreen->haveLineStipple =1095get_bool_cap(sws, SVGA3D_DEVCAP_LINE_STIPPLE, FALSE);10961097svgascreen->maxLineWidth =1098MAX2(1.0, get_float_cap(sws, SVGA3D_DEVCAP_MAX_LINE_WIDTH, 1.0f));10991100svgascreen->maxLineWidthAA =1101MAX2(1.0, get_float_cap(sws, SVGA3D_DEVCAP_MAX_AA_LINE_WIDTH, 1.0f));11021103if (0) {1104debug_printf("svga: haveProvokingVertex %u\n",1105svgascreen->haveProvokingVertex);1106debug_printf("svga: haveLineStip %u "1107"haveLineSmooth %u maxLineWidth %.2f maxLineWidthAA %.2f\n",1108svgascreen->haveLineStipple, svgascreen->haveLineSmooth,1109svgascreen->maxLineWidth, svgascreen->maxLineWidthAA);1110debug_printf("svga: maxPointSize %g\n", svgascreen->maxPointSize);1111debug_printf("svga: msaa samples mask: 0x%x\n", svgascreen->ms_samples);1112}11131114(void) mtx_init(&svgascreen->tex_mutex, mtx_plain);1115(void) mtx_init(&svgascreen->swc_mutex, mtx_recursive);11161117svga_screen_cache_init(svgascreen);11181119if (debug_get_bool_option("SVGA_NO_LOGGING", FALSE) == TRUE) {1120svgascreen->sws->host_log = nop_host_log;1121} else {1122init_logging(screen);1123}11241125return screen;1126error2:1127FREE(svgascreen);1128error1:1129return NULL;1130}113111321133struct svga_winsys_screen *1134svga_winsys_screen(struct pipe_screen *screen)1135{1136return svga_screen(screen)->sws;1137}113811391140#ifdef DEBUG1141struct svga_screen *1142svga_screen(struct pipe_screen *screen)1143{1144assert(screen);1145assert(screen->destroy == svga_destroy_screen);1146return (struct svga_screen *)screen;1147}1148#endif114911501151