mesa/sso: Implement _mesa_DeleteProgramPipelines
authorGregory Hainaut <gregory.hainaut@gmail.com>
Fri, 28 Jun 2013 20:57:50 +0000 (13:57 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 21 Feb 2014 23:41:02 +0000 (15:41 -0800)
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 <ian.d.romanick@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/main/pipelineobj.c

index d50214cf1ace714f3d98961039f254dae1dbec4c..810c6fd1081189d84e38c07568ac687ff1e833ee 100644 (file)
@@ -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);
+      }
+   }
 }
 
 /**