From ae290936b9293b9111e0a4a553a4cd3901687235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sun, 30 May 2021 19:37:23 +0200 Subject: [PATCH] Added basic support for instanced rendering --- .../src/Platform/DX11/Renderer/Dx11RendererAPI.bf | 7 +++++++ .../src/Platform/DX11/Renderer/Dx11VertexLayout.bf | 2 +- GlitchyEngine/src/Renderer/GeometryBinding.bf | 9 +++++++++ GlitchyEngine/src/Renderer/RenderCommand.bf | 6 ++++++ GlitchyEngine/src/Renderer/RendererAPI.bf | 4 ++++ GlitchyEngine/src/Renderer/VertexBuffer.bf | 4 ++-- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf index bdaa2cd..0eab23a 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf @@ -2,6 +2,8 @@ using GlitchyEngine.Math; namespace GlitchyEngine.Renderer { + using internal GlitchyEngine.Renderer; + extension RendererAPI { private GraphicsContext _context; @@ -28,5 +30,10 @@ namespace GlitchyEngine.Renderer { _context.DrawIndexed(geometry.IndexCount, geometry.IndexByteOffset, 0); } + + public override void DrawIndexedInstanced(GeometryBinding geometry) + { + _context.nativeContext.DrawIndexedInstanced(geometry.IndexCount, geometry.InstanceCount, geometry.IndexByteOffset, 0, 0); + } } } diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf index bcea626..28c3e6c 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf @@ -28,7 +28,7 @@ namespace GlitchyEngine.Renderer Debug.Assert(input.Count == output.Count); for(int i < input.Count) - output[i] = .(input[i].SemanticName, input[i].SemanticIndex, input[i].Format, input[i].InputSlot, input[i].AlignedByteOffset, (.)input[i].InputSlotClass); + output[i] = .(input[i].SemanticName, input[i].SemanticIndex, input[i].Format, input[i].InputSlot, input[i].AlignedByteOffset, (.)input[i].InputSlotClass, input[i].InstanceDataStepRate); } protected override void CreateNativeLayout() diff --git a/GlitchyEngine/src/Renderer/GeometryBinding.bf b/GlitchyEngine/src/Renderer/GeometryBinding.bf index f2be3ed..608be58 100644 --- a/GlitchyEngine/src/Renderer/GeometryBinding.bf +++ b/GlitchyEngine/src/Renderer/GeometryBinding.bf @@ -12,6 +12,7 @@ namespace GlitchyEngine.Renderer internal VertexLayout _vertexLayout; internal uint32 _indexByteOffset; internal uint32 _indexCount; + internal uint32 _instanceCount; internal PrimitiveTopology _primitiveTopology; public this(GraphicsContext context) @@ -50,6 +51,14 @@ namespace GlitchyEngine.Renderer [Inline] public uint32 IndexCount => _indexCount; + public uint32 InstanceCount + { + [Inline] + get => _instanceCount; + [Inline] + set => _instanceCount = value; + } + [Inline] public PrimitiveTopology PrimitiveTopology => _primitiveTopology; diff --git a/GlitchyEngine/src/Renderer/RenderCommand.bf b/GlitchyEngine/src/Renderer/RenderCommand.bf index f7569fd..be63ac0 100644 --- a/GlitchyEngine/src/Renderer/RenderCommand.bf +++ b/GlitchyEngine/src/Renderer/RenderCommand.bf @@ -30,5 +30,11 @@ namespace GlitchyEngine.Renderer { _rendererAPI.DrawIndexed(geometry); } + + [Inline] + public static void DrawIndexedInstanced(GeometryBinding geometry) + { + _rendererAPI.DrawIndexedInstanced(geometry); + } } } diff --git a/GlitchyEngine/src/Renderer/RendererAPI.bf b/GlitchyEngine/src/Renderer/RendererAPI.bf index 8c1a03b..12569cd 100644 --- a/GlitchyEngine/src/Renderer/RendererAPI.bf +++ b/GlitchyEngine/src/Renderer/RendererAPI.bf @@ -20,5 +20,9 @@ namespace GlitchyEngine.Renderer public extern void Clear(RenderTarget renderTarget, ColorRGBA clearColor); public extern void DrawIndexed(GeometryBinding geometry); + + public extern void DrawInstanced(GeometryBinding geometry); + + public extern void DrawIndexedInstanced(GeometryBinding geometry); } } diff --git a/GlitchyEngine/src/Renderer/VertexBuffer.bf b/GlitchyEngine/src/Renderer/VertexBuffer.bf index 0107b53..4f7c6e1 100644 --- a/GlitchyEngine/src/Renderer/VertexBuffer.bf +++ b/GlitchyEngine/src/Renderer/VertexBuffer.bf @@ -30,14 +30,14 @@ namespace GlitchyEngine.Renderer _vertexType = vertexType; _description = .(){ - Size = ((uint32)_vertexType.Size * vertexCount), + Size = ((uint32)_vertexType.Stride * vertexCount), Usage = usage, CPUAccess = cpuAccess, BindFlags = .Vertex, MiscFlags = .None }; - _defaultBinding = .(this, (.)_vertexType.Size, 0); + _defaultBinding = .(this, (.)_vertexType.Stride, 0); } [Inline]