/// <inheritdoc/>
        protected override void Dispose(Boolean disposing)
        {
            if (Disposed)
            {
                return;
            }

            if (disposing)
            {
                if (!Ultraviolet.Disposed)
                {
                    var glname = vao;
                    if (glname != 0)
                    {
                        Ultraviolet.QueueWorkItem((state) =>
                        {
                            gl.DeleteVertexArray(glname);
                            gl.ThrowIfError();

                            OpenGLState.DeleteVertexArrayObject(glname, glElementArrayBufferBinding ?? 0);
                        }, null, WorkItemOptions.ReturnNullOnSynchronousExecution);
                    }

                    vao = 0;
                }
                vbuffers.Clear();
                ibuffer = null;
            }

            base.Dispose(disposing);
        }