I am creating a C#/SharpDx/DirectX10 application to plot line charts in a fast way.
I have a prototype which uses Dynamic Vertex Buffers and fills a fixed-size buffer, say 1M vertices, with new data per frame.
I'm finding sometimes the vertex buffer is filled with new data while the GPU is still drawing the last batch (especially on slower GPUs). Here is my code to create, map, fill and flush a vertex buffer. I wonder if I'm using it in the right way?
// Declare the re-usable buffer (once) SharpDX.Direct3D10.Buffer d3d10Buffer = new SharpDX.Direct3D10.Buffer(_d3d10Device, new BufferDescription(size, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None)); // ... // Per-frame, map the buffer, write vertices and draw + Flush() DataStream vertexBufferStream = d3d10Buffer.Map(MapMode.WriteDiscard, SharpDX.Direct3D10.MapFlags.None); vertexBufferStream.Write((float)someValue); vertexBufferStream.Write((float)anotherValue); // lots of writing ... // Then immediately draw d3d10Buffer.Unmap(); vertexBufferStream.Dispose(); _d3d10Device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_d3d10Buffer, 16, 0)); _d3d10Device.Draw(); // Assumes shaders and topology have been applied _d3d10Device.Flush();
So I'm wondering, am I doing this the right way? The MSDN Documentation tells me not to call Flush, but I don't want to overwrite my (shared) dynamic vertex buffer when the next frame begins.