Skip to content

Commit cca9696

Browse files
[Rendering] Add transient buffers;
1 parent bdefa16 commit cca9696

File tree

14 files changed

+1080
-231
lines changed

14 files changed

+1080
-231
lines changed

Engine/Staple.Core/Rendering/Graphics.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,16 @@ public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, Span<u
118118

119119
lightSystem?.ApplyMaterialLighting(material, lighting);
120120

121-
var program = material.ShaderProgram;
121+
renderState.program = material.ShaderProgram;
122122

123-
if (program == null)
123+
if (renderState.program == null)
124124
{
125125
return;
126126
}
127127

128128
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
129129

130-
RenderSystem.Instance.RenderSimple(vertices, layout, indices, renderState);
130+
RenderSystem.Backend.RenderTransient(vertices, layout, indices, renderState);
131131
}
132132

133133
public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, Span<uint> indices, Material material, Vector3 position,
@@ -165,16 +165,16 @@ public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, Span<u
165165

166166
lightSystem?.ApplyMaterialLighting(material, lighting);
167167

168-
var program = material.ShaderProgram;
168+
renderState.program = material.ShaderProgram;
169169

170-
if (program == null)
170+
if (renderState.program == null)
171171
{
172172
return;
173173
}
174174

175175
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
176176

177-
RenderSystem.Instance.RenderSimple(vertices, layout, indices, renderState);
177+
RenderSystem.Backend.RenderTransient(vertices, layout, indices, renderState);
178178
}
179179
}
180180
}

