public void Dispose()
 {
     VertexBuffers.ForEach(x => x.Dispose());
     IndexBuffers.ForEach(x => x.Dispose());
     IndirectBuffers.ForEach(x => x.Dispose());
 }
        private void CommitCurrentBuffers()
        {
            if (!_inBuffer)
            {
                return;
            }

            _device.Unmap(_currentVertexBuffer);
            _device.Unmap(_currentIndexBuffer);

            var numInd  = _currentIndirectArguments.Count;
            var indSize = Unsafe.SizeOf <IndirectDrawIndexedArguments>();

            if (numInd == 0)
            {
                // No indirect arguments, this buffer is empty.
                _currentVertexBuffer.Dispose();
                _currentIndexBuffer.Dispose();

                _currentVertexMap         = _currentIndexMap = default(MappedResource);
                _currentIndexBuffer       = _currentVertexBuffer = null;
                _currentVertexOffset      = _currentIndexOffset = 0;
                _currentIndirectArguments = null;
                _inBuffer = false;
                return;
            }

            var  bufferGroups   = new List <BufferGroup>();
            var  indirectBuffer = new IndirectIndirectBuffer(_device, numInd * indSize);
            uint indirOffset    = 0;

            foreach (var g in _currentIndirectArguments.GroupBy(x => new { x.Pipeline, x.Camera, x.HasTransparency, x.Binding }))
            {
                if (g.Key.HasTransparency)
                {
                    foreach (var ia in g)
                    {
                        indirectBuffer.Update(indirOffset * indSize, ia.Arguments);
                        var bg = new BufferGroup(ia.Pipeline, ia.Camera, ia.Location, ia.Binding, indirOffset, 1);
                        bufferGroups.Add(bg);
                        indirOffset += 1;
                    }
                }
                else
                {
                    var indir      = g.Select(x => x.Arguments).ToArray();
                    var indirCount = (uint)indir.Length;

                    indirectBuffer.Update(indirOffset * indSize, indir);

                    var bg = new BufferGroup(g.Key.Pipeline, g.Key.Camera, g.Key.Binding, indirOffset, indirCount);
                    bufferGroups.Add(bg);

                    indirOffset += indirCount;
                }
            }

            VertexBuffers.Add(_currentVertexBuffer);
            IndexBuffers.Add(_currentIndexBuffer);
            IndirectBuffers.Add(indirectBuffer);
            IndirectBufferGroups.Add(bufferGroups);

#if DEBUG
            AllocationInformation.Add(new BufferAllocation(_currentVertexBuffer.SizeInBytes, _currentVertexOffset, _currentIndexBuffer.SizeInBytes, _currentIndexOffset));
#endif

            _currentVertexMap         = _currentIndexMap = default(MappedResource);
            _currentIndexBuffer       = _currentVertexBuffer = null;
            _currentVertexOffset      = _currentIndexOffset = 0;
            _currentIndirectArguments = null;
            _inBuffer = false;
        }