[Mesa-dev] [PATCH 02/25] mesa: don't always set _NEW_PROGRAM when linking

Marek Olšák maraeo at gmail.com
Mon Jan 9 11:00:38 UTC 2017


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Mon, Jan 9, 2017 at 6:13 AM, Timothy Arceri
<timothy.arceri at collabora.com> wrote:
> We only need to set it when linking was successful and the program
> being linked is currently active.
>
> The programs_in_use mask is just used as a flag for now but in
> a following patch we will use it to update the CurrentProgram
> array.
>
> V2: make sure to flush vertices before linking (suggested by Marek)
> ---
>  src/mesa/main/shaderapi.c | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index e67dc52..23f8fdd 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -1097,10 +1097,31 @@ _mesa_link_program(struct gl_context *ctx, struct gl_shader_program *shProg)
>        return;
>     }
>
> -   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
> +   unsigned programs_in_use = 0;
> +   if (ctx->_Shader)
> +      for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) {
> +         if (ctx->_Shader->CurrentProgram[stage] == shProg) {
> +            programs_in_use |= 1 << stage;
> +         }
> +   }
>
> +   FLUSH_VERTICES(ctx, 0);
>     _mesa_glsl_link_shader(ctx, shProg);
>
> +   /* From section 7.3 (Program Objects) of the OpenGL 4.5 spec:
> +    *
> +    *    "If LinkProgram or ProgramBinary successfully re-links a program
> +    *     object that is active for any shader stage, then the newly generated
> +    *     executable code will be installed as part of the current rendering
> +    *     state for all shader stages where the program is active.
> +    *     Additionally, the newly generated executable code is made part of
> +    *     the state of any program pipeline for all stages where the program
> +    *     is attached."
> +    */
> +   if (shProg->data->LinkStatus && programs_in_use) {
> +      ctx->NewState |= _NEW_PROGRAM;
> +   }
> +
>     /* Capture .shader_test files. */
>     const char *capture_path = _mesa_get_shader_capture_path();
>     if (shProg->Name != 0 && shProg->Name != ~0 && capture_path != NULL) {
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list