diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index 0615144..3cd6605 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -185,23 +185,36 @@ namespace GlitchyEngine.Renderer } } + private void BindState() + { + Debug.Profiler.ProfileRendererFunction!(); + + BindInputLayout(); + + if (_hasVs) + NativeContext.VertexShader.SetConstantBuffers(0, _vsBuffers.Count, &_vsBuffers); + + if (_hasPs) + NativeContext.PixelShader.SetConstantBuffers(0, _psBuffers.Count, &_psBuffers); + } + public override void Draw(uint32 vertexCount, uint32 startVertexIndex = 0) { - BindInputLayout(); + BindState(); NativeContext.Draw(vertexCount, startVertexIndex); } public override void DrawIndexed(uint32 indexCount, uint32 startIndexLocation = 0, int32 vertexOffset = 0) { - BindInputLayout(); + BindState(); NativeContext.DrawIndexed(indexCount, startIndexLocation, vertexOffset); } public override void DrawIndexedInstanced(uint32 indexCountPerInstance, uint32 instanceCount, uint32 startIndexLocation, int32 baseVertexLocation, uint32 startInstanceLocation) { - BindInputLayout(); + BindState(); NativeContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation); } @@ -236,6 +249,12 @@ namespace GlitchyEngine.Renderer private uint32 _vs_FirstTexture; private uint32 _vs_BoundTextures; + private bool _hasPs; + private bool _hasVs; + + private ID3D11Buffer*[DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] _vsBuffers; + private ID3D11Buffer*[DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] _psBuffers; + /** * Binds the given shader to the corresponding shader stage. * @param shader The shader that will be bound to the graphics context. @@ -250,7 +269,7 @@ namespace GlitchyEngine.Renderer ID3D11ShaderResourceView*[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] _textures = .(); ID3D11SamplerState*[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] _samplers = .(); - for (let entry in shader.Textures) + for (let entry in shader?.Textures) { _textures[entry.Index] = entry.BoundTexture._nativeShaderResourceView; _samplers[entry.Index] = entry.BoundTexture._nativeSamplerState; @@ -263,51 +282,62 @@ namespace GlitchyEngine.Renderer shader.Buffers.PlatformFetchNativeBuffers(); - //if (_textureCount > 0) - //{ - switch (typeof(TShader)) + switch (typeof(TShader)) + { + // TODO: Add remaining shader stages + case typeof(PixelShader): + _hasPs = shader != null; + + // TODO: bind uavs + if (_textureCount > 0) { - // TODO: Add remaining shader stages - case typeof(PixelShader): - // TODO: bind uavs - if (_textureCount > 0) - { - NativeContext.PixelShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]); - NativeContext.PixelShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]); - } - - _ps_FirstTexture = _firstTexture; - _ps_BoundTextures = _textureCount; - - NativeContext.PixelShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers); - - NativeContext.PixelShader.SetShader((ID3D11PixelShader*)shader.nativeShader); - - case typeof(VertexShader): - if (_textureCount > 0) - { - NativeContext.VertexShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]); - NativeContext.VertexShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]); - } - - NativeContext.VertexShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers); - - NativeContext.VertexShader.SetShader((ID3D11VertexShader*)shader.nativeShader); - - _vs_FirstTexture = _firstTexture; - _vs_BoundTextures = _textureCount; - - //if (VertexShader vs = shader as VertexShader) - [ConstSkip] - { - SetReference!(_currentVertexShader, shader); - _currentInputLayout?.Release(); - _currentInputLayout = null; - } - default: - Runtime.FatalError(scope $"Shader stage \"{typeof(TShader)}\" not implemented."); + NativeContext.PixelShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]); + NativeContext.PixelShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]); } - //} + + _ps_FirstTexture = _firstTexture; + _ps_BoundTextures = _textureCount; + + for (var buffer in shader?.Buffers) + { + _psBuffers[buffer.Index] = buffer.Buffer.nativeBuffer; + } + + //NativeContext.PixelShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers); + + NativeContext.PixelShader.SetShader((ID3D11PixelShader*)shader?.nativeShader); + + case typeof(VertexShader): + _hasVs = shader != null; + + if (_textureCount > 0) + { + NativeContext.VertexShader.SetShaderResources(_firstTexture, _textureCount, &_textures[_firstTexture]); + NativeContext.VertexShader.SetSamplers(_firstTexture, _textureCount, &_samplers[_firstTexture]); + } + + for (var buffer in shader?.Buffers) + { + _vsBuffers[buffer.Index] = buffer.Buffer.nativeBuffer; + } + + //NativeContext.VertexShader.SetConstantBuffers(0, shader.Buffers.nativeBuffers.Count, &shader.Buffers.nativeBuffers); + + NativeContext.VertexShader.SetShader((ID3D11VertexShader*)shader?.nativeShader); + + _vs_FirstTexture = _firstTexture; + _vs_BoundTextures = _textureCount; + + //if (VertexShader vs = shader as VertexShader) + [ConstSkip] + { + SetReference!(_currentVertexShader, shader); + _currentInputLayout?.Release(); + _currentInputLayout = null; + } + default: + Runtime.FatalError(scope $"Shader stage \"{typeof(TShader)}\" not implemented."); + } } public override void UnbindTextures() @@ -327,6 +357,21 @@ namespace GlitchyEngine.Renderer { BindShaderToStage(pixelShader); } + + public override void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage) + { + Debug.Assert((slot >= 0) && (slot < DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)); + + if (stage.HasFlag(.Vertex)) + { + _vsBuffers[slot] = buffer.nativeBuffer; + } + + if (stage.HasFlag(.Pixel)) + { + _psBuffers[slot] = buffer.nativeBuffer; + } + } } } diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf index d3a8516..7042772 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf @@ -249,6 +249,11 @@ namespace GlitchyEngine.Renderer { _context.UnbindTextures(); } + + public override void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage) + { + _context.BindConstantBuffer(buffer, slot, stage); + } } } diff --git a/GlitchyEngine/src/Renderer/GraphicsContext.bf b/GlitchyEngine/src/Renderer/GraphicsContext.bf index 5225707..4819ec7 100644 --- a/GlitchyEngine/src/Renderer/GraphicsContext.bf +++ b/GlitchyEngine/src/Renderer/GraphicsContext.bf @@ -98,16 +98,9 @@ namespace GlitchyEngine.Renderer } [Inline] - public void SetViewports(Viewport[] viewports) + public void SetViewports(Span viewports) { - SetViewports((.)viewports.Count, viewports.CArray()); - } - - [Inline] - public void SetViewports(Viewport[CSize] viewports) where CSize : const uint32 - { - var viewports; - SetViewports(CSize, &viewports); + SetViewports((.)viewports.Length, viewports.Ptr); } public extern void SetViewports(uint32 viewportsLength, Viewport* viewports); @@ -121,5 +114,7 @@ namespace GlitchyEngine.Renderer public extern void SetPixelShader(PixelShader pixelShader); public extern void UnbindTextures(); + + public extern void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage); } } diff --git a/GlitchyEngine/src/Renderer/RenderCommand.bf b/GlitchyEngine/src/Renderer/RenderCommand.bf index 77bac6d..6525799 100644 --- a/GlitchyEngine/src/Renderer/RenderCommand.bf +++ b/GlitchyEngine/src/Renderer/RenderCommand.bf @@ -121,5 +121,10 @@ namespace GlitchyEngine.Renderer { _rendererAPI.UnbindTextures(); } + + public static void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage) + { + _rendererAPI.BindConstantBuffer(buffer, slot, stage); + } } } diff --git a/GlitchyEngine/src/Renderer/Renderer.bf b/GlitchyEngine/src/Renderer/Renderer.bf index dc486d1..8a5910c 100644 --- a/GlitchyEngine/src/Renderer/Renderer.bf +++ b/GlitchyEngine/src/Renderer/Renderer.bf @@ -302,12 +302,13 @@ namespace GlitchyEngine.Renderer RenderCommand.SetBlendState(_gBufferBlend); + for (SubmittedMesh entry in _queue) { Debug.Profiler.ProfileRendererScope!("Draw Mesh"); { - Debug.Profiler.ProfileRendererScope!("SetVariables"); + Debug.Profiler.ProfileRendererScope!("Update object buffer"); ObjectConstantsBuffer objectData; objectData.Transform = entry.Transform; @@ -318,21 +319,12 @@ namespace GlitchyEngine.Renderer objectData.EntityId = entry.EntityId; _objectBuffer.SetData(objectData, 0, .WriteDiscard); - - entry.Material.Effect.Buffers.TryReplaceBuffer("SceneConstants", _sceneBuffer); - entry.Material.Effect.Buffers.TryReplaceBuffer("ObjectConstants", _objectBuffer); - - /*entry.Material.SetVariable("ViewProjection", _sceneConstants.ViewProjection); - - entry.Material.SetVariable("Transform", entry.Transform); - - entry.Material.SetVariable("EntityId", entry.EntityId); - - Matrix3x3 mat = (Matrix3x3)(entry.Transform).Invert().Transpose(); - entry.Material.SetVariable("Transform_InvT", mat);*/ } entry.Material.Bind(_context); + + RenderCommand.BindConstantBuffer(_sceneBuffer, 0, .All); + RenderCommand.BindConstantBuffer(_objectBuffer, 1, .All); entry.Mesh.Bind(); RenderCommand.DrawIndexed(entry.Mesh); diff --git a/GlitchyEngine/src/Renderer/RendererAPI.bf b/GlitchyEngine/src/Renderer/RendererAPI.bf index e4183ac..fa815aa 100644 --- a/GlitchyEngine/src/Renderer/RendererAPI.bf +++ b/GlitchyEngine/src/Renderer/RendererAPI.bf @@ -62,5 +62,7 @@ namespace GlitchyEngine.Renderer public extern void SetViewport(Viewport viewport); public extern void UnbindTextures(); + + public extern void BindConstantBuffer(Buffer buffer, int slot, ShaderStage stage); } } diff --git a/GlitchyEngine/src/Renderer/ShaderStage.bf b/GlitchyEngine/src/Renderer/ShaderStage.bf new file mode 100644 index 0000000..9721776 --- /dev/null +++ b/GlitchyEngine/src/Renderer/ShaderStage.bf @@ -0,0 +1,12 @@ +using System; +namespace GlitchyEngine.Renderer +{ + [AllowDuplicates] + public enum ShaderStage + { + Vertex = 1, + Pixel = 2, + + All = Vertex | Pixel + } +} \ No newline at end of file