Skip to content

Commit 1d2f3c6

Browse files
[Rendering] Fixes to Entity Transform Buffer;
1 parent 5ef18af commit 1d2f3c6

5 files changed

Lines changed: 164 additions & 31 deletions

File tree

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/SDLGPURendererBackend+Buffers.cs

Lines changed: 156 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using SDL3;
22
using System;
3+
using System.Numerics;
4+
using System.Runtime.InteropServices;
35

46
namespace Staple.Internal;
57

@@ -245,6 +247,156 @@ public void DestroyIndexBuffer(ResourceHandle<IndexBuffer> buffer)
245247
AddCommand(new SDLGPUDestroyIndexBufferCommand(buffer));
246248
}
247249

250+
private void UpdateEntityTransformBuffer()
251+
{
252+
var elementCount = RenderSystem.Instance.entityTransforms.Length;
253+
254+
var targetLength = elementCount * Marshal.SizeOf<Matrix4x4>();
255+
256+
if (entityTransformsBuffer != nint.Zero &&
257+
entityTransformsBufferLength >= targetLength &&
258+
RenderSystem.Instance.changedEntityTransformRanges.Count == 0)
259+
{
260+
return;
261+
}
262+
263+
if (entityTransformsBuffer == nint.Zero || entityTransformsBufferLength != targetLength)
264+
{
265+
entityTransformsBufferLength = targetLength;
266+
267+
if (entityTransformsBuffer != nint.Zero)
268+
{
269+
SDL.ReleaseGPUBuffer(device, entityTransformsBuffer);
270+
271+
entityTransformsBuffer = nint.Zero;
272+
}
273+
274+
var createInfo = new SDL.GPUBufferCreateInfo()
275+
{
276+
Size = (uint)targetLength,
277+
Usage = SDL.GPUBufferUsageFlags.Vertex | SDL.GPUBufferUsageFlags.GraphicsStorageRead,
278+
};
279+
280+
entityTransformsBuffer = SDL.CreateGPUBuffer(device, in createInfo);
281+
282+
if (entityTransformsBuffer == nint.Zero)
283+
{
284+
return;
285+
}
286+
287+
var transferBuffer = GetTransferBuffer(false, targetLength);
288+
289+
if (transferBuffer == nint.Zero)
290+
{
291+
SDL.ReleaseGPUBuffer(device, entityTransformsBuffer);
292+
293+
entityTransformsBuffer = nint.Zero;
294+
295+
return;
296+
}
297+
298+
if (renderPass != nint.Zero)
299+
{
300+
FinishPasses();
301+
}
302+
303+
if (copyPass == nint.Zero)
304+
{
305+
copyPass = SDL.BeginGPUCopyPass(commandBuffer);
306+
}
307+
308+
if (copyPass == nint.Zero)
309+
{
310+
return;
311+
}
312+
313+
var mapData = SDL.MapGPUTransferBuffer(device, transferBuffer, true);
314+
315+
unsafe
316+
{
317+
var from = RenderSystem.Instance.entityTransforms.AsSpan();
318+
var to = new Span<Matrix4x4>((void*)mapData, elementCount);
319+
320+
from.CopyTo(to);
321+
}
322+
323+
SDL.UnmapGPUTransferBuffer(device, transferBuffer);
324+
325+
var location = new SDL.GPUTransferBufferLocation()
326+
{
327+
TransferBuffer = transferBuffer,
328+
Offset = 0,
329+
};
330+
331+
var region = new SDL.GPUBufferRegion()
332+
{
333+
Buffer = entityTransformsBuffer,
334+
Size = (uint)targetLength,
335+
};
336+
337+
SDL.UploadToGPUBuffer(copyPass, in location, in region, false);
338+
}
339+
else
340+
{
341+
if (renderPass != nint.Zero)
342+
{
343+
FinishPasses();
344+
}
345+
346+
if (copyPass == nint.Zero)
347+
{
348+
copyPass = SDL.BeginGPUCopyPass(commandBuffer);
349+
}
350+
351+
if (copyPass == nint.Zero)
352+
{
353+
return;
354+
}
355+
356+
foreach (var (start, length) in RenderSystem.Instance.changedEntityTransformRanges)
357+
{
358+
targetLength = length * Marshal.SizeOf<Matrix4x4>();
359+
360+
var transferBuffer = GetTransferBuffer(false, targetLength);
361+
362+
if (transferBuffer == nint.Zero)
363+
{
364+
SDL.ReleaseGPUBuffer(device, entityTransformsBuffer);
365+
366+
entityTransformsBuffer = nint.Zero;
367+
368+
return;
369+
}
370+
371+
var mapData = SDL.MapGPUTransferBuffer(device, transferBuffer, true);
372+
373+
unsafe
374+
{
375+
var from = RenderSystem.Instance.entityTransforms.AsSpan().Slice(start, length);
376+
var to = new Span<Matrix4x4>((void*)mapData, length);
377+
378+
from.CopyTo(to);
379+
}
380+
381+
SDL.UnmapGPUTransferBuffer(device, transferBuffer);
382+
383+
var location = new SDL.GPUTransferBufferLocation()
384+
{
385+
TransferBuffer = transferBuffer,
386+
Offset = (uint)(start * Marshal.SizeOf<Matrix4x4>()),
387+
};
388+
389+
var region = new SDL.GPUBufferRegion()
390+
{
391+
Buffer = entityTransformsBuffer,
392+
Size = (uint)targetLength,
393+
};
394+
395+
SDL.UploadToGPUBuffer(copyPass, in location, in region, false);
396+
}
397+
}
398+
}
399+
248400
public void UpdateStaticMeshVertexBuffer<T>(BufferAttributeSource<T, VertexBuffer> buffer) where T : unmanaged
249401
{
250402
if (renderPass != nint.Zero)
@@ -253,7 +405,6 @@ public void UpdateStaticMeshVertexBuffer<T>(BufferAttributeSource<T, VertexBuffe
253405
}
254406

255407
var index = buffer.index;
256-
var transferBuffer = nint.Zero;
257408
var targetLength = buffer.allocator.buffer.Length * buffer.allocator.elementSize;
258409

259410
ref var vertexBuffer = ref staticMeshVertexBuffers[index];
@@ -270,12 +421,10 @@ public void UpdateStaticMeshVertexBuffer<T>(BufferAttributeSource<T, VertexBuffe
270421
vertexBuffer = nint.Zero;
271422
}
272423

273-
var usageFlags = SDL.GPUBufferUsageFlags.Vertex;
274-
275424
var createInfo = new SDL.GPUBufferCreateInfo()
276425
{
277426
Size = (uint)vertexBufferLength,
278-
Usage = usageFlags,
427+
Usage = SDL.GPUBufferUsageFlags.Vertex,
279428
};
280429

281430
vertexBuffer = SDL.CreateGPUBuffer(device, in createInfo);
@@ -286,7 +435,7 @@ public void UpdateStaticMeshVertexBuffer<T>(BufferAttributeSource<T, VertexBuffe
286435
}
287436
}
288437

