X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fswr%2Fswr_screen.cpp;h=9e8ee45bfb56714de5c32996297d18c1d8ae39c6;hb=8c9b9aac7d09e65195dca6681d59c10e4ef713d9;hp=ff0c2bb8a5cb111c37a62dccf236213130434208;hpb=9ddacd9af488485bfc5da1797e67ff322080c0d4;p=mesa.git diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp index ff0c2bb8a5c..9e8ee45bfb5 100644 --- a/src/gallium/drivers/swr/swr_screen.cpp +++ b/src/gallium/drivers/swr/swr_screen.cpp @@ -31,13 +31,14 @@ #include "pipe/p_screen.h" #include "pipe/p_defines.h" #include "util/u_memory.h" -#include "util/u_format.h" +#include "util/format/u_format.h" #include "util/u_inlines.h" #include "util/u_cpu_detect.h" -#include "util/u_format_s3tc.h" +#include "util/format/u_format_s3tc.h" #include "util/u_string.h" +#include "util/u_screen.h" -#include "state_tracker/sw_winsys.h" +#include "frontend/sw_winsys.h" #include "jit_api.h" @@ -51,7 +52,7 @@ * XXX Check max texture size values against core and sampler. */ #define SWR_MAX_TEXTURE_SIZE (2 * 1024 * 1024 * 1024ULL) /* 2GB */ -#define SWR_MAX_TEXTURE_2D_LEVELS 14 /* 8K x 8K for now */ +#define SWR_MAX_TEXTURE_2D_SIZE 8192 #define SWR_MAX_TEXTURE_3D_LEVELS 12 /* 2K x 2K x 2K for now */ #define SWR_MAX_TEXTURE_CUBE_LEVELS 14 /* 8K x 8K for now */ #define SWR_MAX_TEXTURE_ARRAY_LAYERS 512 /* 8K x 512 / 8K x 8K x 512 */ @@ -68,9 +69,8 @@ static const char * swr_get_name(struct pipe_screen *screen) { static char buf[100]; - util_snprintf(buf, sizeof(buf), "SWR (LLVM %u.%u, %u bits)", - HAVE_LLVM >> 8, HAVE_LLVM & 0xff, - lp_native_vector_width ); + snprintf(buf, sizeof(buf), "SWR (LLVM " MESA_LLVM_VERSION_STRING ", %u bits)", + lp_native_vector_width); return buf; } @@ -80,11 +80,12 @@ swr_get_vendor(struct pipe_screen *screen) return "Intel Corporation"; } -static boolean +static bool swr_is_format_supported(struct pipe_screen *_screen, enum pipe_format format, enum pipe_texture_target target, unsigned sample_count, + unsigned storage_sample_count, unsigned bind) { struct swr_screen *screen = swr_screen(_screen); @@ -100,51 +101,76 @@ swr_is_format_supported(struct pipe_screen *_screen, || target == PIPE_TEXTURE_CUBE || target == PIPE_TEXTURE_CUBE_ARRAY); + if (MAX2(1, sample_count) != MAX2(1, storage_sample_count)) + return false; + format_desc = util_format_description(format); if (!format_desc) - return FALSE; + return false; if ((sample_count > screen->msaa_max_count) - || !util_is_power_of_two(sample_count)) - return FALSE; + || !util_is_power_of_two_or_zero(sample_count)) + return false; if (bind & PIPE_BIND_DISPLAY_TARGET) { if (!winsys->is_displaytarget_format_supported(winsys, bind, format)) - return FALSE; + return false; } if (bind & PIPE_BIND_RENDER_TARGET) { if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) - return FALSE; + return false; if (mesa_to_swr_format(format) == (SWR_FORMAT)-1) - return FALSE; + return false; /* * Although possible, it is unnatural to render into compressed or YUV * surfaces. So disable these here to avoid going into weird paths - * inside the state trackers. + * inside gallium frontends. */ if (format_desc->block.width != 1 || format_desc->block.height != 1) - return FALSE; + return false; } if (bind & PIPE_BIND_DEPTH_STENCIL) { if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) - return FALSE; + return false; if (mesa_to_swr_format(format) == (SWR_FORMAT)-1) - return FALSE; + return false; } - if (format_desc->layout == UTIL_FORMAT_LAYOUT_BPTC || - format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC) { - return FALSE; + if (bind & PIPE_BIND_VERTEX_BUFFER) { + if (mesa_to_swr_format(format) == (SWR_FORMAT)-1) { + return false; + } + } + + if (format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC || + format_desc->layout == UTIL_FORMAT_LAYOUT_FXT1) + { + return false; } if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC && format != PIPE_FORMAT_ETC1_RGB8) { - return FALSE; + return false; + } + + if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) && + ((bind & PIPE_BIND_DISPLAY_TARGET) == 0)) { + /* Disable all 3-channel formats, where channel size != 32 bits. + * In some cases we run into crashes (in generate_unswizzled_blend()), + * for 3-channel RGB16 variants, there was an apparent LLVM bug. + * In any case, disabling the shallower 3-channel formats avoids a + * number of issues with GL_ARB_copy_image support. + */ + if (format_desc->is_array && + format_desc->nr_channels == 3 && + format_desc->block.bits != 96) { + return false; + } } return TRUE; @@ -157,8 +183,8 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) /* limits */ case PIPE_CAP_MAX_RENDER_TARGETS: return PIPE_MAX_COLOR_BUFS; - case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: - return SWR_MAX_TEXTURE_2D_LEVELS; + case PIPE_CAP_MAX_TEXTURE_2D_SIZE: + return SWR_MAX_TEXTURE_2D_SIZE; case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: return SWR_MAX_TEXTURE_3D_LEVELS; case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: @@ -172,17 +198,23 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: return 1024; case PIPE_CAP_MAX_VERTEX_STREAMS: - return 1; + return 4; case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE: return 2048; case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: return SWR_MAX_TEXTURE_ARRAY_LAYERS; + case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: case PIPE_CAP_MIN_TEXEL_OFFSET: return -8; + case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: case PIPE_CAP_MAX_TEXEL_OFFSET: return 7; + case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: + return 4; case PIPE_CAP_GLSL_FEATURE_LEVEL: return 330; + case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY: + return 140; case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: return 16; case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: @@ -190,26 +222,28 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: return 65536; case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: - return 0; - case PIPE_CAP_MAX_VIEWPORTS: return 1; + case PIPE_CAP_MAX_VIEWPORTS: + return KNOB_NUM_VIEWPORTS_SCISSORS; case PIPE_CAP_ENDIANNESS: return PIPE_ENDIAN_NATIVE; - case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: - case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: + case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE: return 0; /* supported features */ case PIPE_CAP_NPOT_TEXTURES: case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: - case PIPE_CAP_SM3: + case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD: + case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES: + case PIPE_CAP_VERTEX_SHADER_SATURATE: case PIPE_CAP_POINT_SPRITE: case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_QUERY_TIME_ELAPSED: case PIPE_CAP_QUERY_PIPELINE_STATISTICS: case PIPE_CAP_TEXTURE_MIRROR_CLAMP: + case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE: case PIPE_CAP_TEXTURE_SWIZZLE: case PIPE_CAP_BLEND_EQUATION_SEPARATE: case PIPE_CAP_INDEP_BLEND_ENABLE: @@ -245,6 +279,11 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_CULL_DISTANCE: case PIPE_CAP_CUBE_MAP_ARRAY: case PIPE_CAP_DOUBLES: + case PIPE_CAP_TEXTURE_QUERY_LOD: + case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: + case PIPE_CAP_TGSI_TG4_COMPONENT_IN_SWIZZLE: + case PIPE_CAP_QUERY_SO_OVERFLOW: + case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: return 1; /* MSAA support @@ -275,9 +314,7 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: case PIPE_CAP_TGSI_TEXCOORD: case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: - case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: case PIPE_CAP_TEXTURE_GATHER_SM5: - 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: @@ -290,7 +327,6 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TGSI_TXQS: case PIPE_CAP_FORCE_PERSAMPLE_INTERP: case PIPE_CAP_SHAREABLE_SHADERS: - case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: case PIPE_CAP_DRAW_PARAMETERS: case PIPE_CAP_TGSI_PACK_HALF_FLOAT: case PIPE_CAP_MULTI_DRAW_INDIRECT: @@ -318,10 +354,9 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS: case PIPE_CAP_TGSI_ARRAY_COMPONENTS: case PIPE_CAP_TGSI_CAN_READ_OUTPUTS: - case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: case PIPE_CAP_NATIVE_FENCE_FD: 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_INT64: case PIPE_CAP_INT64_DIVMOD: @@ -336,16 +371,34 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_POST_DEPTH_COVERAGE: case PIPE_CAP_BINDLESS_TEXTURE: case PIPE_CAP_NIR_SAMPLERS_AS_DEREF: - case PIPE_CAP_QUERY_SO_OVERFLOW: case PIPE_CAP_MEMOBJ: case PIPE_CAP_LOAD_CONSTBUF: case PIPE_CAP_TGSI_ANY_REG_AS_ADDRESS: case PIPE_CAP_TILE_RASTER_ORDER: case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: + case PIPE_CAP_FRAMEBUFFER_MSAA_CONSTRAINTS: case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET: case PIPE_CAP_CONTEXT_PRIORITY_MASK: case PIPE_CAP_FENCE_SIGNAL: + case PIPE_CAP_CONSTBUF0_FLAGS: + case PIPE_CAP_PACKED_UNIFORMS: + case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES: + case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES: + case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES: + 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_PROGRAMMABLE_SAMPLE_LOCATIONS: + case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET: + case PIPE_CAP_IMAGE_LOAD_FORMATTED: + case PIPE_CAP_TGSI_ATOMINC_WRAP: return 0; + case PIPE_CAP_MAX_GS_INVOCATIONS: + return 32; + case PIPE_CAP_MAX_SHADER_BUFFER_SIZE: + return 1 << 27; + case PIPE_CAP_MAX_VARYINGS: + return 32; case PIPE_CAP_VENDOR_ID: return 0xFFFFFFFF; @@ -362,11 +415,9 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) return (int)(system_memory >> 20); } + default: + return u_pipe_screen_get_param_defaults(screen, param); } - - /* should only get here on unhandled cases */ - debug_printf("Unexpected PIPE_CAP %d query\n", param); - return 0; } static int @@ -376,10 +427,13 @@ swr_get_shader_param(struct pipe_screen *screen, { if (shader == PIPE_SHADER_VERTEX || shader == PIPE_SHADER_FRAGMENT || - shader == PIPE_SHADER_GEOMETRY) + shader == PIPE_SHADER_GEOMETRY + || shader == PIPE_SHADER_TESS_CTRL || + shader == PIPE_SHADER_TESS_EVAL + ) return gallivm_get_shader_param(param); - // Todo: tesselation, compute + // Todo: compute return 0; } @@ -398,6 +452,10 @@ swr_get_paramf(struct pipe_screen *screen, enum pipe_capf param) return 0.0; case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: return 16.0; /* arbitrary */ + case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE: + case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE: + case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY: + return 0.0f; } /* should only get here on unhandled cases */ debug_printf("Unexpected PIPE_CAPF %d query\n", param); @@ -624,7 +682,7 @@ mesa_to_swr_format(enum pipe_format format) return it->second; } -static boolean +static bool swr_displaytarget_layout(struct swr_screen *screen, struct swr_resource *res) { struct sw_winsys *winsys = screen->winsys; @@ -642,7 +700,7 @@ swr_displaytarget_layout(struct swr_screen *screen, struct swr_resource *res) &stride); if (dt == NULL) - return FALSE; + return false; void *map = winsys->displaytarget_map(winsys, dt, 0); @@ -655,13 +713,13 @@ swr_displaytarget_layout(struct swr_screen *screen, struct swr_resource *res) winsys->displaytarget_unmap(winsys, dt); - return TRUE; + return true; } static bool swr_texture_layout(struct swr_screen *screen, struct swr_resource *res, - boolean allocate) + bool allocate) { struct pipe_resource *pt = &res->base; @@ -734,7 +792,7 @@ swr_texture_layout(struct swr_screen *screen, * surface sample count. */ if (screen->msaa_force_enable) { res->swr.numSamples = screen->msaa_max_count; - fprintf(stderr,"swr_texture_layout: forcing sample count: %d\n", + swr_print_info("swr_texture_layout: forcing sample count: %d\n", res->swr.numSamples); } } else { @@ -817,7 +875,9 @@ swr_texture_layout(struct swr_screen *screen, size_t total_size = (uint64_t)res->swr.depth * res->swr.qpitch * res->swr.pitch * res->swr.numSamples; - if (total_size > SWR_MAX_TEXTURE_SIZE) + + // Let non-sampled textures (e.g. buffer objects) bypass the size limit + if (swr_resource_is_texture(&res->base) && total_size > SWR_MAX_TEXTURE_SIZE) return false; if (allocate) { @@ -849,7 +909,7 @@ swr_texture_layout(struct swr_screen *screen, return true; } -static boolean +static bool swr_can_create_resource(struct pipe_screen *screen, const struct pipe_resource *templat) { @@ -861,7 +921,7 @@ swr_can_create_resource(struct pipe_screen *screen, /* Helper function that conditionally creates a single-sample resolve resource * and attaches it to main multisample resource. */ -static boolean +static bool swr_create_resolve_resource(struct pipe_screen *_screen, struct swr_resource *msaa_res) { @@ -1072,7 +1132,7 @@ swr_destroy_screen(struct pipe_screen *p_screen) struct swr_screen *screen = swr_screen(p_screen); struct sw_winsys *winsys = screen->winsys; - fprintf(stderr, "SWR destroy screen!\n"); + swr_print_info("SWR destroy screen!\n"); if (winsys->destroy) winsys->destroy(winsys); @@ -1101,17 +1161,16 @@ swr_validate_env_options(struct swr_screen *screen) int msaa_max_count = debug_get_num_option("SWR_MSAA_MAX_COUNT", 1); if (msaa_max_count != 1) { if ((msaa_max_count < 1) || (msaa_max_count > SWR_MAX_NUM_MULTISAMPLES) - || !util_is_power_of_two(msaa_max_count)) { + || !util_is_power_of_two_or_zero(msaa_max_count)) { fprintf(stderr, "SWR_MSAA_MAX_COUNT invalid: %d\n", msaa_max_count); fprintf(stderr, "must be power of 2 between 1 and %d" \ " (or 1 to disable msaa)\n", SWR_MAX_NUM_MULTISAMPLES); + fprintf(stderr, "(msaa disabled)\n"); msaa_max_count = 1; } - fprintf(stderr, "SWR_MSAA_MAX_COUNT: %d\n", msaa_max_count); - if (msaa_max_count == 1) - fprintf(stderr, "(msaa disabled)\n"); + swr_print_info("SWR_MSAA_MAX_COUNT: %d\n", msaa_max_count); screen->msaa_max_count = msaa_max_count; } @@ -1119,16 +1178,14 @@ swr_validate_env_options(struct swr_screen *screen) screen->msaa_force_enable = debug_get_bool_option( "SWR_MSAA_FORCE_ENABLE", false); if (screen->msaa_force_enable) - fprintf(stderr, "SWR_MSAA_FORCE_ENABLE: true\n"); + swr_print_info("SWR_MSAA_FORCE_ENABLE: true\n"); } -PUBLIC struct pipe_screen * swr_create_screen_internal(struct sw_winsys *winsys) { struct swr_screen *screen = CALLOC_STRUCT(swr_screen); - memset(screen, 0, sizeof(struct swr_screen)); if (!screen) return NULL; @@ -1164,4 +1221,3 @@ swr_create_screen_internal(struct sw_winsys *winsys) return &screen->base; } -