From d8b3b137dd430820d0feca75e8431e05e862f788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 23 Aug 2024 22:59:33 +0200 Subject: [PATCH] Pass VertexShader to VertexLayout, don't reassign layout --- .../Platform/DX11/Renderer/Dx11GraphicsContext.bf | 8 +++++++- .../Platform/DX11/Renderer/Dx11VertexLayout.bf | 15 ++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index 0775049..b2850ff 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -187,7 +187,13 @@ namespace GlitchyEngine.Renderer { if (_currentInputLayout == null) { - _currentInputLayout = _currentVertexLayout.GetNativeVertexLayout(_currentVertexShader.nativeCode); + ID3D11InputLayout* newInputLayout = _currentVertexLayout.GetNativeVertexLayout(_currentVertexShader); + + if (newInputLayout == _currentInputLayout) + return; + + _currentInputLayout.Release(); + _currentInputLayout = newInputLayout; _currentInputLayout.AddRef(); using (ContextMonitor.Enter()) diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf index 31b6aad..b45b42e 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf @@ -14,13 +14,14 @@ namespace GlitchyEngine.Renderer { public extension VertexLayout { - private Dictionary _validatedShaders = new .() ~ + // TODO: This will leak memory, when a shader reloads + private Dictionary _validatedShaders = new .() ~ { if (_ != null) { for (let entry in _) { - entry.key.Release(); + entry.key.ReleaseRef(); entry.value.Release(); } @@ -36,28 +37,28 @@ namespace GlitchyEngine.Renderer output[i] = .(input[i].SemanticName, input[i].SemanticIndex, (.)input[i].Format, input[i].InputSlot, input[i].AlignedByteOffset, (.)input[i].InputSlotClass, input[i].InstanceDataStepRate); } - /// This should happen during shader compilation! /// Validates or gets the validated input layout for the given vertexshader. - internal ID3D11InputLayout* GetNativeVertexLayout(ID3DBlob* vertexShaderCode) + internal ID3D11InputLayout* GetNativeVertexLayout(VertexShader vertexShader) { Debug.Profiler.ProfileResourceFunction!(); ID3D11InputLayout* layout = null; - if (!_validatedShaders.TryGetValue(vertexShaderCode, out layout)) + if (!_validatedShaders.TryGetValue(vertexShader, out layout)) { var nativeElements = scope InputElementDescription[_elements.Count]; ToNativeLayout(_elements, nativeElements); - var result = NativeDevice.CreateInputLayout(nativeElements.CArray(), (.)nativeElements.Count, vertexShaderCode.GetBufferPointer(), vertexShaderCode.GetBufferSize(), &layout); + var result = NativeDevice.CreateInputLayout(nativeElements.CArray(), (.)nativeElements.Count, + vertexShader.nativeCode.GetBufferPointer(), vertexShader.nativeCode.GetBufferSize(), &layout); if(result.Failed) { Log.EngineLogger.Error($"Failed to create D3D11 input layout: Message({(int)result}): {result}"); Debug.FatalError(); } - _validatedShaders[vertexShaderCode..AddRef()] = layout; + _validatedShaders[vertexShader..AddRef()] = layout; } return layout;