diff options
author | Gregory Hainaut <[email protected]> | 2013-06-28 13:57:50 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2014-02-21 15:41:02 -0800 |
commit | 55311557fda35d3e304039cc8700a43d04a0c077 (patch) | |
tree | 2de2ebe31244a254dcf6c6808d1240519e87fe9b /src/mesa/main/pipelineobj.c | |
parent | f4c13a890fa24ff1f998e7cac0ecc31505a29403 (diff) |
mesa/sso: Implement _mesa_DeleteProgramPipelines
Implement DeleteProgramPipelines based on the VAO code.
This was originally included in another patch, but it was split out by
Ian Romanick.
Reviewed-by: Ian Romanick <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/mesa/main/pipelineobj.c')
-rw-r--r-- | src/mesa/main/pipelineobj.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c index d50214cf1ac..810c6fd1081 100644 --- a/src/mesa/main/pipelineobj.c +++ b/src/mesa/main/pipelineobj.c @@ -242,6 +242,39 @@ _mesa_BindProgramPipeline(GLuint pipeline) void GLAPIENTRY _mesa_DeleteProgramPipelines(GLsizei n, const GLuint *pipelines) { + GET_CURRENT_CONTEXT(ctx); + GLsizei i; + + if (n < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteProgramPipelines(n<0)"); + return; + } + + for (i = 0; i < n; i++) { + struct gl_pipeline_object *obj = + lookup_pipeline_object(ctx, pipelines[i]); + + if (obj) { + ASSERT(obj->Name == pipelines[i]); + + /* If the pipeline object is currently bound, the spec says "If an + * object that is currently bound is deleted, the binding for that + * object reverts to zero and no program pipeline object becomes + * current." + */ + if (obj == ctx->Pipeline.Current) { + _mesa_BindProgramPipeline(0); + } + + /* The ID is immediately freed for re-use */ + remove_pipeline_object(ctx, obj); + + /* Unreference the pipeline object. + * If refcount hits zero, the object will be deleted. + */ + _mesa_reference_pipeline_object(ctx, &obj, NULL); + } + } } /** |