Skip to content

Commit 1d5e93d

Browse files
[Rendering] Fixes to render states;
1 parent 04fa063 commit 1d5e93d

File tree

14 files changed

+130
-239
lines changed

14 files changed

+130
-239
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,6 @@ void SetupMaterial()
321321

322322
var buffer = instance.boneBuffer;
323323

324-
renderState.shader = material.shader;
325-
326-
renderState.shaderVariant = material.ShaderVariantKey;
327-
328324
renderState.storageBuffers = [(0, buffer)];
329325

330326
RenderSystem.Submit(renderState, renderer.mesh.SubmeshTriangleCount(j), 1);

Engine/Staple.Core/Rendering/Graphics.cs

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -60,28 +60,25 @@ public static void RenderGeometry(VertexBuffer vertex, IndexBuffer index,
6060
}
6161
else
6262
{
63-
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
64-
6563
material.DisableShaderKeyword(Shader.SkinningKeyword);
6664

6765
material.DisableShaderKeyword(Shader.InstancingKeyword);
66+
67+
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
6868
}
6969

7070
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
7171

7272
lightSystem?.ApplyMaterialLighting(material, lighting);
7373

74-
var program = material.ShaderProgram;
75-
76-
if(program != null)
74+
if (material.ShaderProgram == null)
7775
{
78-
renderState.shader = material.shader;
79-
renderState.shaderVariant = material.ShaderVariantKey;
76+
return;
77+
}
8078

81-
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
79+
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
8280

83-
RenderSystem.Submit(renderState, Mesh.TriangleCount(topology, indexCount), 1);
84-
}
81+
RenderSystem.Submit(renderState, Mesh.TriangleCount(topology, indexCount), 1);
8582
}
8683

8784
public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, Span<ushort> indices, Material material, Vector3 position,
@@ -119,16 +116,11 @@ public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, Span<u
119116

120117
lightSystem?.ApplyMaterialLighting(material, lighting);
121118

122-
var program = material.ShaderProgram;
123-
124-
if (program == null)
119+
if (material.ShaderProgram == null)
125120
{
126121
return;
127122
}
128123

129-
renderState.shader = material.shader;
130-
renderState.shaderVariant = material.ShaderVariantKey;
131-
132124
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
133125

134126
RenderSystem.Backend.RenderTransient(vertices, layout, indices, renderState);
@@ -158,27 +150,22 @@ public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, Span<u
158150
}
159151
else
160152
{
161-
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
162-
163153
material.DisableShaderKeyword(Shader.SkinningKeyword);
164154

165155
material.DisableShaderKeyword(Shader.InstancingKeyword);
156+
157+
material.ApplyProperties(Material.ApplyMode.All, ref renderState);
166158
}
167159

168160
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
169161

170162
lightSystem?.ApplyMaterialLighting(material, lighting);
171163

172-
var program = material.ShaderProgram;
173-
174-
if (program == null)
164+
if (material.ShaderProgram == null)
175165
{
176166
return;
177167
}
178168

179-
renderState.shader = material.shader;
180-
renderState.shaderVariant = material.ShaderVariantKey;
181-
182169
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
183170

184171
RenderSystem.Backend.RenderTransient(vertices, layout, indices, renderState);

Engine/Staple.Core/Rendering/Material.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1065,11 +1065,17 @@ internal ShaderHandle GetShaderHandle(StringID name)
10651065
/// <param name="state">The render state to apply to</param>
10661066
internal void ApplyProperties(ApplyMode applyMode, ref RenderState state)
10671067
{
1068-
if(shader == null)
1068+
if(shader == null ||
1069+
shader.instances.TryGetValue(ShaderVariantKey, out var shaderInstance) == false)
10691070
{
1071+
state.shader = null;
1072+
state.shaderInstance = null;
1073+
10701074
return;
10711075
}
10721076

1077+
state.shader = shader;
1078+
state.shaderInstance = shaderInstance;
10731079
state.sourceBlend = shader.sourceBlend;
10741080
state.destinationBlend = shader.destinationBlend;
10751081
state.cull = CullingMode;

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,9 +368,6 @@ void SetupMaterial()
368368

369369
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
370370

371-
renderState.shader = material.shader;
372-
renderState.shaderVariant = material.ShaderVariantKey;
373-
374371
RenderSystem.Submit(renderState, mesh.SubmeshTriangleCount(0), 1);
375372
}
376373
}

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,14 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
9191

