From 9a010f7c4a986b5badd0aab4fa4d2dd186e6eca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Wed, 30 Dec 2020 14:47:29 +0100 Subject: [PATCH] Added Buffers to Shaders --- GlitchyEngine/src/Application.bf | 10 +- .../src/Platform/DX11/Renderer/Dx11Buffer.bf | 5 - .../DX11/Renderer/Dx11BufferCollection.bf | 19 +++ .../DX11/Renderer/Dx11GraphicsContext.bf | 3 +- .../Platform/DX11/Renderer/Dx11PixelShader.bf | 14 +- GlitchyEngine/src/Renderer/Buffer.bf | 2 +- .../src/Renderer/BufferCollection.bf | 136 ++++++++++++++++++ GlitchyEngine/src/Renderer/Shader.bf | 7 + 8 files changed, 183 insertions(+), 13 deletions(-) create mode 100644 GlitchyEngine/src/Platform/DX11/Renderer/Dx11BufferCollection.bf create mode 100644 GlitchyEngine/src/Renderer/BufferCollection.bf diff --git a/GlitchyEngine/src/Application.bf b/GlitchyEngine/src/Application.bf index 6d447c8..6e81a1e 100644 --- a/GlitchyEngine/src/Application.bf +++ b/GlitchyEngine/src/Application.bf @@ -87,7 +87,7 @@ namespace GlitchyEngine private void MakeTestTriangle() { _vertexShader = Shader.FromFile!(_window.Context, "content\\basicShader.hlsl", "VS"); - + // Create Input Layout _vertexLayout = new VertexLayout(_window.Context, new .( @@ -100,12 +100,15 @@ namespace GlitchyEngine // _pixelShader = Shader.FromFile!(_window.Context, "content\\basicShader.hlsl", "PS"); - _pixelShader.[Friend]_buffers = new .[1]; + + //Todo: _pixelShader.[Friend]_buffers = new .[1]; _cBuffer = new Buffer(_window.Context, .(0, .Constant, .Immutable, .None)); _cBuffer.Data = .White; _cBuffer.Update(); + _pixelShader.Buffers.ReplaceBuffer("Constants", _cBuffer); + float pO3 = Math.PI_f / 3.0f; VertexColor[?] vertices = .( VertexColor(.Zero, Color(255,255,255)), @@ -171,15 +174,12 @@ namespace GlitchyEngine _window.Context.SetPrimitiveTopology(.TriangleList); - var _immediateContext = _window.Context.[Friend]nativeContext; - _window.Context.SetVertexShader(_vertexShader); _window.Context.SetRasterizerState(_rasterizerState); _window.Context.SetViewport(Window.Context.SwapChain.BackbufferViewport); - _immediateContext.PixelShader.SetConstantBuffers(0, 1, &_cBuffer.[Friend]nativeBuffer); _window.Context.SetPixelShader(_pixelShader); _window.Context.DrawIndexed(3 * 6); diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf index e603d22..81361bb 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf @@ -127,9 +127,4 @@ namespace GlitchyEngine.Renderer return .Ok; } } - - public extension VertexBuffer - { - - } } diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11BufferCollection.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11BufferCollection.bf new file mode 100644 index 0000000..fb939f6 --- /dev/null +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11BufferCollection.bf @@ -0,0 +1,19 @@ +using DirectX.D3D11; + +using internal GlitchyEngine.Renderer; + +namespace GlitchyEngine.Renderer +{ + extension BufferCollection + { + internal ID3D11Buffer*[DirectX.D3D11.D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] nativeBuffers; + + internal void PlatformFetchNativeBuffers() + { + for(let buffer in _buffers) + { + nativeBuffers[buffer.Index] = buffer.Buffer.nativeBuffer; + } + } + } +} diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index bcfc566..9b96b4f 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -177,7 +177,8 @@ namespace GlitchyEngine.Renderer public override void SetPixelShader(PixelShader pixelShader) { //Todo: nativeContext.PixelShader.SetSamplers(); - //Todo: nativeContext.PixelShader.SetConstantBuffers(); + pixelShader.Buffers.PlatformFetchNativeBuffers(); + nativeContext.PixelShader.SetConstantBuffers(0, pixelShader.Buffers.nativeBuffers.Count, &pixelShader.Buffers.nativeBuffers); //Todo: nativeContext.PixelShader.SetShaderResources(); nativeContext.PixelShader.SetShader(pixelShader.nativeShader); } diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf index 6839f1b..80eb19e 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf @@ -3,6 +3,7 @@ using DirectX.D3D11; using DirectX.D3DCompiler; using DirectX.D3D11Shader; using DirectX.Common; +using System.Diagnostics; using internal GlitchyEngine.Renderer; @@ -30,7 +31,7 @@ namespace GlitchyEngine.Renderer Log.EngineLogger.Error($"Failed to create pixel shader: Message ({(int)result}): {result}"); } - //Reflect(shaderBlob); + Reflect(shaderBlob); shaderBlob?.Release(); } @@ -49,8 +50,19 @@ namespace GlitchyEngine.Renderer for(uint32 i < cBufferCount) { + reflection.GetResourceBindingDescription(i, let bindDesc); + var bufferReflection = reflection.GetConstantBufferByIndex(i); + bufferReflection.GetDescription(let bufferDesc); + + // ConstantBuffer + if(bufferDesc.Type == .D3D11_CT_CBUFFER) + { + GlitchyEngine.Renderer.BufferDescription cBufferDesc = .(bufferDesc.Size, .Constant, .Dynamic, .Write); + + _buffers.Add(bindDesc.BindPoint, StringView(bufferDesc.Name), new Buffer(_context, cBufferDesc), true); + } } reflection.Release(); } diff --git a/GlitchyEngine/src/Renderer/Buffer.bf b/GlitchyEngine/src/Renderer/Buffer.bf index 5520046..da7854a 100644 --- a/GlitchyEngine/src/Renderer/Buffer.bf +++ b/GlitchyEngine/src/Renderer/Buffer.bf @@ -202,7 +202,7 @@ namespace GlitchyEngine.Renderer // Todo: perhaps add a constructor that takes all parameters from description except Size /** - * Uploads the date from @see Data to the GPU. + * Uploads the date to the GPU. */ [Inline] public void Update() diff --git a/GlitchyEngine/src/Renderer/BufferCollection.bf b/GlitchyEngine/src/Renderer/BufferCollection.bf new file mode 100644 index 0000000..53e6122 --- /dev/null +++ b/GlitchyEngine/src/Renderer/BufferCollection.bf @@ -0,0 +1,136 @@ +using System; +using System.Collections; + +namespace GlitchyEngine.Renderer +{ + public class BufferCollection + { + typealias BufferEntry = (String Name, int Index, Buffer Buffer, bool OwnsBuffer); + + List _buffers ~ delete _; + + Dictionary _strToBuf ~ delete _; + Dictionary _idxToBuf ~ delete _; + + //[AllowAppend] + public this() + { + /*List buffers = append .(); + Dictionary strToBuf = append .(); + Dictionary idxToBuf = append .(); + + _buffers = buffers; + _strToBuf = strToBuf; + _idxToBuf = idxToBuf; + */ + + _buffers = new .(); + _strToBuf = new .(); + _idxToBuf = new .(); + } + + public ~this() + { + for(let entry in _buffers) + { + delete entry.Name; + if(entry.OwnsBuffer) + delete entry.Buffer; + } + } + + public Buffer this[int idx] => _idxToBuf[idx]; + public Buffer this[StringView name] => _strToBuf[name]; + + /** + * Replaces the buffer with the given index. + * @param idx The index (shader buffer register) of the buffer to replace. + * @param buffer The new buffer. + * @param If set to true, the Collection will take ownership of the buffer; if false, the ownership will remain with the caller. + */ + public void ReplaceBuffer(int idx, Buffer buffer, bool passOwnership = false) + { + if(_idxToBuf.TryGetValue(idx, let oldBuffer)) + { + int index = GetIndexOfBuffer(oldBuffer); + + ref BufferEntry bufferDesc = ref _buffers[index]; + + Log.EngineLogger.Assert(idx == bufferDesc.Index); + + if(bufferDesc.OwnsBuffer) + delete bufferDesc.Buffer; + + bufferDesc.Buffer = buffer; + bufferDesc.OwnsBuffer = passOwnership; + + _strToBuf[bufferDesc.Name] = buffer; + _idxToBuf[bufferDesc.Index] = buffer; + } + else + { + Log.EngineLogger.Assert(false, "No buffer at the given index."); + } + } + + /** + * Replaces the buffer with the given name. + * @param name The name of the buffer to replace. + * @param buffer The new buffer. + * @param If set to true, the Collection will take ownership of the buffer; if false, the ownership will remain with the caller. + */ + public void ReplaceBuffer(StringView name, Buffer buffer, bool passOwnership = false) + { + if(_strToBuf.TryGetValue(name, let oldBuffer)) + { + int index = GetIndexOfBuffer(oldBuffer); + + ref BufferEntry bufferDesc = ref _buffers[index]; + + Log.EngineLogger.Assert(name == bufferDesc.Name); + + if(bufferDesc.OwnsBuffer) + delete bufferDesc.Buffer; + + bufferDesc.Buffer = buffer; + bufferDesc.OwnsBuffer = passOwnership; + + _strToBuf[bufferDesc.Name] = buffer; + _idxToBuf[bufferDesc.Index] = buffer; + } + else + { + Log.EngineLogger.Assert(false, "No buffer with the given name."); + } + } + + public void Add(int index, StringView name, Buffer buffer, bool passOwnership = false) + { + String nameStr = new String(name); + BufferEntry entry = (nameStr, index, buffer, passOwnership); + + _buffers.Add(entry); + _strToBuf.Add(entry.Name, entry.Buffer); + _idxToBuf.Add(entry.Index, entry.Buffer); + } + + /** + * Returns the index of the given Buffer in the _buffer-List. + * @param The buffer to find the index of. + * @returns The index of the buffer in the _buffer-List, or -1 if it isn't in the list. + */ + int GetIndexOfBuffer(Buffer buffer) + { + for(int i < _buffers.Count) + { + // Only check for reference equality. + if(_buffers[i].Buffer === buffer) + { + return i; + } + } + + return -1; + } + } +} diff --git a/GlitchyEngine/src/Renderer/Shader.bf b/GlitchyEngine/src/Renderer/Shader.bf index 744a69a..a93b89b 100644 --- a/GlitchyEngine/src/Renderer/Shader.bf +++ b/GlitchyEngine/src/Renderer/Shader.bf @@ -1,5 +1,7 @@ using System; using System.IO; +using System.Collections; +using System.Diagnostics; namespace GlitchyEngine.Renderer { @@ -21,10 +23,15 @@ namespace GlitchyEngine.Renderer { protected GraphicsContext _context; + protected BufferCollection _buffers ~ delete _; + public GraphicsContext Context => _context; + public BufferCollection Buffers => _buffers; + public this(GraphicsContext context, String source, String entryPoint, ShaderDefine[] macros = null) { + _buffers = new BufferCollection(); _context = context; CompileFromSource(source, entryPoint); }