From 3a599fd21a3ee793c797c1f1429a45d2166cf90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Thu, 24 Dec 2020 23:53:56 +0100 Subject: [PATCH] Added vertex shader --- GlitchyEngine/src/Application.bf | 42 +++---------------- .../DX11/Renderer/Dx11GraphicsContext.bf | 8 ++++ .../Platform/DX11/Renderer/Dx11PixelShader.bf | 31 +++++++++++++- GlitchyEngine/src/Renderer/GraphicsContext.bf | 2 + GlitchyEngine/src/Renderer/Shader.bf | 8 ++++ 5 files changed, 54 insertions(+), 37 deletions(-) diff --git a/GlitchyEngine/src/Application.bf b/GlitchyEngine/src/Application.bf index c7d25df..67dae97 100644 --- a/GlitchyEngine/src/Application.bf +++ b/GlitchyEngine/src/Application.bf @@ -76,9 +76,10 @@ namespace GlitchyEngine VertexLayout _vertexLayout ~ delete _; + VertexShader _vertexShader ~ delete _; PixelShader _pixelShader ~ delete _; - ID3D11VertexShader* _vertexShader ~ _?.Release(); + //ID3D11VertexShader* _vertexShader ~ _?.Release(); private Vector3 CircleCoord(float angle) { @@ -87,39 +88,14 @@ namespace GlitchyEngine private void MakeTestTriangle() { - // Compile vertex shader - ID3DBlob* vsCode = null; - ID3DBlob* errorBlob = null; - var result = D3DCompiler.D3DCompileFromFile("content\\basicShader.hlsl".ToScopedNativeWChar!(), null, .StandardInclude, "VS", "vs_5_0", .Debug, .None, &vsCode, &errorBlob); - - if(result.Failed || errorBlob != null) - { - Debug.Write("ERROR: Failed to compile Vertex Shader: {}", result); - Runtime.FatalError("Failed to compile Vertex Shader"); - } - - result = Window.Context.[Friend]nativeDevice.CreateVertexShader(vsCode.GetBufferPointer(), vsCode.GetBufferSize(), null, &_vertexShader); - - if(result.Failed) - { - Debug.Write("ERROR: Failed to create Vertex Shader: {}", result); - Runtime.FatalError("Failed to create Vertex Shader"); - } - + _vertexShader = Shader.FromFile!(_window.Context, "content\\basicShader.hlsl", "VS"); + // Create Input Layout _vertexLayout = new VertexLayout(_window.Context, new .( VertexElement("POSITION", 0, .R32G32B32_Float, 0), VertexElement("COLOR", 0, .R8G8B8A8_UNorm, 0) - ), vsCode); - - vsCode.Release(); - - if(result.Failed) - { - Debug.Write("ERROR: Failed to create input layout: {}", result); - Runtime.FatalError("Failed to create input layout"); - } + ), _vertexShader.[Friend]nativeCode); // // Load pixel shader @@ -157,12 +133,6 @@ namespace GlitchyEngine _indexBuffer = new IndexBuffer(Window.Context, (.)indices.Count, .Immutable); _indexBuffer.SetData(indices); - if(result.Failed) - { - Debug.Write("ERROR: Failed to create Vertex Buffer: {}", result); - Runtime.FatalError(); - } - // Create rasterizer state GlitchyEngine.Renderer.RasterizerStateDescription rsDesc = .(.Solid, .Back, true); _rasterizerState = new RasterizerState(Window.Context, rsDesc); @@ -205,7 +175,7 @@ namespace GlitchyEngine var _immediateContext = _window.Context.[Friend]nativeContext; - _immediateContext.VertexShader.SetShader(_vertexShader, null, 0); + _window.Context.SetVertexShader(_vertexShader); _window.Context.SetRasterizerState(_rasterizerState); diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index 3f6235b..bcfc566 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -166,6 +166,14 @@ namespace GlitchyEngine.Renderer nativeContext.InputAssembler.SetPrimitiveTopology((DirectX.Common.PrimitiveTopology)primitiveTopology); } + public override void SetVertexShader(VertexShader vertexShader) + { + //Todo: nativeContext.VertexShader.SetSamplers(); + //Todo: nativeContext.VertexShader.SetConstantBuffers(); + //Todo: nativeContext.VertexShader.SetShaderResources(); + nativeContext.VertexShader.SetShader(vertexShader.nativeShader); + } + public override void SetPixelShader(PixelShader pixelShader) { //Todo: nativeContext.PixelShader.SetSamplers(); diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf index ad6a168..361d6d0 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11PixelShader.bf @@ -29,7 +29,8 @@ namespace GlitchyEngine.Renderer var result = D3DCompiler.D3DCompile(code.CStr(), (.)code.Length, null, nativeMacros, null, entryPoint, target, compileFlags, .None, &shaderBlob, &errorBlob); if(result.Failed) { - Log.EngineLogger.Error($"Failed to compile Shader: Error Code({(int)result}): {result} | Error Message: {scope String((char8*)errorBlob.GetBufferPointer(), errorBlob.GetBufferSize())}"); + StringView str = StringView((char8*)errorBlob.GetBufferPointer(), errorBlob.GetBufferSize()); + Log.EngineLogger.Error($"Failed to compile Shader: Error Code({(int)result}): {result} | Error Message: {str}"); } } } @@ -81,4 +82,32 @@ namespace GlitchyEngine.Renderer reflection.Release(); } } + + extension VertexShader + { + internal ID3D11VertexShader* nativeShader ~ _?.Release(); + + internal ID3DBlob* nativeCode ~ _?.Release(); + + public override void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null) + { + ShaderCompileFlags flags = .Default; + +#if DEBUG + flags |= .Debug; +#else + flags |= .OptimizationLevel3; +#endif + + Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "vs_5_0", flags, out nativeCode); + + var result = _context.nativeDevice.CreateVertexShader(nativeCode.GetBufferPointer(), nativeCode.GetBufferSize(), null, &nativeShader); + if(result.Failed) + { + Log.EngineLogger.Error($"Failed to create vertex shader: Message ({(int)result}): {result}"); + } + + //int i = nativeCode?.Release() ?? (uint32)-1; + } + } } diff --git a/GlitchyEngine/src/Renderer/GraphicsContext.bf b/GlitchyEngine/src/Renderer/GraphicsContext.bf index 0ae8f66..37427b3 100644 --- a/GlitchyEngine/src/Renderer/GraphicsContext.bf +++ b/GlitchyEngine/src/Renderer/GraphicsContext.bf @@ -112,6 +112,8 @@ namespace GlitchyEngine.Renderer public extern void SetVertexLayout(VertexLayout vertexLayout); public extern void SetPrimitiveTopology(PrimitiveTopology primitiveTopology); + + public extern void SetVertexShader(VertexShader vertexShader); public extern void SetPixelShader(PixelShader pixelShader); } diff --git a/GlitchyEngine/src/Renderer/Shader.bf b/GlitchyEngine/src/Renderer/Shader.bf index 53f1edb..87862bd 100644 --- a/GlitchyEngine/src/Renderer/Shader.bf +++ b/GlitchyEngine/src/Renderer/Shader.bf @@ -51,4 +51,12 @@ namespace GlitchyEngine.Renderer public override extern void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null); } + + public class VertexShader : Shader + { + public this(GraphicsContext context, String source, String entryPoint, ShaderDefine[] macros = null) + : base(context, source, entryPoint, macros) { } + + public override extern void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null); + } }