[Mesa-dev] [PATCH 3/3] st/mesa: create shaders which have only one variant immediatelly

Ilia Mirkin imirkin at alum.mit.edu
Mon Oct 19 12:53:08 PDT 2015


On Mon, Oct 19, 2015 at 2:31 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> This series is Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
> provided that you run a couple of piglit tests through valgrind and
> get no additional memory leaks.
>
>   -ilia
>
> On Sat, Oct 10, 2015 at 9:09 PM, Marek Olšák <maraeo at gmail.com> wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>  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 40f2af0..611aea7 100644
>> --- a/src/mesa/state_tracker/st_cb_program.c
>> +++ b/src/mesa/state_tracker/st_cb_program.c
>> @@ -222,6 +222,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;
>> @@ -276,10 +277,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 6256c0b..4f3f525 100644
>> --- a/src/mesa/state_tracker/st_context.c
>> +++ b/src/mesa/state_tracker/st_context.c
>> @@ -293,6 +293,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->can_force_persample_interp;

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".

>> +
>> +   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 446fe5d..d0aed7e 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 can_force_persample_interp;
>>     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 at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list