Skip to content

Commit c2ae728

Browse files
[Rendering] WIP improvement of shader input variant handling;
[Rendering] WIP support for storage buffers;
1 parent 1c24f29 commit c2ae728

File tree

18 files changed

+327
-168
lines changed

18 files changed

+327
-168
lines changed

BuiltinResources/Hidden/Shaders/Default/Standard.shader

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ Begin Input
2626
POSITION
2727
TEXCOORD0
2828
NORMAL
29-
TANGENT
30-
BITANGENT
31-
COLOR0
29+
variant: NORMALMAP TANGENT
30+
variant: NORMALMAP BITANGENT
31+
variant: VERTEX_COLORS|PER_VERTEX_LIGHTING COLOR0
32+
variant: SKINNING BLENDINDICES
33+
variant: SKINNING BLENDWEIGHTS
3234
End Input
3335

3436
Begin Instancing
@@ -54,9 +56,13 @@ struct VertexOutput
5456
float3 lightNormal;
5557
float2 coords;
5658
float3 normal;
59+
#ifdef NORMALMAP
5760
float3 tangent;
5861
float3 bitangent;
62+
#endif
63+
#if defined(VERTEX_COLORS) || defined(PER_VERTEX_LIGHTING)
5964
float4 color;
65+
#endif
6066
uint instanceID;
6167
};
6268

@@ -69,9 +75,17 @@ struct Input
6975
float3 position : POSITION;
7076
float2 coords : TEXCOORD0;
7177
float3 normal : NORMAL;
78+
#ifdef NORMALMAP
7279
float3 tangent : TANGENT;
7380
float3 bitangent : BITANGENT;
81+
#endif
82+
#if defined(VERTEX_COLORS) || defined(PER_VERTEX_LIGHTING)
7483
float4 color : COLOR0;
84+
#endif
85+
#ifdef SKINNING
86+
float4 indices : BLENDINDICES;
87+
float4 weights : BLENDWEIGHTS;
88+
#endif
7589
uint instanceID : SV_InstanceID;
7690
};
7791

@@ -80,7 +94,11 @@ VertexOutput VertexMain(Input input)
8094
{
8195
VertexOutput output;
8296

97+
#ifdef SKINNING
98+
float4x4 model = StapleGetSkinningMatrix(world, input.indices, input.weights);
99+
#else
83100
float4x4 model = world;
101+
#endif
84102

85103
float4x4 projectionViewWorld = ProjectionViewWorld(model);
86104
float4x4 viewWorld = ViewWorld(model);
@@ -93,8 +111,10 @@ VertexOutput VertexMain(Input input)
93111

94112
output.coords = input.coords;
95113
output.normal = input.normal;
114+
#ifdef NORMALMAP
96115
output.tangent = input.tangent;
97116
output.bitangent = input.bitangent;
117+
#endif
98118
output.lightNormal = StapleLightNormal(input.normal, model);
99119
output.instanceID = input.instanceID;
100120

@@ -110,7 +130,9 @@ VertexOutput VertexMain(Input input)
110130
output.color = input.color;
111131
#endif
112132
*/
133+
#if defined(VERTEX_COLORS) || defined(PER_VERTEX_LIGHTING)
113134
output.color = input.color;
135+
#endif
114136

115137
return output;
116138
}

Engine/Staple.Core/Rendering/Animation/SkinnedMeshRenderSystem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public void Process(Span<(Entity, Transform, IComponent)> entities, Camera activ
200200
.Add(VertexAttribute.TexCoord1, VertexAttributeType.Float4)
201201
.Add(VertexAttribute.TexCoord2, VertexAttributeType.Float4)
202202
.Add(VertexAttribute.TexCoord3, VertexAttributeType.Float4)
203-
.Build(), RenderBufferFlags.ComputeRead);
203+
.Build(), RenderBufferFlags.GraphicsRead);
204204
}
205205

206206
instance.transformUpdateTimer += Time.deltaTime;
@@ -323,7 +323,7 @@ void SetupMaterial()
323323

324324
renderState.shaderVariant = material.ShaderVariantKey;
325325

326-
renderState.readOnlyBuffers = [(SkinningBufferIndex, buffer)];
326+
renderState.storageBuffers = [(SkinningBufferIndex, buffer)];
327327

328328
RenderSystem.Submit(renderState, renderer.mesh.SubmeshTriangleCount(j), 1);
329329
}

Engine/Staple.Core/Rendering/Mesh/Mesh+Internal.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -690,12 +690,12 @@ internal static VertexLayout GetVertexLayout(Mesh mesh)
690690

