diff options
Diffstat (limited to 'src/gallium/drivers/i915/i915_screen.c')
-rw-r--r-- | src/gallium/drivers/i915/i915_screen.c | 145 |
1 files changed, 79 insertions, 66 deletions
diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index e08c6d056a9..8b4746bf49c 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.c @@ -27,6 +27,7 @@ #include "compiler/nir/nir.h" #include "draw/draw_context.h" +#include "nir/nir_to_tgsi.h" #include "util/format/u_format.h" #include "util/format/u_format_s3tc.h" #include "util/os_misc.h" @@ -37,6 +38,7 @@ #include "i915_context.h" #include "i915_debug.h" +#include "i915_fpc.h" #include "i915_public.h" #include "i915_reg.h" #include "i915_resource.h" @@ -106,6 +108,7 @@ i915_get_name(struct pipe_screen *screen) } static const nir_shader_compiler_options i915_compiler_options = { + .fdot_replicates = true, .fuse_ffma32 = true, .lower_bitops = true, /* required for !CAP_INTEGERS nir_to_tgsi */ .lower_extract_byte = true, @@ -114,21 +117,26 @@ static const nir_shader_compiler_options i915_compiler_options = { .lower_fdph = true, .lower_flrp32 = true, .lower_fmod = true, - .lower_rotate = true, + .lower_sincos = true, .lower_uniforms_to_ubo = true, .lower_vector_cmp = true, .use_interpolated_input_intrinsics = true, - .force_indirect_unrolling = ~0, + .force_indirect_unrolling = nir_var_all, + .force_indirect_unrolling_sampler = true, + .max_unroll_iterations = 32, + .no_integers = true, + .has_fused_comp_and_csel = true, }; static const struct nir_shader_compiler_options gallivm_nir_options = { + .fdot_replicates = true, .lower_bitops = true, /* required for !CAP_INTEGERS nir_to_tgsi */ .lower_scmp = true, .lower_flrp32 = true, .lower_flrp64 = true, .lower_fsat = true, - .lower_bitfield_insert_to_shifts = true, - .lower_bitfield_extract_to_shifts = true, + .lower_bitfield_insert = true, + .lower_bitfield_extract = true, .lower_fdph = true, .lower_ffma16 = true, .lower_ffma32 = true, @@ -136,6 +144,7 @@ static const struct nir_shader_compiler_options gallivm_nir_options = { .lower_fmod = true, .lower_hadd = true, .lower_uadd_sat = true, + .lower_usub_sat = true, .lower_iadd_sat = true, .lower_ldexp = true, .lower_pack_snorm_2x16 = true, @@ -151,14 +160,13 @@ static const struct nir_shader_compiler_options gallivm_nir_options = { .lower_unpack_half_2x16 = true, .lower_extract_byte = true, .lower_extract_word = true, - .lower_rotate = true, .lower_uadd_carry = true, .lower_usub_borrow = true, .lower_mul_2x32_64 = true, .lower_ifind_msb = true, .max_unroll_iterations = 32, .use_interpolated_input_intrinsics = true, - .lower_cs_local_index_from_id = true, + .lower_cs_local_index_to_id = true, .lower_uniforms_to_ubo = true, .lower_vector_cmp = true, .lower_device_index_to_zero = true, @@ -195,13 +203,14 @@ i915_optimize_nir(struct nir_shader *s) NIR_PASS(progress, s, nir_opt_dead_cf); NIR_PASS(progress, s, nir_opt_cse); NIR_PASS(progress, s, nir_opt_find_array_copies); - NIR_PASS(progress, s, nir_opt_if, true); + NIR_PASS(progress, s, nir_opt_if, nir_opt_if_optimize_phi_true_false); NIR_PASS(progress, s, nir_opt_peephole_select, ~0 /* flatten all IFs. */, true, true); NIR_PASS(progress, s, nir_opt_algebraic); NIR_PASS(progress, s, nir_opt_constant_folding); - NIR_PASS(progress, s, nir_opt_shrink_vectors, true); - NIR_PASS(progress, s, nir_opt_trivial_continues); + NIR_PASS(progress, s, nir_opt_shrink_stores, true); + NIR_PASS(progress, s, nir_opt_shrink_vectors, false); + NIR_PASS(progress, s, nir_opt_loop); NIR_PASS(progress, s, nir_opt_undef); NIR_PASS(progress, s, nir_opt_loop_unroll); @@ -209,9 +218,15 @@ i915_optimize_nir(struct nir_shader *s) NIR_PASS(progress, s, nir_remove_dead_variables, nir_var_function_temp, NULL); + + /* Group texture loads together to try to avoid hitting the + * texture indirection phase limit. + */ + NIR_PASS_V(s, nir_group_loads, nir_group_all, ~0); } -static char *i915_check_control_flow(nir_shader *s) +static char * +i915_check_control_flow(nir_shader *s) { if (s->info.stage == MESA_SHADER_FRAGMENT) { nir_function_impl *impl = nir_shader_get_entrypoint(s); @@ -221,9 +236,11 @@ static char *i915_check_control_flow(nir_shader *s) if (next) { switch (next->type) { case nir_cf_node_if: - return "if/then statements not supported by i915 fragment shaders, should have been flattened by peephole_select."; + return "if/then statements not supported by i915 fragment shaders, " + "should have been flattened by peephole_select."; case nir_cf_node_loop: - return "looping not supported i915 fragment shaders, all loops must be statically unrollable."; + return "looping not supported i915 fragment shaders, all loops " + "must be statically unrollable."; default: return "Unknown control flow type"; } @@ -247,8 +264,7 @@ i915_finalize_nir(struct pipe_screen *pscreen, void *nir) * because they're needed for YUV variant lowering. */ nir_remove_dead_derefs(s); - nir_foreach_uniform_variable_safe(var, s) - { + nir_foreach_uniform_variable_safe (var, s) { if (var->data.mode == nir_var_uniform && (glsl_type_get_image_count(var->type) || glsl_type_get_sampler_count(var->type))) @@ -261,10 +277,18 @@ i915_finalize_nir(struct pipe_screen *pscreen, void *nir) nir_sweep(s); char *msg = i915_check_control_flow(s); - if (msg) + if (msg) { + if (I915_DBG_ON(DBG_FS) && (!s->info.internal || NIR_DEBUG(PRINT_INTERNAL))) { + mesa_logi("failing shader:"); + nir_log_shaderi(s); + } return strdup(msg); + } - return NULL; + if (s->info.stage == MESA_SHADER_FRAGMENT) + return i915_test_fragment_shader_compile(pscreen, s); + else + return NULL; } static int @@ -272,8 +296,6 @@ i915_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader, enum pipe_shader_cap cap) { switch (cap) { - case PIPE_SHADER_CAP_PREFERRED_IR: - return PIPE_SHADER_IR_NIR; case PIPE_SHADER_CAP_SUPPORTED_IRS: return (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_TGSI); @@ -283,7 +305,13 @@ i915_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader, */ return 0; + /* i915 can't do these, and even if gallivm NIR can we call nir_to_tgsi + * manually and TGSI can't. + */ case PIPE_SHADER_CAP_INT16: + case PIPE_SHADER_CAP_FP16: + case PIPE_SHADER_CAP_FP16_DERIVATIVES: + case PIPE_SHADER_CAP_FP16_CONST_BUFFERS: return 0; case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: @@ -326,14 +354,14 @@ i915_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader, return 10; case PIPE_SHADER_CAP_MAX_OUTPUTS: return 1; - case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: + case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE: return 32 * sizeof(float[4]); case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: return 1; case PIPE_SHADER_CAP_MAX_TEMPS: /* 16 inter-phase temps, 3 intra-phase temps. i915c reported 16. too. */ return 16; - case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: + case PIPE_SHADER_CAP_CONT_SUPPORTED: case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: return 0; case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: @@ -343,32 +371,21 @@ i915_get_shader_param(struct pipe_screen *screen, enum pipe_shader_type shader, case PIPE_SHADER_CAP_SUBROUTINES: return 0; case PIPE_SHADER_CAP_INT64_ATOMICS: - case PIPE_SHADER_CAP_FP16: - case PIPE_SHADER_CAP_FP16_DERIVATIVES: - case PIPE_SHADER_CAP_FP16_CONST_BUFFERS: case PIPE_SHADER_CAP_INT16: case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS: return 0; case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: return I915_TEX_UNITS; - case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: - case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: - case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED: - case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: case PIPE_SHADER_CAP_MAX_SHADER_IMAGES: - case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD: - case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS: case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS: case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS: return 0; - case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: - return 32; default: - debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap); + debug_printf("%s: Unknown cap %u.\n", __func__, cap); return 0; } break; @@ -387,26 +404,24 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap) case PIPE_CAP_ANISOTROPIC_FILTER: case PIPE_CAP_NPOT_TEXTURES: case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: - case PIPE_CAP_POINT_SPRITE: case PIPE_CAP_PRIMITIVE_RESTART: /* draw module */ case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX: case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: case PIPE_CAP_BLEND_EQUATION_SEPARATE: - case PIPE_CAP_TGSI_INSTANCEID: + case PIPE_CAP_VS_INSTANCEID: case PIPE_CAP_VERTEX_COLOR_CLAMPED: case PIPE_CAP_USER_VERTEX_BUFFERS: case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: case PIPE_CAP_TGSI_TEXCOORD: return 1; - case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: + case PIPE_CAP_TEXTURE_TRANSFER_MODES: case PIPE_CAP_PCI_GROUP: case PIPE_CAP_PCI_BUS: case PIPE_CAP_PCI_DEVICE: case PIPE_CAP_PCI_FUNCTION: return 0; - case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: return 0; @@ -419,7 +434,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap) case PIPE_CAP_MAX_GS_INVOCATIONS: return 32; - case PIPE_CAP_MAX_SHADER_BUFFER_SIZE: + case PIPE_CAP_MAX_SHADER_BUFFER_SIZE_UINT: return 1 << 27; case PIPE_CAP_MAX_VIEWPORTS: @@ -435,17 +450,13 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap) case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: return 16; - /* Features we can lie about (boolean caps). */ - case PIPE_CAP_OCCLUSION_QUERY: - return is->debug.lie ? 1 : 0; - /* Texturing. */ case PIPE_CAP_MAX_TEXTURE_2D_SIZE: return 1 << (I915_MAX_TEXTURE_2D_LEVELS - 1); case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: return I915_MAX_TEXTURE_3D_LEVELS; case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: - return 1 << (I915_MAX_TEXTURE_2D_LEVELS - 1); + return I915_MAX_TEXTURE_2D_LEVELS; /* Render targets. */ case PIPE_CAP_MAX_RENDER_TARGETS: @@ -455,8 +466,8 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap) return 2048; /* Fragment coordinate conventions. */ - case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: - case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: + case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT: + case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER: return 1; case PIPE_CAP_ENDIANNESS: return PIPE_ENDIAN_LITTLE; @@ -498,14 +509,24 @@ static float i915_get_paramf(struct pipe_screen *screen, enum pipe_capf cap) { switch (cap) { + case PIPE_CAPF_MIN_LINE_WIDTH: + case PIPE_CAPF_MIN_LINE_WIDTH_AA: + case PIPE_CAPF_MIN_POINT_SIZE: + case PIPE_CAPF_MIN_POINT_SIZE_AA: + return 1; + + case PIPE_CAPF_POINT_SIZE_GRANULARITY: + case PIPE_CAPF_LINE_WIDTH_GRANULARITY: + return 0.1; + case PIPE_CAPF_MAX_LINE_WIDTH: FALLTHROUGH; case PIPE_CAPF_MAX_LINE_WIDTH_AA: return 7.5; - case PIPE_CAPF_MAX_POINT_WIDTH: + case PIPE_CAPF_MAX_POINT_SIZE: FALLTHROUGH; - case PIPE_CAPF_MAX_POINT_WIDTH_AA: + case PIPE_CAPF_MAX_POINT_SIZE_AA: return 255.0; case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: @@ -522,7 +543,7 @@ i915_get_paramf(struct pipe_screen *screen, enum pipe_capf cap) return 0.0f; default: - debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap); + debug_printf("%s: Unknown cap %u.\n", __func__, cap); return 0; } } @@ -618,22 +639,6 @@ i915_fence_finish(struct pipe_screen *screen, struct pipe_context *ctx, */ static void -i915_flush_frontbuffer(struct pipe_screen *screen, struct pipe_context *pipe, - struct pipe_resource *resource, unsigned level, - unsigned layer, void *winsys_drawable_handle, - struct pipe_box *sub_box) -{ - /* XXX: Dummy right now. */ - (void)screen; - (void)pipe; - (void)resource; - (void)level; - (void)layer; - (void)winsys_drawable_handle; - (void)sub_box; -} - -static void i915_destroy_screen(struct pipe_screen *screen) { struct i915_screen *is = i915_screen(screen); @@ -644,6 +649,14 @@ i915_destroy_screen(struct pipe_screen *screen) FREE(is); } +static int +i915_screen_get_fd(struct pipe_screen *screen) +{ + struct i915_screen *is = i915_screen(screen); + + return is->iws->get_fd(is->iws); +} + /** * Create a new i915_screen object */ @@ -673,8 +686,8 @@ i915_screen_create(struct i915_winsys *iws) break; default: - debug_printf("%s: unknown pci id 0x%x, cannot create screen\n", - __FUNCTION__, iws->pci_id); + debug_printf("%s: unknown pci id 0x%x, cannot create screen\n", __func__, + iws->pci_id); FREE(is); return NULL; } @@ -682,11 +695,11 @@ i915_screen_create(struct i915_winsys *iws) is->iws = iws; is->base.destroy = i915_destroy_screen; - is->base.flush_frontbuffer = i915_flush_frontbuffer; is->base.get_name = i915_get_name; is->base.get_vendor = i915_get_vendor; is->base.get_device_vendor = i915_get_device_vendor; + is->base.get_screen_fd = i915_screen_get_fd; is->base.get_param = i915_get_param; is->base.get_shader_param = i915_get_shader_param; is->base.get_paramf = i915_get_paramf; |