X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_screen.c;h=b9cd9db5cbca6e7f089d8610078ad1fe3425df73;hb=38e706656d0ea99a893dcf469e8658ca78c5ffd8;hp=884aa595ae9184e09147f542c57ded9b5dd8df97;hpb=f6ccd594e73d5bebc0b3e4ee6cb2f7eea228058f;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index 884aa595ae9..b9cd9db5cbc 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -27,6 +27,7 @@ #include "util/u_format.h" #include "util/u_memory.h" #include "util/u_inlines.h" +#include "util/u_screen.h" #include "util/u_string.h" #include "util/u_math.h" @@ -36,7 +37,6 @@ #include "svga_public.h" #include "svga_context.h" #include "svga_format.h" -#include "svga_msg.h" #include "svga_screen.h" #include "svga_tgsi.h" #include "svga_resource_texture.h" @@ -91,16 +91,14 @@ svga_get_name( struct pipe_screen *pscreen ) */ build = "build: DEBUG;"; mutex = "mutex: " PIPE_ATOMIC ";"; -#elif defined(VMX86_STATS) - build = "build: OPT;"; #else build = "build: RELEASE;"; #endif -#ifdef HAVE_LLVM +#ifdef LLVM_AVAILABLE llvm = "LLVM;"; #endif - util_snprintf(name, sizeof(name), "SVGA3D; %s %s %s", build, mutex, llvm); + snprintf(name, sizeof(name), "SVGA3D; %s %s %s", build, mutex, llvm); return name; } @@ -223,18 +221,18 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: return 256; - case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: + case PIPE_CAP_MAX_TEXTURE_2D_SIZE: { - unsigned levels = SVGA_MAX_TEXTURE_LEVELS; + unsigned size = 1 << (SVGA_MAX_TEXTURE_LEVELS - 1); if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_WIDTH, &result)) - levels = MIN2(util_logbase2(result.u) + 1, levels); + size = MIN2(result.u, size); else - levels = 12 /* 2048x2048 */; + size = 2048; if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_HEIGHT, &result)) - levels = MIN2(util_logbase2(result.u) + 1, levels); + size = MIN2(result.u, size); else - levels = 12 /* 2048x2048 */; - return levels; + size = 2048; + return size; } case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: @@ -247,7 +245,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) * No mechanism to query the host, and at least limited to 2048x2048 on * certain hardware. */ - return MIN2(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS), + return MIN2(util_last_bit(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE)), 12 /* 2048x2048 */); case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: @@ -279,12 +277,15 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) return sws->have_vgpu10 ? 330 : 120; case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY: - return sws->have_vgpu10 ? 140 : 120; + return sws->have_vgpu10 ? 330 : 120; case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: + case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE: return 0; - case PIPE_CAP_SM3: + case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD: + case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES: + case PIPE_CAP_VERTEX_SHADER_SATURATE: return 1; case PIPE_CAP_DEPTH_CLIP_DISABLE: @@ -341,25 +342,34 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: return 1; + case PIPE_CAP_CUBE_MAP_ARRAY: + case PIPE_CAP_INDEP_BLEND_FUNC: + case PIPE_CAP_SAMPLE_SHADING: + case PIPE_CAP_FORCE_PERSAMPLE_INTERP: + case PIPE_CAP_TEXTURE_QUERY_LOD: + return sws->have_sm4_1; + + case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: + return sws->have_sm4_1 ? 1 : 0; /* only single-channel textures */ + case PIPE_CAP_MAX_VARYINGS: + return sws->have_vgpu10 ? VGPU10_MAX_FS_INPUTS : 10; + case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: + return sws->have_coherent; + /* Unsupported features */ case PIPE_CAP_TEXTURE_MIRROR_CLAMP: + case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE: case PIPE_CAP_SHADER_STENCIL_EXPORT: case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: - case PIPE_CAP_INDEP_BLEND_FUNC: case PIPE_CAP_TEXTURE_BARRIER: case PIPE_CAP_MAX_VERTEX_STREAMS: case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: case PIPE_CAP_COMPUTE: case PIPE_CAP_START_INSTANCE: - case PIPE_CAP_CUBE_MAP_ARRAY: case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: case PIPE_CAP_QUERY_PIPELINE_STATISTICS: case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: - case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: case PIPE_CAP_TEXTURE_GATHER_SM5: - case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: - case PIPE_CAP_TEXTURE_QUERY_LOD: - case PIPE_CAP_SAMPLE_SHADING: case PIPE_CAP_TEXTURE_GATHER_OFFSETS: case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: case PIPE_CAP_DRAW_INDIRECT: @@ -389,6 +399,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES: case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE: case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS: + case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET: return 0; case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: return 64; @@ -424,7 +435,6 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: case PIPE_CAP_DEPTH_BOUNDS_TEST: case PIPE_CAP_TGSI_TXQS: - case PIPE_CAP_FORCE_PERSAMPLE_INTERP: case PIPE_CAP_SHAREABLE_SHADERS: case PIPE_CAP_DRAW_PARAMETERS: case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: @@ -441,7 +451,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TGSI_ARRAY_COMPONENTS: case PIPE_CAP_TGSI_CAN_READ_OUTPUTS: case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: - case PIPE_CAP_TGSI_FS_FBFETCH: + case PIPE_CAP_FBFETCH: case PIPE_CAP_TGSI_MUL_ZERO_WINS: case PIPE_CAP_DOUBLES: case PIPE_CAP_INT64: @@ -471,12 +481,15 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_PACKED_UNIFORMS: case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS: return 0; + case PIPE_CAP_TGSI_DIV: + return 1; case PIPE_CAP_MAX_GS_INVOCATIONS: return 32; + case PIPE_CAP_MAX_SHADER_BUFFER_SIZE: + return 1 << 27; + default: + return u_pipe_screen_get_param_defaults(screen, param); } - - debug_printf("Unexpected PIPE_CAP_ query %u\n", param); - return 0; } @@ -559,8 +572,6 @@ vgpu9_get_shader_param(struct pipe_screen *screen, case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS: case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS: return 0; - case PIPE_SHADER_CAP_SCALAR_ISA: - return 1; case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: return 32; } @@ -628,8 +639,6 @@ vgpu9_get_shader_param(struct pipe_screen *screen, case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS: case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS: return 0; - case PIPE_SHADER_CAP_SCALAR_ISA: - return 1; case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: return 32; } @@ -731,8 +740,6 @@ vgpu10_get_shader_param(struct pipe_screen *screen, case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS: case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS: return 0; - case PIPE_SHADER_CAP_SCALAR_ISA: - return 1; case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: return 32; default: @@ -768,14 +775,14 @@ svga_fence_reference(struct pipe_screen *screen, } -static boolean +static bool svga_fence_finish(struct pipe_screen *screen, struct pipe_context *ctx, struct pipe_fence_handle *fence, uint64_t timeout) { struct svga_winsys_screen *sws = svga_screen(screen)->sws; - boolean retVal; + bool retVal; SVGA_STATS_TIME_PUSH(sws, SVGA_STATS_TIME_FENCEFINISH); @@ -882,17 +889,18 @@ svga_get_driver_query_info(struct pipe_screen *screen, static void init_logging(struct pipe_screen *screen) { + struct svga_screen *svgascreen = svga_screen(screen); static const char *log_prefix = "Mesa: "; char host_log[1000]; /* Log Version to Host */ - util_snprintf(host_log, sizeof(host_log) - strlen(log_prefix), - "%s%s", log_prefix, svga_get_name(screen)); - svga_host_log(host_log); + snprintf(host_log, sizeof(host_log) - strlen(log_prefix), + "%s%s\n", log_prefix, svga_get_name(screen)); + svgascreen->sws->host_log(svgascreen->sws, host_log); - util_snprintf(host_log, sizeof(host_log) - strlen(log_prefix), - "%s" PACKAGE_VERSION MESA_GIT_SHA1, log_prefix); - svga_host_log(host_log); + snprintf(host_log, sizeof(host_log) - strlen(log_prefix), + "%s" PACKAGE_VERSION MESA_GIT_SHA1, log_prefix); + svgascreen->sws->host_log(svgascreen->sws, host_log); /* If the SVGA_EXTRA_LOGGING env var is set, log the process's command * line (program name and arguments). @@ -900,14 +908,24 @@ init_logging(struct pipe_screen *screen) if (debug_get_bool_option("SVGA_EXTRA_LOGGING", FALSE)) { char cmdline[1000]; if (os_get_command_line(cmdline, sizeof(cmdline))) { - util_snprintf(host_log, sizeof(host_log) - strlen(log_prefix), - "%s%s", log_prefix, cmdline); - svga_host_log(host_log); + snprintf(host_log, sizeof(host_log) - strlen(log_prefix), + "%s%s\n", log_prefix, cmdline); + svgascreen->sws->host_log(svgascreen->sws, host_log); } } } +/** + * no-op logging function to use when SVGA_NO_LOGGING is set. + */ +static void +nop_host_log(struct svga_winsys_screen *sws, const char *message) +{ + /* nothing */ +} + + static void svga_destroy_screen( struct pipe_screen *screen ) { @@ -988,6 +1006,13 @@ svga_screen_create(struct svga_winsys_screen *sws) goto error2; } + debug_printf("%s enabled = %u\n", + sws->have_sm4_1 ? "SM4_1" : "VGPU10", + sws->have_sm4_1 ? 1 : sws->have_vgpu10); + + debug_printf("Mesa: %s %s (%s)\n", svga_get_name(screen), + PACKAGE_VERSION, MESA_GIT_SHA1); + /* * The D16, D24X8, and D24S8 formats always do an implicit shadow compare * when sampled from, where as the DF16, DF24, and D24S8_INT do not. So @@ -1043,20 +1068,20 @@ svga_screen_create(struct svga_winsys_screen *sws) svgascreen->max_color_buffers = SVGA3D_DX_MAX_RENDER_TARGETS; /* Multisample samples per pixel */ - if (debug_get_bool_option("SVGA_MSAA", TRUE)) { - svgascreen->ms_samples = - get_uint_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_MASKABLESAMPLES, 0); + if (sws->have_sm4_1 && debug_get_bool_option("SVGA_MSAA", TRUE)) { + if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_2X, FALSE)) + svgascreen->ms_samples |= 1 << 1; + if (get_bool_cap(sws, SVGA3D_DEVCAP_MULTISAMPLE_4X, FALSE)) + svgascreen->ms_samples |= 1 << 3; } - /* We only support 4x, 8x, 16x MSAA */ - svgascreen->ms_samples &= ((1 << (4-1)) | - (1 << (8-1)) | - (1 << (16-1))); - /* Maximum number of constant buffers */ svgascreen->max_const_buffers = get_uint_cap(sws, SVGA3D_DEVCAP_DX_MAX_CONSTANT_BUFFERS, 1); - assert(svgascreen->max_const_buffers <= SVGA_MAX_CONST_BUFS); + svgascreen->max_const_buffers = MIN2(svgascreen->max_const_buffers, + SVGA_MAX_CONST_BUFS); + + screen->is_format_supported = svga_is_dx_format_supported; } else { /* VGPU9 */ @@ -1119,7 +1144,11 @@ svga_screen_create(struct svga_winsys_screen *sws) svga_screen_cache_init(svgascreen); - init_logging(screen); + if (debug_get_bool_option("SVGA_NO_LOGGING", FALSE) == TRUE) { + svgascreen->sws->host_log = nop_host_log; + } else { + init_logging(screen); + } return screen; error2: