From 848b1c706c0e36576751ee2e2c0810d0baec6830 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Fri, 23 Feb 2024 14:23:43 -0800 Subject: [PATCH] add UploadAndWait method to ResourceInitializer --- src/Graphics/ResourceInitializer.cs | 30 ++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Graphics/ResourceInitializer.cs b/src/Graphics/ResourceInitializer.cs index 4541154..cec8e69 100644 --- a/src/Graphics/ResourceInitializer.cs +++ b/src/Graphics/ResourceInitializer.cs @@ -181,6 +181,30 @@ namespace MoonWorks.Graphics /// Uploads all the data corresponding to the created resources. /// public void Upload() + { + CopyToTransferBuffer(); + + var commandBuffer = Device.AcquireCommandBuffer(); + RecordUploadCommands(commandBuffer); + Device.Submit(commandBuffer); + } + + /// + /// Uploads and then blocks until the upload is finished. + /// This is useful for keeping memory usage down during threaded upload. + /// + public void UploadAndWait() + { + CopyToTransferBuffer(); + + var commandBuffer = Device.AcquireCommandBuffer(); + RecordUploadCommands(commandBuffer); + var fence = Device.SubmitAndAcquireFence(commandBuffer); + Device.WaitForFences(fence); + Device.ReleaseFence(fence); + } + + private void CopyToTransferBuffer() { if (TransferBuffer == null || TransferBuffer.Size < dataSize) { @@ -190,9 +214,10 @@ namespace MoonWorks.Graphics var dataSpan = new Span(data, (int) dataSize); TransferBuffer.SetData(dataSpan, SetDataOptions.Discard); + } - var commandBuffer = Device.AcquireCommandBuffer(); - + private void RecordUploadCommands(CommandBuffer commandBuffer) + { commandBuffer.BeginCopyPass(); foreach (var (gpuBuffer, offset, size) in BufferUploads) @@ -222,7 +247,6 @@ namespace MoonWorks.Graphics } commandBuffer.EndCopyPass(); - Device.Submit(commandBuffer); BufferUploads.Clear(); TextureUploads.Clear();