9292
lightSystem?.ApplyMaterialLighting(material, lighting);
9393

94-
var program = material.ShaderProgram;
95-
96-
if (program != null)
94+
if (material.ShaderProgram == null)
9795
{
98-
renderState.shader = material.shader;
99-
renderState.shaderVariant = material.ShaderVariantKey;
96+
return;
97+
}
10098

101-
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
99+
lightSystem?.ApplyLightProperties(material, RenderSystem.CurrentCamera.Item2.Position, lighting);
102100

103-
RenderSystem.Submit(renderState, Mesh.TriangleCount(mesh.MeshTopology, mesh.IndexCount), 1);
104-
}
101+
RenderSystem.Submit(renderState, Mesh.TriangleCount(mesh.MeshTopology, mesh.IndexCount), 1);
105102
}
106103

107104
public void Preprocess(Span<RenderEntry> renderQueue, Camera activeCamera, Transform activeCameraTransform)
@@ -355,9 +352,6 @@ public void Submit()
355352

356353
if(program != null)
357354
{
358-
renderState.shader = material.shader;
359-
renderState.shaderVariant = material.ShaderVariantKey;
360-
361355
RenderSystem.Submit(renderState, renderData.mesh.SubmeshTriangleCount(content.submeshIndex), 1);
362356
}
363357
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,27 @@
33

44
namespace Staple.Internal;
55

6-
internal class SDLGPURenderCommand(RenderState state, nint pipeline, SDL.GPUTextureSamplerBinding[] vertexSamplers,
7-
SDL.GPUTextureSamplerBinding[] fragmentSamplers, List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData,
8-
List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData, SDLGPUShaderProgram program) : IRenderCommand
6+
internal class SDLGPURenderCommand(RenderState state, nint pipeline, Texture[] vertexTextures, Texture[] fragmentTextures,
7+
List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData, List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData, SDLGPUShaderProgram program) : IRenderCommand
98
{
109
public RenderState state = state;
1110
public nint pipeline = pipeline;
12-
public SDL.GPUTextureSamplerBinding[] vertexSamplers = vertexSamplers;
13-
public SDL.GPUTextureSamplerBinding[] fragmentSamplers = fragmentSamplers;
11+
public Texture[] vertexTextures = (Texture[])vertexTextures?.Clone();
12+
public Texture[] fragmentTextures = (Texture[])fragmentTextures?.Clone();
1413
public List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData = vertexUniformData;
1514
public List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData = fragmentUniformData;
1615
public SDLGPUShaderProgram program = program;
1716

1817
public void Update(IRendererBackend rendererBackend)
1918
{
2019
var backend = (SDLGPURendererBackend)rendererBackend;
21-
var shaderInstance = state.shader.instances.TryGetValue(state.shaderVariant, out var sv) ? sv : null;
2220
var vertex = (SDLGPUVertexBuffer)state.vertexBuffer;
2321
var index = (SDLGPUIndexBuffer)state.indexBuffer;
2422

2523
if (backend.TryGetVertexBuffer(vertex.handle, out var vertexBuffer) == false ||
26-
backend.TryGetIndexBuffer(index.handle, out var indexBuffer) == false)
24+
backend.TryGetIndexBuffer(index.handle, out var indexBuffer) == false ||
25+
backend.TryGetTextureSamplers(vertexTextures, fragmentTextures, state.shaderInstance,
26+
out var vertexSamplers, out var fragmentSamplers) == false)
2727
{
2828
return;
2929
}
@@ -103,7 +103,7 @@ buffer.Item2 is not SDLGPUVertexBuffer v ||
103103
var bufferArray = buffers.ToArray();
104104

105105
SDL.BindGPUVertexStorageBuffers(renderPass,
106-
(uint)(shaderInstance.vertexShaderMetrics.samplerCount + shaderInstance.vertexShaderMetrics.storageTextureCount),
106+
(uint)(state.shaderInstance.vertexShaderMetrics.samplerCount + state.shaderInstance.vertexShaderMetrics.storageTextureCount),
107107
bufferArray, (uint)buffers.Count);
108108
}
109109
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@
44