289-
transferBuffer = GetTransferBuffer(false, vertexBufferLength);
438+
var transferBuffer = GetTransferBuffer(false, vertexBufferLength);
290439

291440
if (transferBuffer == nint.Zero)
292441
{
@@ -348,7 +497,6 @@ public void UpdateStaticMeshIndexBuffer(BufferAttributeSource<uint, IndexBuffer>
348497
FinishPasses();
349498
}
350499

351-
var transferBuffer = nint.Zero;
352500
var targetLength = buffer.allocator.buffer.Length * buffer.allocator.elementSize;
353501

354502
ref var indexBuffer = ref staticMeshIndexBuffer;
@@ -365,12 +513,10 @@ public void UpdateStaticMeshIndexBuffer(BufferAttributeSource<uint, IndexBuffer>
365513
indexBuffer = nint.Zero;
366514
}
367515

368-
var usageFlags = SDL.GPUBufferUsageFlags.Index;
369-
370516
var createInfo = new SDL.GPUBufferCreateInfo()
371517
{
372518
Size = (uint)bufferLength,
373-
Usage = usageFlags,
519+
Usage = SDL.GPUBufferUsageFlags.Index,
374520
};
375521

376522
indexBuffer = SDL.CreateGPUBuffer(device, in createInfo);
@@ -381,7 +527,7 @@ public void UpdateStaticMeshIndexBuffer(BufferAttributeSource<uint, IndexBuffer>
381527
}
382528
}
383529