Engine/Staple.Core/Rendering/Material.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ internal Texture[] Textures
107107
{
108108
get
109109
{
110-
var textureCount = hasMainTexture ? 1 : 0;
110+
var addMainTexture = ((mainTexture?.Disposed ?? true) == false);
111+
112+
var textureCount = addMainTexture ? 1 : 0;
111113

112114
foreach(var pair in parameters)
113115
{
@@ -124,12 +126,12 @@ internal Texture[] Textures
124126
Array.Resize(ref textures, textureCount);
125127
}
126128

127-
if(hasMainTexture)
129+
if(addMainTexture)
128130
{
129131
textures[0] = MainTexture;
130132
}
131133

132-
var counter = hasMainTexture ? 1 : 0;
134+
var counter = addMainTexture ? 1 : 0;
133135

134136
foreach (var pair in parameters)
135137
{
@@ -1051,6 +1053,9 @@ internal void ApplyProperties(ApplyMode applyMode, ref RenderState state)
10511053
shader.SetColor(mainColorHandle, mainColor);
10521054
}
10531055

1056+
state.sourceBlend = shader.sourceBlend;
1057+
state.destinationBlend = shader.destinationBlend;
1058+
10541059
if (applyPropertiesCallbacks.Length != parameters.Count)
10551060
{
10561061
applyPropertiesCallbacks = new Action[parameters.Count];

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
6868
return;
6969
}
7070

71+
mesh.UploadMeshData();
72+
7173
var matrix = Matrix4x4.TRS(position, scale, rotation);
7274

7375
var renderState = new RenderState()
@@ -136,7 +138,9 @@ public void Preprocess(Span<(Entity, Transform, IComponent)> entities, Camera ac
136138
continue;
137139
}
138140

139-
if(transform.ChangedThisFrame || renderer.localBounds.size == Vector3.Zero)
141+
renderer.mesh.UploadMeshData();
142+
143+
if (transform.ChangedThisFrame || renderer.localBounds.size == Vector3.Zero)
140144
{
141145
var localSize = Vector3.Abs(renderer.mesh.bounds.size.Transformed(transform.LocalRotation));
142146

Engine/Staple.Core/Rendering/RenderSystem/Backend/IRendererBackend.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@ IShaderProgram CreateShaderVertexFragment(byte[] vertex, byte[] fragment,
6161
ITexture CreateEmptyTexture(int width, int height, TextureFormat format, TextureFlags flags);
6262

6363
void Render(RenderState state);
64+
65+
void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<ushort> indices, RenderState state) where T : unmanaged;
66+
67+
void RenderTransient<T>(Span<T> vertices, VertexLayout layout, Span<uint> indices, RenderState state) where T : unmanaged;
6468
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using SDL3;
2+
using System;
3+
using System.Runtime.InteropServices;
4+
5+
namespace Staple.Internal;
6+
7+
internal class SDLGPURenderTransientCommand(RenderState state, nint pipeline,
8+
SDL.SDL_GPUTextureSamplerBinding[] samplers, SDLGPURendererBackend.TransientEntry entry) : IRenderCommand
9+
{
10+
public RenderState state = state;
11+
public nint pipeline = pipeline;
12+
public SDL.SDL_GPUTextureSamplerBinding[] samplers = samplers;
13+
public SDLGPURendererBackend.TransientEntry entry = entry;
14+
15+
public void Update(IRendererBackend rendererBackend)
16+
{
17+
if (rendererBackend is not SDLGPURendererBackend backend ||
18+
state.program is not SDLGPUShaderProgram shader ||
19+
shader.Type != ShaderType.VertexFragment ||
20+
entry.vertexBuffer == nint.Zero)
21+
{
22+
return;
23+
}
24+
25+
var renderPass = backend.renderPass;
26+
27+
if (renderPass == nint.Zero)
28+
{
29+
backend.ResumeRenderPass();
30+
31+
renderPass = backend.renderPass;
32+
}
33+
34+
SDL.SDL_BindGPUGraphicsPipeline(renderPass, pipeline);
35+
36+
var vertexBinding = new SDL.SDL_GPUBufferBinding()
37+
{
38+
buffer = entry.vertexBuffer,
39+
};
40+
41+
var indexBinding = new SDL.SDL_GPUBufferBinding()
42+
{
43+
buffer = entry.indexBuffer,
44+
};
45+
46+
var scissor = new SDL.SDL_Rect();
47+
48+
if (state.scissor != default)
49+
{
50+
scissor = new()
51+
{
52+
x = state.scissor.left,
53+
y = state.scissor.top,
54+
w = state.scissor.Width,
55+
h = state.scissor.Height,
56+
};
57+
}
58+
else
59+
{
60+
scissor = new()
61+
{
62+
w = backend.renderSize.X,
63+
h = backend.renderSize.Y,
64+
};
65+
}
66+
67+
SDL.SDL_SetGPUScissor(renderPass, in scissor);
68+
69+
SDL.SDL_BindGPUVertexBuffers(renderPass, 0, [vertexBinding], 1);
70+
71+
SDL.SDL_BindGPUIndexBuffer(renderPass, in indexBinding, SDL.SDL_GPUIndexElementSize.SDL_GPU_INDEXELEMENTSIZE_16BIT);
72+
73+
if (samplers != null)
74+
{
75+
SDL.SDL_BindGPUFragmentSamplers(renderPass, 0, samplers.AsSpan(), (uint)samplers.Length);
76+
}
77+
78+
backend.viewData.renderData.world = state.world;
79+
80+
unsafe
81+
{
82+
fixed (void* ptr = &backend.viewData.renderData)
83+
{
84+
SDL.SDL_PushGPUVertexUniformData(backend.commandBuffer, 0, (nint)ptr,
85+
(uint)Marshal.SizeOf<SDLGPURendererBackend.StapleRenderData>());
86+
}
87+
}
88+
89+
SDL.SDL_DrawGPUIndexedPrimitives(renderPass, (uint)state.indexCount, 1,
90+
(uint)state.startIndex, state.startVertex, 0);
91+
}
92+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using SDL3;
2+
using System;
3+
using System.Runtime.InteropServices;
4+
5+
namespace Staple.Internal;
6+
7+
internal class SDLGPURenderTransientUIntCommand(RenderState state, nint pipeline,
8+
SDL.SDL_GPUTextureSamplerBinding[] samplers, SDLGPURendererBackend.TransientEntry entry) : IRenderCommand
9+
{
10+
public RenderState state = state;
11+
public nint pipeline = pipeline;
12+
public SDL.SDL_GPUTextureSamplerBinding[] samplers = samplers;
13+
public SDLGPURendererBackend.TransientEntry entry = entry;
14+
15+
public void Update(IRendererBackend rendererBackend)
16+
{
17+
if (rendererBackend is not SDLGPURendererBackend backend ||
18+
state.program is not SDLGPUShaderProgram shader ||
19+
shader.Type != ShaderType.VertexFragment ||
20+
entry.vertexBuffer == nint.Zero)
21+
{
22+
return;
23+
}
24+
25+
var renderPass = backend.renderPass;
26+
27+
if (renderPass == nint.Zero)
28+
{
29+
backend.ResumeRenderPass();
30+
31+
renderPass = backend.renderPass;
32+
}
33+
34+
SDL.SDL_BindGPUGraphicsPipeline(renderPass, pipeline);
35+
36+
var vertexBinding = new SDL.SDL_GPUBufferBinding()
37+
{
38+
buffer = entry.vertexBuffer,
39+
};
40+
41+
var indexBinding = new SDL.SDL_GPUBufferBinding()
42+
{
43+
buffer = entry.uintIndexBuffer,
44+
};
45+
46+
var scissor = new SDL.SDL_Rect();
47+
48+
if (state.scissor != default)
49+
{
50+
scissor = new()
51+
{
52+
x = state.scissor.left,
53+
y = state.scissor.top,
54+
w = state.scissor.Width,
55+
h = state.scissor.Height,
56+
};
57+
}
58+
else
59+
{
60+
scissor = new()
61+
{
62+
w = backend.renderSize.X,
63+
h = backend.renderSize.Y,
64+
};
65+
}
66+
67+
SDL.SDL_SetGPUScissor(renderPass, in scissor);
68+
69+
SDL.SDL_BindGPUVertexBuffers(renderPass, 0, [vertexBinding], 1);
70+
71+
SDL.SDL_BindGPUIndexBuffer(renderPass, in indexBinding, SDL.SDL_GPUIndexElementSize.SDL_GPU_INDEXELEMENTSIZE_32BIT);
72+
73+
if (samplers != null)
74+
{
75+
SDL.SDL_BindGPUFragmentSamplers(renderPass, 0, samplers.AsSpan(), (uint)samplers.Length);
76+
}
77+
78+
backend.viewData.renderData.world = state.world;
79+
80+
unsafe
81+
{
82+
fixed (void* ptr = &backend.viewData.renderData)
83+
{
84+
SDL.SDL_PushGPUVertexUniformData(backend.commandBuffer, 0, (nint)ptr,
85+
(uint)Marshal.SizeOf<SDLGPURendererBackend.StapleRenderData>());
86+
}
87+
}
88+
89+
SDL.SDL_DrawGPUIndexedPrimitives(renderPass, (uint)state.indexCount, 1,
90+
(uint)state.startIndex, state.startVertex, 0);
91+
}
92+
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public VertexLayoutBuilder CreateVertexLayoutBuilder()
165165

166166
public void UpdateVertexBuffer(ResourceHandle<VertexBuffer> buffer, Span<byte> data)
167167
{
168-
commands.Add(new SDLGPUUpdateVertexBufferCommand(buffer, data.ToArray()));
168+
AddCommand(new SDLGPUUpdateVertexBufferCommand(buffer, data.ToArray()));
169169
}
170170

171171
public void UpdateIndexBuffer(ResourceHandle<IndexBuffer> buffer, Span<ushort> data)
@@ -181,7 +181,7 @@ public void UpdateIndexBuffer(ResourceHandle<IndexBuffer> buffer, Span<ushort> d
181181
data.CopyTo(target);
182182
}
183183

184-
commands.Add(new SDLGPUUpdateIndexBufferCommand(buffer, holder));
184+
AddCommand(new SDLGPUUpdateIndexBufferCommand(buffer, holder));
185185
}
186186
}
187187

@@ -198,17 +198,17 @@ public void UpdateIndexBuffer(ResourceHandle<IndexBuffer> buffer, Span<uint> dat
198198
data.CopyTo(target);
199199
}
200200

201-
commands.Add(new SDLGPUUpdateIndexBufferCommand(buffer, holder));
201+
AddCommand(new SDLGPUUpdateIndexBufferCommand(buffer, holder));
202202
}
203203
}
204204

205205
public void DestroyVertexBuffer(ResourceHandle<VertexBuffer> buffer)
206206
{
207-
commands.Add(new SDLGPUDestroyVertexBufferCommand(buffer));
207+
AddCommand(new SDLGPUDestroyVertexBufferCommand(buffer));
208208
}
209209

210210
public void DestroyIndexBuffer(ResourceHandle<IndexBuffer> buffer)
211211
{
212-
commands.Add(new SDLGPUDestroyIndexBufferCommand(buffer));
212+
AddCommand(new SDLGPUDestroyIndexBufferCommand(buffer));
213213
}
214214
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ SDL.SDL_GPUSamplerAddressMode GetAddressModeW()
182182

183183
internal void DestroyTexture(ResourceHandle<Texture> handle)
184184
{
185-
commands.Add(new SDLGPUDestroyTextureCommand(handle));
185+
AddCommand(new SDLGPUDestroyTextureCommand(handle));
186186
}
187187

188188
public ITexture CreateTextureAssetTexture(SerializableTexture asset, TextureFlags flags)
@@ -308,7 +308,7 @@ public ITexture CreateEmptyTexture(int width, int height, TextureFormat format,
308308

309309
public void UpdateTexture(ResourceHandle<Texture> handle, Span<byte> data)
310310
{
311-
commands.Add(new SDLGPUUpdateTextureCommand(handle, data.ToArray()));
311+
AddCommand(new SDLGPUUpdateTextureCommand(handle, data.ToArray()));
312312
}
313313

314314
public static SDL.SDL_GPUTextureType GetTextureType(TextureFlags flags)

0 commit comments

Comments
 (0)