Skip to content

Commit 3dd2665

Browse files
[Rendering] Add shader flags for vertex/fragment;
[Rendering] Add support for resizable vertex/index buffers; [Rendering] Add scissoring; [Rendering] WIP on base uniforms and ImGui proxy;
1 parent 37f2bfb commit 3dd2665

File tree

19 files changed

+399
-360
lines changed

19 files changed

+399
-360
lines changed

BuiltinResources/Hidden/Shaders/UI/imgui.shader

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ End Parameters
99

1010
Begin Common
1111

12-
cbuffer Uniforms
13-
{
14-
Sampler2D mainTexture;
15-
};
16-
1712
struct VertexOutput
1813
{
1914
float4 position : SV_Position;
@@ -29,7 +24,7 @@ struct Input
2924
{
3025
float3 position : POSITION;
3126
float2 coord : TEXCOORD0;
32-
float4 color : COLOR0;
27+
int color : COLOR0;
3328
};
3429

3530
[shader("vertex")]
@@ -39,7 +34,13 @@ VertexOutput VertexMain(Input input)
3934

4035
float3 position = input.position;
4136

42-
output.color = input.color;
37+
output.color = float4(
38+
(input.color & int(0xFF000000)) / 255.0,
39+
(input.color & int(0x00FF0000)) / 255.0,
40+
(input.color & int(0x0000FF00)) / 255.0,
41+
(input.color & int(0x000000FF)) / 255.0,
42+
);
43+
4344
output.coord = input.coord;
4445
output.position = mul(mul(mul(projection, view), world), float4(position, 1.0));
4546

@@ -50,6 +51,12 @@ End Vertex
5051

5152
Begin Fragment
5253

54+
[[vk::binding(0, 2)]]
55+
cbuffer Uniforms
56+
{
57+
Sampler2D mainTexture;
58+
};
59+
5360
[shader("fragment")]
5461
float4 FragmentMain(VertexOutput input) : SV_Target
5562
{

Engine/Staple.Core/Rendering/Camera/Camera.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ internal static Matrix4x4 Projection(Entity entity, Camera camera)
221221

222222
default:
223223

224-
throw new System.ArgumentException("Camera Type is invalid", "cameraType");
224+
throw new System.ArgumentException("Camera Type is invalid", nameof(cameraType));
225225
}
226226
}
227227

Engine/Staple.Core/Rendering/Graphics.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public static void RenderGeometry(VertexBuffer vertex, IndexBuffer index,
8383

8484
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
8585

86-
RenderSystem.Submit(viewID, renderState, Mesh.TriangleCount(topology, indexCount), 1);
86+
RenderSystem.Submit(RenderSystem.GetViewPass(viewID), renderState, Mesh.TriangleCount(topology, indexCount), 1);
8787
}
8888
}
8989

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ void SetupMaterial()
401401
vertexLayout = mesh.vertexBuffer.layout,
402402
};
403403

404-
RenderSystem.Submit(viewID, renderState, mesh.SubmeshTriangleCount(0), 1);
404+
RenderSystem.Submit(RenderSystem.GetViewPass(viewID), renderState, mesh.SubmeshTriangleCount(0), 1);
405405
}
406406
}
407407
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
118118

119119
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
120120

121-
RenderSystem.Submit(viewID, renderState, Mesh.TriangleCount(mesh.MeshTopology, mesh.IndexCount), 1);
121+
RenderSystem.Submit(RenderSystem.GetViewPass(viewID), renderState, Mesh.TriangleCount(mesh.MeshTopology, mesh.IndexCount), 1);
122122
}
123123
}
124124

@@ -412,7 +412,7 @@ public void Submit(ushort viewID)
412412

413413
if(program != null)
414414
{
415-
RenderSystem.Submit(viewID, renderState, renderData.mesh.SubmeshTriangleCount(content.submeshIndex), 1);
415+
RenderSystem.Submit(RenderSystem.GetViewPass(viewID), renderState, renderData.mesh.SubmeshTriangleCount(content.submeshIndex), 1);
416416
}
417417
}
418418
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
namespace Staple.Internal;
1+
using System.Numerics;
2+
3+
namespace Staple.Internal;
24

35
internal interface IRenderCommand
46
{
57
void Submit();
68

79
void Discard();
810

9-
IRenderPass BeginRenderPass(RenderTarget target, CameraClearMode clear, Color clearColor);
11+
IRenderPass BeginRenderPass(RenderTarget target, CameraClearMode clear, Color clearColor,
12+
Vector4 viewport, Matrix4x4 view, Matrix4x4 projection);
1013
}

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