384-
transferBuffer = GetTransferBuffer(false, bufferLength);
530+
var transferBuffer = GetTransferBuffer(false, bufferLength);
385531

386532
if (transferBuffer == nint.Zero)
387533
{

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/SDLGPURendererBackend.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,10 @@ internal class RenderQueue
516516
internal static int[] staticMeshVertexBuffersLength = new int[18];
517517
internal static int[] staticMeshVertexBuffersElementSize = new int[18];
518518
internal static int staticMeshIndexBufferLength = 0;
519+
internal static nint entityTransformsBuffer = nint.Zero;
520+
internal static int entityTransformsBufferLength = 0;
519521

520-
private bool iteratingCommands = false;
522+
private bool iteratingCommands;
521523
private int commandIndex;
522524
#endregion
523525

@@ -657,7 +659,6 @@ public bool Initialize(RendererType renderer, bool debug, IRenderWindow window,
657659
{
658660
RendererType.Metal => "metal",
659661
RendererType.Direct3D12 => "direct3d12",
660-
RendererType.Vulkan => "vulkan",
661662
_ => "vulkan",
662663
});
663664

@@ -671,16 +672,7 @@ public bool Initialize(RendererType renderer, bool debug, IRenderWindow window,
671672
return false;
672673
}
673674

674-
if(!DepthStencilFormat.HasValue)
675-
{
676-
SDL.DestroyGPUDevice(device);
677-
678-
device = nint.Zero;
679-
680-
return false;
681-
}
682-
683-
if(!SDL.ClaimWindowForGPUDevice(device, w.window))
675+
if(!DepthStencilFormat.HasValue || !SDL.ClaimWindowForGPUDevice(device, w.window))
684676
{
685677
SDL.DestroyGPUDevice(device);
686678

@@ -882,6 +874,8 @@ public void EndFrame()
882874

883875
frameAllocator.EnsurePin();
884876

877+
UpdateEntityTransformBuffer();
878+
885879
StaticMeshData.Update();
886880

887881
foreach (var pair in transientBuffers)

Engine/Staple.Core/Rendering/RenderSystem/RenderSystem+Internal.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ internal class DrawBucket
7676
/// <summary>
7777
/// The entity query for every entity with a transform
7878
/// </summary>
79-
private readonly SceneQuery<Transform> entityQuery = new();
79+
internal readonly SceneQuery<Transform> entityQuery = new();
8080

8181
/// <summary>
8282
/// All transforms of each entity
8383
/// </summary>
84-
private Matrix4x4[] entityTransforms = new Matrix4x4[1024];
84+
internal Matrix4x4[] entityTransforms = new Matrix4x4[1024];
8585

8686
/// <summary>
8787
/// Tracker for each entity's transform

Engine/Staple.Core/Rendering/Windowing/Impls/SDL3RenderWindow.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -415,12 +415,6 @@ public void PollEvents()
415415
AppEventQueue.instance.Add(AppEvent.MoveWindow(new Vector2Int(winX, winY)));
416416

417417
break;
418-
419-
case SDL.EventType.WindowResized:
420-
421-
AppEventQueue.instance.Add(AppEvent.ResizeWindow());
422-
423-
break;
424418

425419
case SDL.EventType.KeyDown:
426420
case SDL.EventType.KeyUp:

Engine/Staple.Core/Rendering/Windowing/RenderWindow.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,6 @@ internal void CheckEvents()
621621

622622
break;
623623

624-
case AppEventType.ResizeWindow:
625624
case AppEventType.MaximizeWindow:
626625

627626
RenderSystem.Backend.UpdateViewport(width, height);

0 commit comments

Comments
 (0)