diff options
-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 |