55
namespace Staple.Internal;
66

7-
internal class SDLGPURenderTransientCommand(RenderState state, nint pipeline,
8-
SDL.GPUTextureSamplerBinding[] vertexSamplers, SDL.GPUTextureSamplerBinding[] fragmentSamplers,
7+
internal class SDLGPURenderTransientCommand(RenderState state, nint pipeline, Texture[] vertexTextures, Texture[] fragmentTextures,
98
List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData, List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData,
109
SDLGPUShaderProgram program, SDLGPURendererBackend.TransientEntry entry) : IRenderCommand
1110
{
1211
public RenderState state = state;
1312
public nint pipeline = pipeline;
14-
public SDL.GPUTextureSamplerBinding[] vertexSamplers = vertexSamplers;
15-
public SDL.GPUTextureSamplerBinding[] fragmentSamplers = fragmentSamplers;
1613
public SDLGPURendererBackend.TransientEntry entry = entry;
14+
public Texture[] vertexTextures = (Texture[])vertexTextures?.Clone();
15+
public Texture[] fragmentTextures = (Texture[])fragmentTextures?.Clone();
1716
public List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData = vertexUniformData;
1817
public List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData = fragmentUniformData;
1918
public SDLGPUShaderProgram program = program;
2019

2120
public void Update(IRendererBackend rendererBackend)
2221
{
2322
var backend = (SDLGPURendererBackend)rendererBackend;
24-
var shaderInstance = state.shader.instances.TryGetValue(state.shaderVariant, out var sv) ? sv : null;
2523

26-
if (entry.vertexBuffer == nint.Zero)
24+
if (entry.vertexBuffer == nint.Zero ||
25+
backend.TryGetTextureSamplers(vertexTextures, fragmentTextures, state.shaderInstance,
26+
out var vertexSamplers, out var fragmentSamplers) == false)
2727
{
2828
return;
2929
}
@@ -111,7 +111,7 @@ buffer.Item2 is not SDLGPUVertexBuffer v ||
111111
var bufferArray = buffers.ToArray();
112112

113113
SDL.BindGPUVertexStorageBuffers(renderPass,
114-
(uint)(shaderInstance.vertexShaderMetrics.samplerCount + shaderInstance.vertexShaderMetrics.storageTextureCount),
114+
(uint)(state.shaderInstance.vertexShaderMetrics.samplerCount + state.shaderInstance.vertexShaderMetrics.storageTextureCount),
115115
bufferArray, (uint)buffers.Count);
116116
}
117117
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,26 @@
33

44
namespace Staple.Internal;
55

6-
internal class SDLGPURenderTransientUIntCommand(RenderState state, nint pipeline,
7-
SDL.GPUTextureSamplerBinding[] vertexSamplers, SDL.GPUTextureSamplerBinding[] fragmentSamplers,
6+
internal class SDLGPURenderTransientUIntCommand(RenderState state, nint pipeline, Texture[] vertexTextures, Texture[] fragmentTextures,
87
List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData, List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData,
98
SDLGPUShaderProgram program, SDLGPURendererBackend.TransientEntry entry) : IRenderCommand
109
{
1110
public RenderState state = state;
1211
public nint pipeline = pipeline;
13-
public SDL.GPUTextureSamplerBinding[] vertexSamplers = vertexSamplers;
14-
public SDL.GPUTextureSamplerBinding[] fragmentSamplers = fragmentSamplers;
1512
public SDLGPURendererBackend.TransientEntry entry = entry;
13+
public Texture[] vertexTextures = (Texture[])vertexTextures?.Clone();
14+
public Texture[] fragmentTextures = (Texture[])fragmentTextures?.Clone();
1615
public List<SDLGPURendererBackend.StapleShaderUniform> vertexUniformData = vertexUniformData;
1716
public List<SDLGPURendererBackend.StapleShaderUniform> fragmentUniformData = fragmentUniformData;
1817
public SDLGPUShaderProgram program = program;
1918

2019
public void Update(IRendererBackend rendererBackend)
2120
{
2221
var backend = (SDLGPURendererBackend)rendererBackend;
23-
var shaderInstance = state.shader.instances.TryGetValue(state.shaderVariant, out var sv) ? sv : null;
2422

25-
if (entry.vertexBuffer == nint.Zero)
23+
if (entry.vertexBuffer == nint.Zero ||
24+
backend.TryGetTextureSamplers(vertexTextures, fragmentTextures, state.shaderInstance,
25+
out var vertexSamplers, out var fragmentSamplers) == false)
2626
{
2727
return;
2828
}
@@ -110,7 +110,7 @@ buffer.Item2 is not SDLGPUVertexBuffer v ||
110110
var bufferArray = buffers.ToArray();
111111

112112
SDL.BindGPUVertexStorageBuffers(renderPass,
113-
(uint)(shaderInstance.vertexShaderMetrics.samplerCount + shaderInstance.vertexShaderMetrics.storageTextureCount),
113+
(uint)(state.shaderInstance.vertexShaderMetrics.samplerCount + state.shaderInstance.vertexShaderMetrics.storageTextureCount),
114114
bufferArray, (uint)buffers.Count);
115115
}
116116
}

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,4 +992,52 @@ public static bool TryGetTextureFormat(TextureFormat format, TextureFlags flags,
992992

993993
return false;
994994
}
995+
996+
internal bool TryGetTextureSamplers(Texture[] vertexTextures, Texture[] fragmentTextures, Shader.ShaderInstance instance,
997+
out SDL.GPUTextureSamplerBinding[] vertexSamplers, out SDL.GPUTextureSamplerBinding[] fragmentSamplers)
998+
{
999+
var vertexSamplerCount = instance.vertexTextureBindings.Count;
1000+
var fragmentSamplerCount = instance.fragmentTextureBindings.Count;
1001+
1002+
vertexSamplers = vertexSamplerCount > 0 ? new SDL.GPUTextureSamplerBinding[vertexSamplerCount] : null;
1003+
fragmentSamplers = fragmentSamplerCount > 0 ? new SDL.GPUTextureSamplerBinding[fragmentSamplerCount] : null;
1004+
1005+
if (vertexSamplers != null)
1006+
{
1007+
for (var i = 0; i < vertexSamplers.Length; i++)
1008+
{
1009+
if (vertexTextures[i]?.impl is not SDLGPUTexture texture ||
1010+
texture.Disposed ||
1011+
TryGetTexture(texture.handle, out var resource) == false)
1012+
{
1013+
vertexSamplers = fragmentSamplers = default;
1014+
1015+
return false;
1016+
}
1017+
1018+
vertexSamplers[i].Texture = resource.texture;
1019+
vertexSamplers[i].Sampler = GetSampler(texture.flags);
1020+
}
1021+
}
1022+
1023+
if (fragmentSamplers != null)
1024+
{
1025+
for (var i = 0; i < fragmentSamplers.Length; i++)
1026+
{
1027+
if (fragmentTextures[i]?.impl is not SDLGPUTexture texture ||
1028+
texture.Disposed ||
1029+
TryGetTexture(texture.handle, out var resource) == false)
1030+
{
1031+
vertexSamplers = fragmentSamplers = default;
1032+
1033+
return false;
1034+
}
1035+
1036+
fragmentSamplers[i].Texture = resource.texture;
1037+
fragmentSamplers[i].Sampler = GetSampler(texture.flags);
1038+
}
1039+
}
1040+
1041+
return true;
1042+
}
9951043
}

0 commit comments

Comments
 (0)