Lines changed: 88 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@ internal class SDLGPUIndexBuffer : IndexBuffer
99
public nint buffer;
1010

1111
private readonly nint device;
12+
private readonly RenderBufferFlags flags;
1213
private readonly Func<SDLGPURenderCommand> commandSupplier;
14+
private nint transferBuffer;
15+
private int length;
1316

14-
public SDLGPUIndexBuffer(nint device, nint buffer, Func<SDLGPURenderCommand> commandSupplier)
17+
public bool Valid => buffer != nint.Zero && transferBuffer != nint.Zero;
18+
19+
public SDLGPUIndexBuffer(nint device, RenderBufferFlags flags, Func<SDLGPURenderCommand> commandSupplier)
1520
{
1621
this.device = device;
17-
this.buffer = buffer;
22+
this.flags = flags;
1823
this.commandSupplier = commandSupplier;
1924

2025
ResourceManager.instance.userCreatedIndexBuffers.Add(new(this));
@@ -30,38 +35,102 @@ public override void Destroy()
3035

3136
buffer = nint.Zero;
3237
}
33-
}
3438

35-
public override void SetActive(uint start, uint count)
36-
{
39+
if (transferBuffer != nint.Zero)
40+
{
41+
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
42+
43+
transferBuffer = nint.Zero;
44+
}
3745
}
3846

39-
public override void SetBufferActive(byte stage, Access access)
47+
public void ResizeIfNeeded(int lengthInBytes)
4048
{
49+
if (length == lengthInBytes)
50+
{
51+
return;
52+
}
53+
54+
if (buffer != nint.Zero)
55+
{
56+
SDL.SDL_WaitForGPUIdle(device);
57+
SDL.SDL_ReleaseGPUBuffer(device, buffer);
58+
59+
if (transferBuffer != nint.Zero)
60+
{
61+
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
62+
}
63+
64+
transferBuffer = nint.Zero;
65+
buffer = nint.Zero;
66+
}
67+
68+
var usageFlags = SDL.SDL_GPUBufferUsageFlags.SDL_GPU_BUFFERUSAGE_INDEX;
69+
70+
if (flags.HasFlag(RenderBufferFlags.GraphicsRead))
71+
{
72+
usageFlags |= SDL.SDL_GPUBufferUsageFlags.SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ;
73+
}
74+
75+
if (flags.HasFlag(RenderBufferFlags.ComputeRead))
76+
{
77+
usageFlags |= SDL.SDL_GPUBufferUsageFlags.SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ;
78+
}
79+
80+
if (flags.HasFlag(RenderBufferFlags.ComputeWrite))
81+
{
82+
usageFlags |= SDL.SDL_GPUBufferUsageFlags.SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE;
83+
}
84+
85+
var createInfo = new SDL.SDL_GPUBufferCreateInfo()
86+
{
87+
size = (uint)lengthInBytes,
88+
usage = usageFlags,
89+
};
90+
91+
buffer = SDL.SDL_CreateGPUBuffer(device, in createInfo);
92+
93+
if (buffer == nint.Zero)
94+
{
95+
return;
96+
}
97+
98+
var transferInfo = new SDL.SDL_GPUTransferBufferCreateInfo()
99+
{
100+
size = (uint)lengthInBytes,
101+
usage = SDL.SDL_GPUTransferBufferUsage.SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD,
102+
};
103+
104+
transferBuffer = SDL.SDL_CreateGPUTransferBuffer(device, in transferInfo);
105+
106+
if(transferBuffer == nint.Zero)
107+
{
108+
SDL.SDL_WaitForGPUIdle(device);
109+
SDL.SDL_ReleaseGPUBuffer(device, buffer);
110+
111+
buffer = nint.Zero;
112+
113+
return;
114+
}
115+
116+
length = lengthInBytes;
41117
}
42118

