Skip to content

Commit ef6dcad

Browse files
[Rendering] Optimize some SDL API usage;
1 parent d51c3e9 commit ef6dcad

File tree

4 files changed

+88
-68
lines changed

4 files changed

+88
-68
lines changed

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

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ internal class SDLGPURenderCommand(RenderState state, nint pipeline, Texture[] v
1515
public SDLGPURendererBackend.StapleShaderUniform[] fragmentUniformData = fragmentUniformData;
1616
public SDLGPUShaderProgram program = program;
1717

18+
internal static SDL.GPUBufferBinding[] vertexBinding = [new SDL.GPUBufferBinding()];
19+
internal static SDL.GPUBufferBinding indexBinding;
20+
internal static SDL.Rect scissor;
21+
1822
public void Update(IRendererBackend rendererBackend)
1923
{
2024
var backend = (SDLGPURendererBackend)rendererBackend;
@@ -74,34 +78,25 @@ pair.Value is not SDLGPUVertexBuffer v ||
7478

7579
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
7680

77-
if (state.scissor != default)
78-
{
79-
var scissor = new SDL.Rect()
80-
{
81-
X = state.scissor.left,
82-
Y = state.scissor.top,
83-
W = state.scissor.Width,
84-
H = state.scissor.Height,
85-
};
81+
vertexBinding[0].Buffer = vertexBuffer.buffer;
8682

87-
SDL.SetGPUScissor(renderPass, in scissor);
88-
}
83+
indexBinding.Buffer = indexBuffer.buffer;
8984

90-
var vertexBinding = new SDL.GPUBufferBinding()
85+
if (SDLGPURendererBackend.lastVertexBuffer != vertexBuffer.buffer)
9186
{
92-
Buffer = vertexBuffer.buffer,
93-
};
87+
SDLGPURendererBackend.lastVertexBuffer = vertexBuffer.buffer;
9488

95-
var indexBinding = new SDL.GPUBufferBinding()
96-
{
97-
Buffer = indexBuffer.buffer,
98-
};
89+
SDL.BindGPUVertexBuffers(renderPass, 0, vertexBinding, 1);
90+
}
9991

100-
SDL.BindGPUVertexBuffers(renderPass, 0, [vertexBinding], 1);
92+
if (SDLGPURendererBackend.lastIndexBuffer != indexBuffer.buffer)
93+
{
94+
SDLGPURendererBackend.lastIndexBuffer = indexBuffer.buffer;
10195

102-
SDL.BindGPUIndexBuffer(renderPass, in indexBinding, index.Is32Bit ?
103-
SDL.GPUIndexElementSize.IndexElementSize32Bit :
104-
SDL.GPUIndexElementSize.IndexElementSize16Bit);
96+
SDL.BindGPUIndexBuffer(renderPass, in indexBinding, index.Is32Bit ?
97+
SDL.GPUIndexElementSize.IndexElementSize32Bit :
98+
SDL.GPUIndexElementSize.IndexElementSize16Bit);
99+
}
105100

106101
if (vertexSamplers != null)
107102
{

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

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ internal class SDLGPURenderTransientCommand(RenderState state, nint pipeline, Te
1717
public SDLGPURendererBackend.StapleShaderUniform[] fragmentUniformData = fragmentUniformData;
1818
public SDLGPUShaderProgram program = program;
1919

20+
internal static SDL.GPUBufferBinding[] vertexBinding = [new SDL.GPUBufferBinding()];
21+
internal static SDL.GPUBufferBinding indexBinding;
22+
internal static SDL.Rect scissor;
23+
2024
public void Update(IRendererBackend rendererBackend)
2125
{
2226
var backend = (SDLGPURendererBackend)rendererBackend;
@@ -73,42 +77,39 @@ pair.Value is not SDLGPUVertexBuffer v ||
7377

7478
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
7579

76-
var scissor = new SDL.Rect();
77-
7880
if (state.scissor != default)
7981
{
80-
scissor = new()
81-
{
82-
X = state.scissor.left,
83-
Y = state.scissor.top,
84-
W = state.scissor.Width,
85-
H = state.scissor.Height,
86-
};
82+
scissor.X = state.scissor.left;
83+
scissor.Y = state.scissor.top;
84+
scissor.W = state.scissor.Width;
85+
scissor.H = state.scissor.Height;
8786
}
8887
else
8988
{
90-
scissor = new()
91-
{
92-
W = backend.renderSize.X,
93-
H = backend.renderSize.Y,
94-
};
89+
scissor.X = scissor.Y = 0;
90+
scissor.W = backend.renderSize.X;
91+
scissor.H = backend.renderSize.Y;
9592
}
9693

9794
SDL.SetGPUScissor(renderPass, in scissor);
9895

99-
var vertexBinding = new SDL.GPUBufferBinding()
100-
{
101-
Buffer = entry.vertexBuffer,
102-
};
96+
vertexBinding[0].Buffer = entry.vertexBuffer;
10397

104-
var indexBinding = new SDL.GPUBufferBinding()
98+
indexBinding.Buffer = entry.indexBuffer;
99+
100+
if (SDLGPURendererBackend.lastVertexBuffer != entry.vertexBuffer)
105101
{
106-
Buffer = entry.indexBuffer,
107-
};
102+
SDLGPURendererBackend.lastVertexBuffer = entry.vertexBuffer;
108103

109-
SDL.BindGPUVertexBuffers(renderPass, 0, [vertexBinding], 1);
104+
SDL.BindGPUVertexBuffers(renderPass, 0, vertexBinding, 1);
105+
}
110106

111-
SDL.BindGPUIndexBuffer(renderPass, in indexBinding, SDL.GPUIndexElementSize.IndexElementSize16Bit);
107+
if (SDLGPURendererBackend.lastIndexBuffer != entry.indexBuffer)
108+
{
109+
SDLGPURendererBackend.lastIndexBuffer = entry.indexBuffer;
110+
111+
SDL.BindGPUIndexBuffer(renderPass, in indexBinding, SDL.GPUIndexElementSize.IndexElementSize16Bit);
112+
}
112113

113114
if (vertexSamplers != null)
114115
{

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

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ internal class SDLGPURenderTransientUIntCommand(RenderState state, nint pipeline
1616
public SDLGPURendererBackend.StapleShaderUniform[] fragmentUniformData = fragmentUniformData;
1717
public SDLGPUShaderProgram program = program;
1818

19+
internal static SDL.GPUBufferBinding[] vertexBinding = [new SDL.GPUBufferBinding()];
20+
internal static SDL.GPUBufferBinding indexBinding;
21+
internal static SDL.Rect scissor;
22+
1923
public void Update(IRendererBackend rendererBackend)
2024
{
2125
var backend = (SDLGPURendererBackend)rendererBackend;
@@ -72,42 +76,39 @@ pair.Value is not SDLGPUVertexBuffer v ||
7276

7377
SDL.BindGPUGraphicsPipeline(renderPass, pipeline);
7478

75-
var scissor = new SDL.Rect();
76-
7779
if (state.scissor != default)
7880
{
79-
scissor = new()
80-
{
81-
X = state.scissor.left,
82-
Y = state.scissor.top,
83-
W = state.scissor.Width,
84-
H = state.scissor.Height,
85-
};
81+
scissor.X = state.scissor.left;
82+
scissor.Y = state.scissor.top;
83+
scissor.W = state.scissor.Width;
84+
scissor.H = state.scissor.Height;
8685
}
8786
else
8887
{
89-
scissor = new()
90-
{
91-
W = backend.renderSize.X,
92-
H = backend.renderSize.Y,
93-
};
88+
scissor.X = scissor.Y = 0;
89+
scissor.W = backend.renderSize.X;
90+
scissor.H = backend.renderSize.Y;
9491
}
9592

9693
SDL.SetGPUScissor(renderPass, in scissor);
9794

98-
var vertexBinding = new SDL.GPUBufferBinding()
99-
{
100-
Buffer = entry.vertexBuffer,
101-
};
95+
vertexBinding[0].Buffer = entry.vertexBuffer;
10296

103-
var indexBinding = new SDL.GPUBufferBinding()
97+
indexBinding.Buffer = entry.indexBuffer;
98+
99+
if (SDLGPURendererBackend.lastVertexBuffer != entry.vertexBuffer)
104100
{
105-
Buffer = entry.indexBuffer,
106-
};
101+
SDLGPURendererBackend.lastVertexBuffer = entry.vertexBuffer;
107102

108-
SDL.BindGPUVertexBuffers(renderPass, 0, [vertexBinding], 1);
103+
SDL.BindGPUVertexBuffers(renderPass, 0, vertexBinding, 1);
104+
}
109105

110-
SDL.BindGPUIndexBuffer(renderPass, in indexBinding, SDL.GPUIndexElementSize.IndexElementSize32Bit);
106+
if (SDLGPURendererBackend.lastIndexBuffer != entry.indexBuffer)
107+
{
108+
SDLGPURendererBackend.lastIndexBuffer = entry.indexBuffer;
109+
110+
SDL.BindGPUIndexBuffer(renderPass, in indexBinding, SDL.GPUIndexElementSize.IndexElementSize32Bit);
111+
}
111112

112113
if (vertexSamplers != null)
113114
{

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,23 @@ private readonly struct TransferBufferCacheKey(bool download, int length)
8989
public readonly bool download = download;
9090
public readonly int length = length;
9191

92+
public static bool operator==(TransferBufferCacheKey lhs, TransferBufferCacheKey rhs)
93+
{
94+
return lhs.download == rhs.download &&
95+
lhs.length == rhs.length;
96+
}
97+
98+
public static bool operator !=(TransferBufferCacheKey lhs, TransferBufferCacheKey rhs)
99+
{
100+
return lhs.download != rhs.download ||
101+
lhs.length != rhs.length;
102+
}
103+
104+
public override bool Equals(object obj)
105+
{
106+
return obj is TransferBufferCacheKey key && this == key;
107+
}
108+
92109
public override int GetHashCode()
93110
{
94111
return HashCode.Combine(download, length);
@@ -463,6 +480,9 @@ public void Clear()
463480

464481
private bool iteratingCommands = false;
465482
private int commandIndex;
483+
484+
internal static nint lastVertexBuffer;
485+
internal static nint lastIndexBuffer;
466486
#endregion
467487

468488
public bool SupportsTripleBuffering => SDL.WindowSupportsGPUPresentMode(device, window.window,
@@ -811,6 +831,9 @@ public void EndFrame()
811831
commands.Clear();
812832
frameAllocator.Clear();
813833

834+
lastVertexBuffer = nint.Zero;
835+
lastIndexBuffer = nint.Zero;
836+
814837
foreach (var pair in transientBuffers)
815838
{
816839
pair.Value.Clear();

0 commit comments

Comments
 (0)