From b98de9835d801c0e109004b197c60f76419a506c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 23 Aug 2024 23:29:43 +0200 Subject: [PATCH] Only hold on to vertex input layout shader code --- .../DX11/Renderer/Dx11GraphicsContext.bf | 2 +- .../src/Platform/DX11/Renderer/Dx11Shader.bf | 22 ++++++++++++++----- .../DX11/Renderer/Dx11VertexLayout.bf | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index b2850ff..9e048a5 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -192,7 +192,7 @@ namespace GlitchyEngine.Renderer if (newInputLayout == _currentInputLayout) return; - _currentInputLayout.Release(); + _currentInputLayout?.Release(); _currentInputLayout = newInputLayout; _currentInputLayout.AddRef(); diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Shader.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Shader.bf index 5aa0969..759df2e 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Shader.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Shader.bf @@ -23,19 +23,31 @@ namespace GlitchyEngine.Renderer /** * Internal compiled code of the shader. */ - internal ID3DBlob* nativeCode ~ _?.Release(); + internal uint8[] nativeCode ~ delete _; protected override Result InternalCreateFromBlob(Span blob) { HResult shaderCreationResult = HResult.S_FALSE; - // TODO Temporary, because we need to generate the vertex layout from it! - D3DCompiler.D3DCreateBlob((.)blob.Length, &nativeCode); - Internal.MemCpy(nativeCode.GetBufferPointer(), blob.Ptr, blob.Length); - switch (_shaderType) { case .Vertex: + // We need to hold on to the code for the vertex input layout + ID3DBlob* signatureBlob = null; + HResult getInputSignatureResult = D3DCompiler.D3DGetInputSignatureBlob(blob.Ptr, (uint)blob.Length, &signatureBlob); + + if (getInputSignatureResult.Failed) + { + Log.EngineLogger.Error($"Failed to get the vertex input signature from the shader: {getInputSignatureResult} ({(int)getInputSignatureResult})"); + return .Err; + } + + Span signatureBlobSpan = .((uint8*)signatureBlob.GetBufferPointer(), (int)signatureBlob.GetBufferSize()); + nativeCode = new uint8[signatureBlobSpan.Length]; + signatureBlobSpan.CopyTo(nativeCode); + + signatureBlob.Release(); + shaderCreationResult = NativeDevice.CreateVertexShader(blob.Ptr, (uint)blob.Length, null, (ID3D11VertexShader**)&nativeShader); case .Pixel: shaderCreationResult = NativeDevice.CreatePixelShader(blob.Ptr, (uint)blob.Length, null, (ID3D11PixelShader**)&nativeShader); diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf index b45b42e..ee498ba 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11VertexLayout.bf @@ -51,7 +51,7 @@ namespace GlitchyEngine.Renderer ToNativeLayout(_elements, nativeElements); var result = NativeDevice.CreateInputLayout(nativeElements.CArray(), (.)nativeElements.Count, - vertexShader.nativeCode.GetBufferPointer(), vertexShader.nativeCode.GetBufferSize(), &layout); + vertexShader.nativeCode.Ptr, (uint32)vertexShader.nativeCode.Count, &layout); if(result.Failed) { Log.EngineLogger.Error($"Failed to create D3D11 input layout: Message({(int)result}): {result}");