691691
if(mesh.HasBoneIndices)
692692
{
693-
builder.Add(VertexAttribute.BoneIndices, VertexAttributeType.Float4);
693+
builder.Add(VertexAttribute.BlendIndices, VertexAttributeType.Float4);
694694
}
695695

696696
if(mesh.HasBoneWeights)
697697
{
698-
builder.Add(VertexAttribute.BoneWeight, VertexAttributeType.Float4);
698+
builder.Add(VertexAttribute.BlendWeights, VertexAttributeType.Float4);
699699
}
700700

701701
layout = builder.Build();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ void BeginRenderPass(RenderTarget target, CameraClearMode clear, Color clearColo
3232

3333
IShaderProgram CreateShaderVertexFragment(byte[] vertex, byte[] fragment,
3434
VertexFragmentShaderMetrics vertexMetrics, VertexFragmentShaderMetrics fragmentMetrics,
35-
VertexAttribute[] vertexAttributes, ShaderUniformContainer vertexUniforms, ShaderUniformContainer fragmentUniforms);
35+
ShaderUniformContainer vertexUniforms, ShaderUniformContainer fragmentUniforms);
3636

3737
IShaderProgram CreateShaderCompute(byte[] compute, ComputeShaderMetrics computeMetrics, ShaderUniformContainer uniforms);
3838

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,29 @@ state.indexBuffer is not SDLGPUIndexBuffer index ||
7474
SDL.BindGPUFragmentSamplers(renderPass, 0, samplers, (uint)samplers.Length);
7575
}
7676

77+
if((state.storageBuffers?.Length ?? 0) > 0)
78+
{
79+
var buffers = new List<nint>();
80+
81+
foreach(var buffer in state.storageBuffers)
82+
{
83+
if(buffer.Item2 == null ||
84+
buffer.Item2.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
85+
buffer.Item2.Disposed ||
86+
buffer.Item2 is not SDLGPUVertexBuffer v ||
87+
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
88+
resource.used == false ||
89+
resource.buffer == nint.Zero)
90+
{
91+
continue;
92+
}
93+
94+
buffers.Add(resource.buffer);
95+
}
96+
97+
SDL.BindGPUVertexStorageBuffers(renderPass, 0, buffers.ToArray(), (uint)buffers.Count);
98+
}
99+
77100
unsafe
78101
{
79102
foreach(var pair in vertexUniformData)

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,29 @@ program is not SDLGPUShaderProgram shader ||
8080
SDL.BindGPUFragmentSamplers(renderPass, 0, samplers, (uint)samplers.Length);
8181
}
8282

83+
if ((state.storageBuffers?.Length ?? 0) > 0)
84+
{
85+
var buffers = new List<nint>();
86+
87+
foreach (var buffer in state.storageBuffers)
88+
{
89+
if (buffer.Item2 == null ||
90+
buffer.Item2.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
91+
buffer.Item2.Disposed ||
92+
buffer.Item2 is not SDLGPUVertexBuffer v ||
93+
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
94+
resource.used == false ||
95+
resource.buffer == nint.Zero)
96+
{
97+
continue;
98+
}
99+
100+
buffers.Add(resource.buffer);
101+
}
102+
103+
SDL.BindGPUVertexStorageBuffers(renderPass, 0, buffers.ToArray(), (uint)buffers.Count);
104+
}
105+
83106
unsafe
84107
{
85108
foreach (var pair in vertexUniformData)

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,29 @@ program is not SDLGPUShaderProgram shader ||
8181
SDL.BindGPUFragmentSamplers(renderPass, 0, samplers, (uint)samplers.Length);
8282
}
8383

84+
if ((state.storageBuffers?.Length ?? 0) > 0)
85+
{
86+
var buffers = new List<nint>();
87+
88+
foreach (var buffer in state.storageBuffers)
89+
{
90+
if (buffer.Item2 == null ||
91+
buffer.Item2.Flags.HasFlag(RenderBufferFlags.GraphicsRead) == false ||
92+
buffer.Item2.Disposed ||
93+
buffer.Item2 is not SDLGPUVertexBuffer v ||
94+
backend.TryGetVertexBuffer(v.handle, out var resource) == false ||
95+
resource.used == false ||
96+
resource.buffer == nint.Zero)
97+
{
98+
continue;
99+
}
100+
101+
buffers.Add(resource.buffer);
102+
}
103+
104+
SDL.BindGPUVertexStorageBuffers(renderPass, 0, buffers.ToArray(), (uint)buffers.Count);
105+
}
106+
84107
unsafe
85108
{
86109
foreach (var pair in vertexUniformData)

0 commit comments

Comments
 (0)