On Mon, Oct 19, 2015 at 9:53 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > Actually this just occurred to me -- you should only check > st->can_force_persamp_interp if PIPE_CAP_SAMPLE_SHADING is enabled. > Otherwise it should be unreachable. And it's a bit weird for a driver > to say "sample shading = no, force persamp interp = yes".
The attached patches should fix that. Marek
From a6a013f99bad2447fab0b6c782ddab842420915a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <marek.ol...@amd.com> Date: Tue, 20 Oct 2015 00:12:53 +0200 Subject: [PATCH 1/2] st/mesa: negate the can_force_persample_interp flag --- src/mesa/state_tracker/st_atom_rasterizer.c | 2 +- src/mesa/state_tracker/st_atom_shader.c | 2 +- src/mesa/state_tracker/st_context.c | 5 +++-- src/mesa/state_tracker/st_context.h | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c index 0f01e99..55d5e66 100644 --- a/src/mesa/state_tracker/st_atom_rasterizer.c +++ b/src/mesa/state_tracker/st_atom_rasterizer.c @@ -239,7 +239,7 @@ static void update_raster_state( struct st_context *st ) /* _NEW_MULTISAMPLE | _NEW_BUFFERS */ raster->force_persample_interp = - st->can_force_persample_interp && + !st->force_persample_in_shader && ctx->Multisample._Enabled && ctx->Multisample.SampleShading && ctx->Multisample.MinSampleShadingValue * diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index 3941454..0f9ea10 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -76,7 +76,7 @@ update_fp( struct st_context *st ) * Ignore sample qualifier while computing this flag. */ key.persample_shading = - !st->can_force_persample_interp && + st->force_persample_in_shader && !(stfp->Base.Base.SystemValuesRead & (SYSTEM_BIT_SAMPLE_ID | SYSTEM_BIT_SAMPLE_POS)) && _mesa_get_min_invocations_per_fragment(st->ctx, &stfp->Base, true) > 1; diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 6256c0b..70e0069 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -235,8 +235,9 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe, PIPE_BIND_SAMPLER_VIEW); st->prefer_blit_based_texture_transfer = screen->get_param(screen, PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER); - st->can_force_persample_interp = screen->get_param(screen, - PIPE_CAP_FORCE_PERSAMPLE_INTERP); + st->force_persample_in_shader = + screen->get_param(screen, PIPE_CAP_SAMPLE_SHADING) && + !screen->get_param(screen, PIPE_CAP_FORCE_PERSAMPLE_INTERP); st->has_shareable_shaders = screen->get_param(screen, PIPE_CAP_SHAREABLE_SHADERS); st->needs_texcoord_semantic = diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 446fe5d..ec95259 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -98,7 +98,7 @@ struct st_context boolean has_etc1; boolean has_etc2; boolean prefer_blit_based_texture_transfer; - boolean can_force_persample_interp; + boolean force_persample_in_shader; boolean has_shareable_shaders; boolean needs_texcoord_semantic; -- 2.1.4
From 07caefddb00dc6d091fd9ec2dea182f6a71efe92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <marek.ol...@amd.com> Date: Mon, 28 Sep 2015 00:04:39 +0200 Subject: [PATCH 2/2] st/mesa: create shaders which have only one variant immediatelly (v2) v2: fix the condition when lacking sample shading --- src/mesa/state_tracker/st_cb_program.c | 5 +++-- src/mesa/state_tracker/st_context.c | 14 ++++++++++++++ src/mesa/state_tracker/st_context.h | 7 +++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c index 708bdf5..2c4eccf 100644 --- a/src/mesa/state_tracker/st_cb_program.c +++ b/src/mesa/state_tracker/st_cb_program.c @@ -224,6 +224,7 @@ st_program_string_notify( struct gl_context *ctx, struct gl_program *prog ) { struct st_context *st = st_context(ctx); + gl_shader_stage stage = _mesa_program_enum_to_shader_stage(target); if (target == GL_FRAGMENT_PROGRAM_ARB) { struct st_fragment_program *stfp = (struct st_fragment_program *) prog; @@ -278,10 +279,10 @@ st_program_string_notify( struct gl_context *ctx, st->dirty.st |= ST_NEW_TESSEVAL_PROGRAM; } - if (ST_DEBUG & DEBUG_PRECOMPILE) + if (ST_DEBUG & DEBUG_PRECOMPILE || + st->shader_has_one_variant[stage]) st_precompile_shader_variant(st, prog); - /* XXX check if program is legal, within limits */ return GL_TRUE; } diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 70e0069..5abb173 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -294,6 +294,20 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe, ctx->Const.ShaderCompilerOptions[i].EmitNoIndirectSampler = true; } + /* Set which shader types can be compiled at link time. */ + st->shader_has_one_variant[MESA_SHADER_VERTEX] = + st->has_shareable_shaders && + !st->clamp_vert_color_in_shader; + + st->shader_has_one_variant[MESA_SHADER_FRAGMENT] = + st->has_shareable_shaders && + !st->clamp_frag_color_in_shader && + !st->force_persample_in_shader; + + st->shader_has_one_variant[MESA_SHADER_TESS_CTRL] = st->has_shareable_shaders; + st->shader_has_one_variant[MESA_SHADER_TESS_EVAL] = st->has_shareable_shaders; + st->shader_has_one_variant[MESA_SHADER_GEOMETRY] = st->has_shareable_shaders; + _mesa_compute_version(ctx); if (ctx->Version == 0) { diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index ec95259..c243f5c 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -101,6 +101,13 @@ struct st_context boolean force_persample_in_shader; boolean has_shareable_shaders; + /** + * If a shader can be created when we get its source. + * This means it has only 1 variant, not counting glBitmap and + * glDrawPixels. + */ + boolean shader_has_one_variant[MESA_SHADER_STAGES]; + boolean needs_texcoord_semantic; boolean apply_texture_swizzle_to_border_color; -- 2.1.4
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev