Skip to content

Commit 923a374

Browse files
[Rendering] Adjust handling of entity transforms for Multidraw Static;
1 parent a99c920 commit 923a374

2 files changed

Lines changed: 34 additions & 13 deletions

File tree

Engine/Staple.Core/Rendering/Mesh/MeshRenderSystem.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,13 @@ public void Process(Span<RenderEntry> renderQueue, Camera activeCamera, Transfor
162162
foreach(var p in staticInstanceCache)
163163
{
164164
p.Value.instanceInfos.Clear();
165-
p.Value.entries.Clear();
166165

167166
p.Value.triangles = 0;
167+
168+
foreach(var entry in p.Value.entries.Contents)
169+
{
170+
entry.transforms.Clear();
171+
}
168172
}
169173

170174
foreach (var entry in renderQueue)

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

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2015,31 +2015,48 @@ public void RenderStatic(RenderState state, Span<MultidrawEntry> entries)
20152015

20162016
GetUniformData(in state, false, shader, out var vertexUniformData, out var fragmentUniformData);
20172017

2018-
var size = indirectCommandInstance;
2018+
var commandCount = 0;
20192019

20202020
foreach(var entry in entries)
20212021
{
2022-
size += entry.transforms.Count;
2022+
if(entry.transforms.Count == 0)
2023+
{
2024+
continue;
2025+
}
2026+
2027+
commandCount++;
2028+
}
2029+
2030+
if(indirectCommandPosition + commandCount > indirectCommands.Length)
2031+
{
2032+
Array.Resize(ref indirectCommands, indirectCommandPosition + commandCount);
20232033
}
20242034

2025-
var targetSize = indirectCommands.Length;
2035+
var instanceCount = 0;
20262036

2027-
while(targetSize < size)
2037+
foreach(var entry in entries)
20282038
{
2029-
targetSize *= 2;
2039+
instanceCount += entry.transforms.Count;
20302040
}
20312041

2032-
if(targetSize > indirectCommands.Length)
2042+
if (indirectCommandInstance + instanceCount > indirectEntityIndices.Length)
20332043
{
2034-
Array.Resize(ref indirectCommands, targetSize);
2035-
Array.Resize(ref indirectEntityIndices, targetSize);
2044+
Array.Resize(ref indirectEntityIndices, indirectCommandInstance + instanceCount);
20362045
}
20372046

2047+
var commandIndex = 0;
2048+
20382049
for(var i = 0; i < entries.Length; i++)
20392050
{
2040-
ref var command = ref indirectCommands[indirectCommandPosition + i];
20412051
ref var entry = ref entries[i];
20422052

2053+
if(entry.transforms.Count == 0)
2054+
{
2055+
continue;
2056+
}
2057+
2058+
ref var command = ref indirectCommands[indirectCommandPosition + commandIndex++];
2059+
20432060
var indices = (uint)entry.entries.indicesEntry.length;
20442061
var instances = (uint)entry.transforms.Count;
20452062
var firstInstance = (uint)indirectCommandInstance;
@@ -2067,7 +2084,7 @@ public void RenderStatic(RenderState state, Span<MultidrawEntry> entries)
20672084

20682085
ref var entityIndex = ref indirectEntityIndices[indirectCommandInstance++];
20692086

2070-
var index = (uint)(entry.transforms[j].Entity.Identifier.ID - 1); ;
2087+
var index = (uint)(entry.transforms[j].Entity.Identifier.ID - 1);
20712088

20722089
if (!needsIndirectBufferUpdate)
20732090
{
@@ -2080,9 +2097,9 @@ public void RenderStatic(RenderState state, Span<MultidrawEntry> entries)
20802097

20812098
AddCommand(new SDLGPURenderStaticCommand(this, state, pipeline, state.vertexTextures, state.fragmentTextures,
20822099
state.shaderInstance.entityTransformsBufferBinding, vertexUniformData, fragmentUniformData, state.shaderInstance.attributes,
2083-
indirectCommandPosition, entries.Length));
2100+
indirectCommandPosition, commandIndex));
20842101

2085-
indirectCommandPosition += entries.Length;
2102+
indirectCommandPosition += commandIndex;
20862103
}
20872104

20882105
public void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<ushort> indices, RenderState state)

0 commit comments

Comments
 (0)