make text batches use less memory by defualt

cosmonaut 2023-12-15 09:23:46 -08:00
parent 6cb1498e26
commit bba64c1796
1 changed files with 21 additions and 7 deletions

View File

@ -6,9 +6,9 @@ namespace MoonWorks.Graphics.Font
{ {
public unsafe class TextBatch : GraphicsResource public unsafe class TextBatch : GraphicsResource
{ {
public const int MAX_CHARS = 4096; public const int INITIAL_CHAR_COUNT = 64;
public const int MAX_VERTICES = MAX_CHARS * 4; public const int INITIAL_VERTEX_COUNT = INITIAL_CHAR_COUNT * 4;
public const int MAX_INDICES = MAX_CHARS * 6; public const int INITIAL_INDEX_COUNT = INITIAL_CHAR_COUNT * 6;
private GraphicsDevice GraphicsDevice { get; } private GraphicsDevice GraphicsDevice { get; }
public IntPtr Handle { get; } public IntPtr Handle { get; }
@ -30,10 +30,11 @@ namespace MoonWorks.Graphics.Font
StringBytesLength = 128; StringBytesLength = 128;
StringBytes = (byte*) NativeMemory.Alloc((nuint) StringBytesLength); StringBytes = (byte*) NativeMemory.Alloc((nuint) StringBytesLength);
VertexBuffer = Buffer.Create<Vertex>(GraphicsDevice, BufferUsageFlags.Vertex, MAX_VERTICES); VertexBuffer = Buffer.Create<Vertex>(GraphicsDevice, BufferUsageFlags.Vertex, INITIAL_VERTEX_COUNT);
IndexBuffer = Buffer.Create<uint>(GraphicsDevice, BufferUsageFlags.Index, MAX_INDICES); IndexBuffer = Buffer.Create<uint>(GraphicsDevice, BufferUsageFlags.Index, INITIAL_INDEX_COUNT);
} }
// Call this to initialize or reset the batch.
public void Start(Font font) public void Start(Font font)
{ {
Wellspring.Wellspring_StartTextBatch(Handle, font.Handle); Wellspring.Wellspring_StartTextBatch(Handle, font.Handle);
@ -41,6 +42,7 @@ namespace MoonWorks.Graphics.Font
PrimitiveCount = 0; PrimitiveCount = 0;
} }
// Add text with size and color to the batch
public unsafe bool Add( public unsafe bool Add(
string text, string text,
int pixelSize, int pixelSize,
@ -79,7 +81,7 @@ namespace MoonWorks.Graphics.Font
return true; return true;
} }
// Call this after you have made all the Draw calls you want. // Call this after you have made all the Add calls you want, but before beginning a render pass.
public unsafe void UploadBufferData(CommandBuffer commandBuffer) public unsafe void UploadBufferData(CommandBuffer commandBuffer)
{ {
Wellspring.Wellspring_GetBufferData( Wellspring.Wellspring_GetBufferData(
@ -91,13 +93,25 @@ namespace MoonWorks.Graphics.Font
out uint indexDataLengthInBytes out uint indexDataLengthInBytes
); );
if (VertexBuffer.Size < vertexDataLengthInBytes)
{
VertexBuffer.Dispose();
VertexBuffer = new Buffer(GraphicsDevice, BufferUsageFlags.Vertex, vertexDataLengthInBytes);
}
if (IndexBuffer.Size < indexDataLengthInBytes)
{
IndexBuffer.Dispose();
IndexBuffer = new Buffer(GraphicsDevice, BufferUsageFlags.Vertex, vertexDataLengthInBytes);
}
if (vertexDataLengthInBytes > 0 && indexDataLengthInBytes > 0) if (vertexDataLengthInBytes > 0 && indexDataLengthInBytes > 0)
{ {
commandBuffer.SetBufferData(VertexBuffer, vertexDataPointer, 0, vertexDataLengthInBytes); commandBuffer.SetBufferData(VertexBuffer, vertexDataPointer, 0, vertexDataLengthInBytes);
commandBuffer.SetBufferData(IndexBuffer, indexDataPointer, 0, indexDataLengthInBytes); commandBuffer.SetBufferData(IndexBuffer, indexDataPointer, 0, indexDataLengthInBytes);
} }
PrimitiveCount = vertexCount / 2; // FIXME: is this jank? PrimitiveCount = vertexCount / 2;
} }
// Call this AFTER binding your text pipeline! // Call this AFTER binding your text pipeline!