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; }