diff options
author | Samuel Pitoiset <[email protected]> | 2017-07-21 15:16:06 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2017-07-25 11:56:06 +0200 |
commit | c3ea898932cb2fd408339bab103fc8ac63908320 (patch) | |
tree | 198cc49749f17607ec92b1d722ce16b6d36f3434 | |
parent | b8338f8df21f9f0d86ba88017e8e9dca54f74220 (diff) |
mesa: add active_shader_program() helper
To reduce code duplication.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/mesa/main/pipelineobj.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c index 172a014e3ec..d7d99ec22d8 100644 --- a/src/mesa/main/pipelineobj.c +++ b/src/mesa/main/pipelineobj.c @@ -371,24 +371,50 @@ _mesa_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program) use_program_stages(ctx, shProg, stages, pipe); } -void GLAPIENTRY -_mesa_ActiveShaderProgram_no_error(GLuint pipeline, GLuint program) +static ALWAYS_INLINE void +active_shader_program(struct gl_context *ctx, GLuint pipeline, GLuint program, + bool no_error) { - GET_CURRENT_CONTEXT(ctx); struct gl_shader_program *shProg = NULL; struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline); - if (program) - shProg = _mesa_lookup_shader_program(ctx, program); + if (program) { + if (no_error) { + shProg = _mesa_lookup_shader_program(ctx, program); + } else { + shProg = _mesa_lookup_shader_program_err(ctx, program, + "glActiveShaderProgram(program)"); + if (shProg == NULL) + return; + } + } + + if (!no_error && !pipe) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glActiveShaderProgram(pipeline)"); + return; + } /* Object is created by any Pipeline call but glGenProgramPipelines, * glIsProgramPipeline and GetProgramPipelineInfoLog */ pipe->EverBound = GL_TRUE; + if (!no_error && shProg != NULL && !shProg->data->LinkStatus) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glActiveShaderProgram(program %u not linked)", shProg->Name); + return; + } + _mesa_reference_shader_program(ctx, &pipe->ActiveProgram, shProg); } +void GLAPIENTRY +_mesa_ActiveShaderProgram_no_error(GLuint pipeline, GLuint program) +{ + GET_CURRENT_CONTEXT(ctx); + active_shader_program(ctx, pipeline, program, true); +} + /** * Use the named shader program for subsequent glUniform calls (if pipeline * bound) @@ -397,36 +423,11 @@ void GLAPIENTRY _mesa_ActiveShaderProgram(GLuint pipeline, GLuint program) { GET_CURRENT_CONTEXT(ctx); - struct gl_shader_program *shProg = NULL; - struct gl_pipeline_object *pipe = _mesa_lookup_pipeline_object(ctx, pipeline); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glActiveShaderProgram(%u, %u)\n", pipeline, program); - if (program != 0) { - shProg = _mesa_lookup_shader_program_err(ctx, program, - "glActiveShaderProgram(program)"); - if (shProg == NULL) - return; - } - - if (!pipe) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glActiveShaderProgram(pipeline)"); - return; - } - - /* Object is created by any Pipeline call but glGenProgramPipelines, - * glIsProgramPipeline and GetProgramPipelineInfoLog - */ - pipe->EverBound = GL_TRUE; - - if ((shProg != NULL) && !shProg->data->LinkStatus) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glActiveShaderProgram(program %u not linked)", shProg->Name); - return; - } - - _mesa_reference_shader_program(ctx, &pipe->ActiveProgram, shProg); + active_shader_program(ctx, pipeline, program, false); } static ALWAYS_INLINE void |