Added reflection and constant buffers to vertex shaders

This commit is contained in:
Simon Lübeß
2020-12-30 18:52:32 +01:00
parent d0c8685ce7
commit 56183c1896
6 changed files with 56 additions and 56 deletions
+2
View File
@@ -88,6 +88,8 @@ namespace GlitchyEngine
{ {
_vertexShader = Shader.FromFile!<VertexShader>(_window.Context, "content\\basicShader.hlsl", "VS"); _vertexShader = Shader.FromFile!<VertexShader>(_window.Context, "content\\basicShader.hlsl", "VS");
_vertexShader.Buffers[0].SetData(Matrix.Identity);
// Create Input Layout // Create Input Layout
_vertexLayout = new VertexLayout(_window.Context, new .( _vertexLayout = new VertexLayout(_window.Context, new .(
@@ -169,7 +169,8 @@ namespace GlitchyEngine.Renderer
public override void SetVertexShader(VertexShader vertexShader) public override void SetVertexShader(VertexShader vertexShader)
{ {
//Todo: nativeContext.VertexShader.SetSamplers(); //Todo: nativeContext.VertexShader.SetSamplers();
//Todo: nativeContext.VertexShader.SetConstantBuffers(); vertexShader.Buffers.PlatformFetchNativeBuffers();
nativeContext.VertexShader.SetConstantBuffers(0, vertexShader.Buffers.nativeBuffers.Count, &vertexShader.Buffers.nativeBuffers);
//Todo: nativeContext.VertexShader.SetShaderResources(); //Todo: nativeContext.VertexShader.SetShaderResources();
nativeContext.VertexShader.SetShader(vertexShader.nativeShader); nativeContext.VertexShader.SetShader(vertexShader.nativeShader);
} }
@@ -1,9 +1,6 @@
using System; using System;
using DirectX.D3D11; using DirectX.D3D11;
using DirectX.D3DCompiler; using DirectX.D3DCompiler;
using DirectX.D3D11Shader;
using DirectX.Common;
using System.Diagnostics;
using internal GlitchyEngine.Renderer; using internal GlitchyEngine.Renderer;
@@ -15,15 +12,7 @@ namespace GlitchyEngine.Renderer
public override void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null) public override void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null)
{ {
ShaderCompileFlags flags = .Default; Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "ps_5_0", DefaultCompileFlags, let shaderBlob);
#if DEBUG
flags |= .Debug;
#else
flags |= .OptimizationLevel3;
#endif
Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "ps_5_0", flags, let shaderBlob);
var result = _context.nativeDevice.CreatePixelShader(shaderBlob.GetBufferPointer(), shaderBlob.GetBufferSize(), null, &nativeShader); var result = _context.nativeDevice.CreatePixelShader(shaderBlob.GetBufferPointer(), shaderBlob.GetBufferSize(), null, &nativeShader);
if(result.Failed) if(result.Failed)
@@ -35,36 +24,5 @@ namespace GlitchyEngine.Renderer
shaderBlob?.Release(); shaderBlob?.Release();
} }
internal void Reflect(ID3DBlob* shaderCode)
{
ID3D11ShaderReflection* reflection = null;
var result = D3DCompiler.D3DReflect(shaderCode.GetBufferPointer(), shaderCode.GetBufferSize(), &reflection);
if(result.Failed)
{
Log.EngineLogger.Error($"Failed to reflect pixel shader: Message ({(int)result}): {result}");
}
reflection.GetDescription(let desc);
uint32 cBufferCount = desc.ConstantBuffers;
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();
}
} }
} }
@@ -3,6 +3,7 @@ using GlitchyEngine.Renderer;
using DirectX.Common; using DirectX.Common;
using DirectX.D3D11; using DirectX.D3D11;
using DirectX.D3DCompiler; using DirectX.D3DCompiler;
using DirectX.D3D11Shader;
using internal GlitchyEngine.Renderer; using internal GlitchyEngine.Renderer;
@@ -10,6 +11,13 @@ namespace GlitchyEngine.Renderer
{ {
extension Shader extension Shader
{ {
protected const ShaderCompileFlags DefaultCompileFlags =
#if DEBUG
.Debug;
#else
.OptimizationLevel3;
#endif
internal static void PlattformCompileShaderFromSource(String code, ShaderDefine[] macros, String entryPoint, String target, ShaderCompileFlags compileFlags, out ID3DBlob* shaderBlob) internal static void PlattformCompileShaderFromSource(String code, ShaderDefine[] macros, String entryPoint, String target, ShaderCompileFlags compileFlags, out ID3DBlob* shaderBlob)
{ {
ShaderMacro* nativeMacros = macros == null ? null : new:ScopedAlloc! ShaderMacro[macros.Count]*; ShaderMacro* nativeMacros = macros == null ? null : new:ScopedAlloc! ShaderMacro[macros.Count]*;
@@ -33,5 +41,36 @@ namespace GlitchyEngine.Renderer
Log.EngineLogger.Error($"Failed to compile Shader: Error Code({(int)result}): {result} | Error Message: {str}"); Log.EngineLogger.Error($"Failed to compile Shader: Error Code({(int)result}): {result} | Error Message: {str}");
} }
} }
protected internal void Reflect(ID3DBlob* shaderCode)
{
ID3D11ShaderReflection* reflection = null;
var result = D3DCompiler.D3DReflect(shaderCode.GetBufferPointer(), shaderCode.GetBufferSize(), &reflection);
if(result.Failed)
{
Log.EngineLogger.Error($"Failed to reflect shader: Message ({(int)result}): {result}");
}
reflection.GetDescription(let desc);
uint32 cBufferCount = desc.ConstantBuffers;
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();
}
} }
} }
@@ -16,15 +16,7 @@ namespace GlitchyEngine.Renderer
public override void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null) public override void CompileFromSource(String code, String entryPoint, ShaderDefine[] macros = null)
{ {
ShaderCompileFlags flags = .Default; Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "vs_5_0", DefaultCompileFlags, out nativeCode);
#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); var result = _context.nativeDevice.CreateVertexShader(nativeCode.GetBufferPointer(), nativeCode.GetBufferSize(), null, &nativeShader);
if(result.Failed) if(result.Failed)
@@ -32,7 +24,7 @@ namespace GlitchyEngine.Renderer
Log.EngineLogger.Error($"Failed to create vertex shader: Message ({(int)result}): {result}"); Log.EngineLogger.Error($"Failed to create vertex shader: Message ({(int)result}): {result}");
} }
//int i = nativeCode?.Release() ?? (uint32)-1; Reflect(nativeCode);
} }
} }
} }
+10 -2
View File
@@ -1,4 +1,12 @@
cbuffer Constants cbuffer Constants : register(b0)
{
float4x4 Transform = float4x4(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
}
cbuffer Constants : register(b1)
{ {
float4 BaseColor; float4 BaseColor;
} }
@@ -18,7 +26,7 @@ struct PS_IN
PS_IN VS(VS_IN input) PS_IN VS(VS_IN input)
{ {
PS_IN output; PS_IN output;
output.Position = float4(input.Position, 1); output.Position = mul(Transform, float4(input.Position, 1));
output.Color = input.Color; output.Color = input.Color;
return output; return output;