43119
public override void Update(Span<ushort> data)
44120
{
45121
var size = Marshal.SizeOf<ushort>();
46122

47123
if (Disposed ||
48-
buffer == nint.Zero ||
49124
data.Length == 0)
50125
{
51126
return;
52127
}
53128

54129
var byteSize = data.Length * size;
55130

56-
var transferInfo = new SDL.SDL_GPUTransferBufferCreateInfo()
57-
{
58-
size = (uint)byteSize,
59-
usage = SDL.SDL_GPUTransferBufferUsage.SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD,
60-
};
61-
62-
var transferBuffer = SDL.SDL_CreateGPUTransferBuffer(device, in transferInfo);
131+
ResizeIfNeeded(data.Length * byteSize);
63132

64-
if (transferBuffer == nint.Zero)
133+
if (Valid == false)
65134
{
66135
return;
67136
}
@@ -70,12 +139,10 @@ public override void Update(Span<ushort> data)
70139

71140
if (command == null)
72141
{
73-
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
74-
75142
return;
76143
}
77144

78-
var mapData = SDL.SDL_MapGPUTransferBuffer(device, transferBuffer, false);
145+
var mapData = SDL.SDL_MapGPUTransferBuffer(device, transferBuffer, true);
79146

80147
unsafe
81148
{
@@ -90,8 +157,6 @@ public override void Update(Span<ushort> data)
90157

91158
if (copyPass == nint.Zero)
92159
{
93-
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
94-
95160
command.Discard();
96161

97162
return;
@@ -115,8 +180,6 @@ public override void Update(Span<ushort> data)
115180

116181
command.Submit();
117182

118-
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
119-
120183
Is32Bit = false;
121184
}
122185

@@ -125,23 +188,16 @@ public override void Update(Span<uint> data)
125188
var size = Marshal.SizeOf<uint>();
126189

127190
if (Disposed ||
128-
buffer == nint.Zero ||
129191
data.Length == 0)
130192
{
131193
return;
132194
}
133195

134196
var byteSize = data.Length * size;
135197

136-
var transferInfo = new SDL.SDL_GPUTransferBufferCreateInfo()
137-
{
138-
size = (uint)byteSize,
139-
usage = SDL.SDL_GPUTransferBufferUsage.SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD,
140-
};
141-
142-
var transferBuffer = SDL.SDL_CreateGPUTransferBuffer(device, in transferInfo);
198+
ResizeIfNeeded(byteSize);
143199

144-
if (transferBuffer == nint.Zero)
200+
if (Valid == false)
145201
{
146202
return;
147203
}
@@ -150,12 +206,10 @@ public override void Update(Span<uint> data)
150206

151207
if (command == null)
152208
{
153-
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
154-
155209
return;
156210
}
157211

158-
var mapData = SDL.SDL_MapGPUTransferBuffer(device, transferBuffer, false);
212+
var mapData = SDL.SDL_MapGPUTransferBuffer(device, transferBuffer, true);
159213

160214
unsafe
161215
{
@@ -170,8 +224,6 @@ public override void Update(Span<uint> data)
170224

171225
if (copyPass == nint.Zero)
172226
{
173-
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
174-
175227
command.Discard();
176228

177229
return;
@@ -195,8 +247,6 @@ public override void Update(Span<uint> data)
195247

196248
command.Submit();
197249

198-
SDL.SDL_ReleaseGPUTransferBuffer(device, transferBuffer);
199-
200250
Is32Bit = true;
201251
}
202252
}

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using SDL3;
2+
using System.Numerics;
23
using System.Runtime.CompilerServices;
34

45
namespace Staple.Internal;
@@ -33,7 +34,8 @@ public void Discard()
3334
commandBuffer = nint.Zero;
3435
}
3536

36-
public IRenderPass BeginRenderPass(RenderTarget target, CameraClearMode clear, Color clearColor)
37+
public IRenderPass BeginRenderPass(RenderTarget target, CameraClearMode clear, Color clearColor, Vector4 viewport,
38+
Matrix4x4 view, Matrix4x4 projection)
3739
{
3840
if(commandBuffer == nint.Zero)
3941
{
@@ -94,6 +96,18 @@ public IRenderPass BeginRenderPass(RenderTarget target, CameraClearMode clear, C
9496
return null;
9597
}
9698

97-
return new SDLGPURenderPass(renderPass);
99+
var viewportData = new SDL.SDL_GPUViewport()
100+
{
101+
x = (int)(viewport.X * width),
102+
y = (int)(viewport.Y * height),
103+
w = (int)(viewport.Z * width),
104+
h = (int)(viewport.W * height),
105+
min_depth = 0,
106+
max_depth = 1,
107+
};
108+
109+
SDL.SDL_SetGPUViewport(renderPass, in viewportData);
110+
111+
return new SDLGPURenderPass(renderPass, view, projection);
98112
}
99113
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
using SDL3;
2+
using System.Numerics;
23

34
namespace Staple.Internal;
45

5-
internal class SDLGPURenderPass(nint renderPass) : IRenderPass
6+
internal class SDLGPURenderPass(nint renderPass, Matrix4x4 view, Matrix4x4 projection) : IRenderPass
67
{
78
public nint renderPass = renderPass;
89

10+
public readonly Matrix4x4 view = view;
11+
public readonly Matrix4x4 projection = projection;
12+
913
public void Finish()
1014
{
1115
if(renderPass == nint.Zero)

0 commit comments

Comments
 (0)