[Mesa-dev] [PATCH 7/7] mesa: add KHR_no_error support for glUseProgram

Dave Airlie airlied at gmail.com
Thu May 4 03:31:22 UTC 2017


> +/* The ARB_separate_shader_object spec says:
> + *
> + *     "The executable code for an individual shader stage is taken from
> + *     the current program for that stage.  If there is a current program
> + *     object established by UseProgram, that program is considered current
> + *     for all stages.  Otherwise, if there is a bound program pipeline
> + *     object (section 2.14.PPO), the program bound to the appropriate
> + *     stage of the pipeline object is considered current."
> + */
> +#define USE_PROGRAM(no_error)                                                \
> +   if (program) {                                                            \
> +      /* Attach shader state to the binding point */                         \
> +      _mesa_reference_pipeline_object(ctx, &ctx->_Shader, &ctx->Shader);     \
> +      /* Update the program */                                               \
> +      _mesa_use_shader_program(ctx, shProg);                                 \
> +   } else {                                                                  \
> +      /* Must be done first: detach the progam */                            \
> +      _mesa_use_shader_program(ctx, shProg);                                 \
> +      /* Unattach shader_state binding point */                              \
> +      _mesa_reference_pipeline_object(ctx, &ctx->_Shader,                    \
> +                                      ctx->Pipeline.Default);                \
> +      /* If a pipeline was bound, rebind it */                               \
> +      if (ctx->Pipeline.Current) {                                           \
> +         _mesa_BindProgramPipeline##no_error(ctx->Pipeline.Current->Name);   \
> +      }                                                                      \
> +   }                                                                         \
> +

why the macro, inline functions are a thing, or just one common
function that both entrypoints call.

Dave.

> +void GLAPIENTRY
> +_mesa_UseProgram_no_error(GLuint program)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg = NULL;
> +
> +   if (program) {
> +      shProg = _mesa_lookup_shader_program(ctx, program);
> +   }
> +
> +   USE_PROGRAM(_no_error)
> +}
> +
>
>  void GLAPIENTRY
>  _mesa_UseProgram(GLuint program)
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     struct gl_shader_program *shProg = NULL;
>
>     if (MESA_VERBOSE & VERBOSE_API)
>        _mesa_debug(ctx, "glUseProgram %u\n", program);
>
> @@ -1875,44 +1915,21 @@ _mesa_UseProgram(GLuint program)
>           return;
>        }
>
>  #ifdef DEBUG
>        if (ctx->_Shader->Flags & GLSL_USE_PROG) {
>           print_shader_info(shProg);
>        }
>  #endif
>     }
>
> -   /* The ARB_separate_shader_object spec says:
> -    *
> -    *     "The executable code for an individual shader stage is taken from
> -    *     the current program for that stage.  If there is a current program
> -    *     object established by UseProgram, that program is considered current
> -    *     for all stages.  Otherwise, if there is a bound program pipeline
> -    *     object (section 2.14.PPO), the program bound to the appropriate
> -    *     stage of the pipeline object is considered current."
> -    */
> -   if (program) {
> -      /* Attach shader state to the binding point */
> -      _mesa_reference_pipeline_object(ctx, &ctx->_Shader, &ctx->Shader);
> -      /* Update the program */
> -      _mesa_use_shader_program(ctx, shProg);
> -   } else {
> -      /* Must be done first: detach the progam */
> -      _mesa_use_shader_program(ctx, shProg);
> -      /* Unattach shader_state binding point */
> -      _mesa_reference_pipeline_object(ctx, &ctx->_Shader, ctx->Pipeline.Default);
> -      /* If a pipeline was bound, rebind it */
> -      if (ctx->Pipeline.Current) {
> -         _mesa_BindProgramPipeline(ctx->Pipeline.Current->Name);
> -      }
> -   }
> +   USE_PROGRAM()
>  }
>
>
>  void GLAPIENTRY
>  _mesa_ValidateProgram(GLuint program)
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     validate_program(ctx, program);
>  }
>
> diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h
> index 99b4fe8..0a28185 100644
> --- a/src/mesa/main/shaderapi.h
> +++ b/src/mesa/main/shaderapi.h
> @@ -120,20 +120,22 @@ _mesa_IsProgram(GLuint name);
>
>  extern GLboolean GLAPIENTRY
>  _mesa_IsShader(GLuint name);
>
>  extern void GLAPIENTRY
>  _mesa_LinkProgram(GLuint programObj);
>
>  extern void GLAPIENTRY
>  _mesa_ShaderSource(GLuint, GLsizei, const GLchar* const *, const GLint *);
>
> +void GLAPIENTRY
> +_mesa_UseProgram_no_error(GLuint);
>  extern void GLAPIENTRY
>  _mesa_UseProgram(GLuint);
>
>  extern void GLAPIENTRY
>  _mesa_ValidateProgram(GLuint);
>
>
>  extern void GLAPIENTRY
>  _mesa_BindAttribLocation(GLuint program, GLuint, const GLchar *);
>
> --
> 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