Skip to content

Commit ea06c15

Browse files
[Rendering] Minor refactor for optimization;
1 parent ccd7a98 commit ea06c15

File tree

5 files changed

+250
-120
lines changed

5 files changed

+250
-120
lines changed

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/Commands/SDLGPURenderCommand.cs

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using SDL3;
2-
using System.Collections.Generic;
32

43
namespace Staple.Internal;
54

@@ -33,14 +32,17 @@ public void Update(IRendererBackend rendererBackend)
3332
return;
3433
}
3534

36-
if ((state.vertexStorageBuffers?.Count ?? 0) > 0)
35+
var hasVertexStorageBuffers = state.vertexStorageBuffers != null;
36+
var hasFragmentStorageBuffers = state.fragmentStorageBuffers != null;
37+
38+
if (hasVertexStorageBuffers)
3739
{
38-
foreach (var pair in state.vertexStorageBuffers)
40+
for (var i = 0; i < state.vertexStorageBuffers.Count; i++)
3941
{
40-
if (pair.Value == null ||
41-
pair.Value.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
42-
pair.Value.Disposed ||
43-
pair.Value is not SDLGPUVertexBuffer v ||
42+
var binding = state.vertexStorageBuffers[i];
43+
44+
if (binding.buffer.Disposed ||
45+
binding.buffer is not SDLGPUVertexBuffer v ||
4446
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
4547
resource.used == false ||
4648
resource.buffer == nint.Zero)
@@ -50,14 +52,14 @@ pair.Value is not SDLGPUVertexBuffer v ||
5052
}
5153
}
5254

53-
if ((state.fragmentStorageBuffers?.Count ?? 0) > 0)
55+
if (hasFragmentStorageBuffers)
5456
{
55-
foreach (var pair in state.fragmentStorageBuffers)
57+
for (var i = 0; i < state.fragmentStorageBuffers.Count; i++)
5658
{
57-
if (pair.Value == null ||
58-
pair.Value.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
59-
pair.Value.Disposed ||
60-
pair.Value is not SDLGPUVertexBuffer v ||
59+
var binding = state.fragmentStorageBuffers[i];
60+
61+
if (binding.buffer.Disposed ||
62+
binding.buffer is not SDLGPUVertexBuffer v ||
6163
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
6264
resource.used == false ||
6365
resource.buffer == nint.Zero)
@@ -76,7 +78,12 @@ pair.Value is not SDLGPUVertexBuffer v ||
7678
renderPass = backend.renderPass;
7779
}
7880

79-
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
81+
if (SDLGPURendererBackend.lastGraphicsPipeline != pipeline)
82+
{
83+
SDLGPURendererBackend.lastGraphicsPipeline = pipeline;
84+
85+
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
86+
}
8087

8188
vertexBinding[0].Buffer = vertexBuffer.buffer;
8289

@@ -108,33 +115,35 @@ pair.Value is not SDLGPUVertexBuffer v ||
108115
SDL.BindGPUFragmentSamplers(renderPass, 0, fragmentSamplers, (uint)fragmentSamplers.Length);
109116
}
110117

111-
var singleBuffer = new nint[1];
112-
113-
if ((state.vertexStorageBuffers?.Count ?? 0) > 0)
118+
if (hasVertexStorageBuffers)
114119
{
115-
foreach (var pair in state.vertexStorageBuffers)
120+
for (var i = 0; i < state.vertexStorageBuffers.Count; i++)
116121
{
117-
var buffer = pair.Value as SDLGPUVertexBuffer;
122+
var binding = state.vertexStorageBuffers[i];
123+
124+
var buffer = binding.buffer as SDLGPUVertexBuffer;
118125

119126
backend.TryGetVertexBuffer(buffer.handle, out var resource);
120127

121-
singleBuffer[0] = resource.buffer;
128+
SDLGPURendererBackend.singleBuffer[0] = resource.buffer;
122129

123-
SDL.BindGPUVertexStorageBuffers(renderPass, (uint)pair.Key, singleBuffer, 1);
130+
SDL.BindGPUVertexStorageBuffers(renderPass, (uint)binding.binding, SDLGPURendererBackend.singleBuffer, 1);
124131
}
125132
}
126133

127-
if ((state.fragmentStorageBuffers?.Count ?? 0) > 0)
134+
if (hasFragmentStorageBuffers)
128135
{
129-
foreach (var pair in state.fragmentStorageBuffers)
136+
for (var i = 0; i < state.fragmentStorageBuffers.Count; i++)
130137
{
131-
var buffer = pair.Value as SDLGPUVertexBuffer;
138+
var binding = state.fragmentStorageBuffers[i];
139+
140+
var buffer = binding.buffer as SDLGPUVertexBuffer;
132141

133142
backend.TryGetVertexBuffer(buffer.handle, out var resource);
134143

135-
singleBuffer[0] = resource.buffer;
144+
SDLGPURendererBackend.singleBuffer[0] = resource.buffer;
136145

137-
SDL.BindGPUFragmentStorageBuffers(renderPass, (uint)pair.Key, singleBuffer, 1);
146+
SDL.BindGPUFragmentStorageBuffers(renderPass, (uint)binding.binding, SDLGPURendererBackend.singleBuffer, 1);
138147
}
139148
}
140149

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/Commands/SDLGPURenderTransientCommand.cs

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using SDL3;
2-
using System;
3-
using System.Collections.Generic;
42

53
namespace Staple.Internal;
64

@@ -32,14 +30,17 @@ public void Update(IRendererBackend rendererBackend)
3230
return;
3331
}
3432

35-
if ((state.vertexStorageBuffers?.Count ?? 0) > 0)
33+
var hasVertexStorageBuffers = state.vertexStorageBuffers != null;
34+
var hasFragmentStorageBuffers = state.fragmentStorageBuffers != null;
35+
36+
if (hasVertexStorageBuffers)
3637
{
37-
foreach (var pair in state.vertexStorageBuffers)
38+
for (var i = 0; i < state.vertexStorageBuffers.Count; i++)
3839
{
39-
if (pair.Value == null ||
40-
pair.Value.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
41-
pair.Value.Disposed ||
42-
pair.Value is not SDLGPUVertexBuffer v ||
40+
var binding = state.vertexStorageBuffers[i];
41+
42+
if (binding.buffer.Disposed ||
43+
binding.buffer is not SDLGPUVertexBuffer v ||
4344
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
4445
resource.used == false ||
4546
resource.buffer == nint.Zero)
@@ -49,14 +50,14 @@ pair.Value is not SDLGPUVertexBuffer v ||
4950
}
5051
}
5152

52-
if ((state.fragmentStorageBuffers?.Count ?? 0) > 0)
53+
if (hasFragmentStorageBuffers)
5354
{
54-
foreach (var pair in state.fragmentStorageBuffers)
55+
for (var i = 0; i < state.fragmentStorageBuffers.Count; i++)
5556
{
56-
if (pair.Value == null ||
57-
pair.Value.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
58-
pair.Value.Disposed ||
59-
pair.Value is not SDLGPUVertexBuffer v ||
57+
var binding = state.fragmentStorageBuffers[i];
58+
59+
if (binding.buffer.Disposed ||
60+
binding.buffer is not SDLGPUVertexBuffer v ||
6061
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
6162
resource.used == false ||
6263
resource.buffer == nint.Zero)
@@ -75,7 +76,12 @@ pair.Value is not SDLGPUVertexBuffer v ||
7576
renderPass = backend.renderPass;
7677
}
7778

78-
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
79+
if (SDLGPURendererBackend.lastGraphicsPipeline != pipeline)
80+
{
81+
SDLGPURendererBackend.lastGraphicsPipeline = pipeline;
82+
83+
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
84+
}
7985

8086
if (state.scissor != default)
8187
{
@@ -121,33 +127,35 @@ pair.Value is not SDLGPUVertexBuffer v ||
121127
SDL.BindGPUFragmentSamplers(renderPass, 0, fragmentSamplers, (uint)fragmentSamplers.Length);
122128
}
123129

124-
var singleBuffer = new nint[1];
125-
126-
if ((state.vertexStorageBuffers?.Count ?? 0) > 0)
130+
if (hasVertexStorageBuffers)
127131
{
128-
foreach (var pair in state.vertexStorageBuffers)
132+
for (var i = 0; i < state.vertexStorageBuffers.Count; i++)
129133
{
130-
var buffer = pair.Value as SDLGPUVertexBuffer;
134+
var binding = state.vertexStorageBuffers[i];
135+
136+
var buffer = binding.buffer as SDLGPUVertexBuffer;
131137

132138
backend.TryGetVertexBuffer(buffer.handle, out var resource);
133139

134-
singleBuffer[0] = resource.buffer;
140+
SDLGPURendererBackend.singleBuffer[0] = resource.buffer;
135141

136-
SDL.BindGPUVertexStorageBuffers(renderPass, (uint)pair.Key, singleBuffer, 1);
142+
SDL.BindGPUVertexStorageBuffers(renderPass, (uint)binding.binding, SDLGPURendererBackend.singleBuffer, 1);
137143
}
138144
}
139145

140-
if ((state.fragmentStorageBuffers?.Count ?? 0) > 0)
146+
if (hasFragmentStorageBuffers)
141147
{
142-
foreach (var pair in state.fragmentStorageBuffers)
148+
for (var i = 0; i < state.fragmentStorageBuffers.Count; i++)
143149
{
144-
var buffer = pair.Value as SDLGPUVertexBuffer;
150+
var binding = state.fragmentStorageBuffers[i];
151+
152+
var buffer = binding.buffer as SDLGPUVertexBuffer;
145153

146154
backend.TryGetVertexBuffer(buffer.handle, out var resource);
147155

148-
singleBuffer[0] = resource.buffer;
156+
SDLGPURendererBackend.singleBuffer[0] = resource.buffer;
149157

150-
SDL.BindGPUFragmentStorageBuffers(renderPass, (uint)pair.Key, singleBuffer, 1);
158+
SDL.BindGPUFragmentStorageBuffers(renderPass, (uint)binding.binding, SDLGPURendererBackend.singleBuffer, 1);
151159
}
152160
}
153161

Engine/Staple.Core/Rendering/RenderSystem/Backend/Impls/SDLGPU/Commands/SDLGPURenderTransientUIntCommand.cs

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using SDL3;
2-
using System.Collections.Generic;
32

43
namespace Staple.Internal;
54

@@ -31,14 +30,17 @@ public void Update(IRendererBackend rendererBackend)
3130
return;
3231
}
3332

34-
if ((state.vertexStorageBuffers?.Count ?? 0) > 0)
33+
var hasVertexStorageBuffers = state.vertexStorageBuffers != null;
34+
var hasFragmentStorageBuffers = state.fragmentStorageBuffers != null;
35+
36+
if (hasVertexStorageBuffers)
3537
{
36-
foreach (var pair in state.vertexStorageBuffers)
38+
for(var i = 0; i < state.vertexStorageBuffers.Count; i++)
3739
{
38-
if (pair.Value == null ||
39-
pair.Value.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
40-
pair.Value.Disposed ||
41-
pair.Value is not SDLGPUVertexBuffer v ||
40+
var binding = state.vertexStorageBuffers[i];
41+
42+
if (binding.buffer.Disposed ||
43+
binding.buffer is not SDLGPUVertexBuffer v ||
4244
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
4345
resource.used == false ||
4446
resource.buffer == nint.Zero)
@@ -48,14 +50,14 @@ pair.Value is not SDLGPUVertexBuffer v ||
4850
}
4951
}
5052

51-
if ((state.fragmentStorageBuffers?.Count ?? 0) > 0)
53+
if (hasFragmentStorageBuffers)
5254
{
53-
foreach (var pair in state.fragmentStorageBuffers)
55+
for (var i = 0; i < state.fragmentStorageBuffers.Count; i++)
5456
{
55-
if (pair.Value == null ||
56-
pair.Value.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
57-
pair.Value.Disposed ||
58-
pair.Value is not SDLGPUVertexBuffer v ||
57+
var binding = state.fragmentStorageBuffers[i];
58+
59+
if (binding.buffer.Disposed ||
60+
binding.buffer is not SDLGPUVertexBuffer v ||
5961
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
6062
resource.used == false ||
6163
resource.buffer == nint.Zero)
@@ -74,7 +76,12 @@ pair.Value is not SDLGPUVertexBuffer v ||
7476
renderPass = backend.renderPass;
7577
}
7678

77-
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
79+
if(SDLGPURendererBackend.lastGraphicsPipeline != pipeline)
80+
{
81+
SDLGPURendererBackend.lastGraphicsPipeline = pipeline;
82+
83+
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
84+
}
7885

7986
if (state.scissor != default)
8087
{
@@ -120,33 +127,35 @@ pair.Value is not SDLGPUVertexBuffer v ||
120127
SDL.BindGPUFragmentSamplers(renderPass, 0, fragmentSamplers, (uint)fragmentSamplers.Length);
121128
}
122129

123-
var singleBuffer = new nint[1];
124-
125-
if ((state.vertexStorageBuffers?.Count ?? 0) > 0)
130+
if (hasVertexStorageBuffers)
126131
{
127-
foreach (var pair in state.vertexStorageBuffers)
132+
for (var i = 0; i < state.vertexStorageBuffers.Count; i++)
128133
{
129-
var buffer = pair.Value as SDLGPUVertexBuffer;
134+
var binding = state.vertexStorageBuffers[i];
135+
136+
var buffer = binding.buffer as SDLGPUVertexBuffer;
130137

131138
backend.TryGetVertexBuffer(buffer.handle, out var resource);
132139

133-
singleBuffer[0] = resource.buffer;
140+
SDLGPURendererBackend.singleBuffer[0] = resource.buffer;
134141

135-
SDL.BindGPUVertexStorageBuffers(renderPass, (uint)pair.Key, singleBuffer, 1);
142+
SDL.BindGPUVertexStorageBuffers(renderPass, (uint)binding.binding, SDLGPURendererBackend.singleBuffer, 1);
136143
}
137144
}
138145

139-
if ((state.fragmentStorageBuffers?.Count ?? 0) > 0)
146+
if (hasFragmentStorageBuffers)
140147
{
141-
foreach (var pair in state.fragmentStorageBuffers)
148+
for (var i = 0; i < state.fragmentStorageBuffers.Count; i++)
142149
{
143-
var buffer = pair.Value as SDLGPUVertexBuffer;
150+
var binding = state.fragmentStorageBuffers[i];
151+
152+
var buffer = binding.buffer as SDLGPUVertexBuffer;
144153

145154
backend.TryGetVertexBuffer(buffer.handle, out var resource);
146155

147-
singleBuffer[0] = resource.buffer;
156+
SDLGPURendererBackend.singleBuffer[0] = resource.buffer;
148157

149-
SDL.BindGPUFragmentStorageBuffers(renderPass, (uint)pair.Key, singleBuffer, 1);
158+
SDL.BindGPUFragmentStorageBuffers(renderPass, (uint)binding.binding, SDLGPURendererBackend.singleBuffer, 1);
150159
}
151160
}
152161

0 commit comments

Comments
 (0)