> +/* 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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev