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.Buffers[0].SetData(Matrix.Identity);
// Create Input Layout
_vertexLayout = new VertexLayout(_window.Context, new .(
@@ -169,7 +169,8 @@ namespace GlitchyEngine.Renderer
public override void SetVertexShader(VertexShader vertexShader)
{
//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();
nativeContext.VertexShader.SetShader(vertexShader.nativeShader);
}
@@ -1,9 +1,6 @@
using System;
using DirectX.D3D11;
using DirectX.D3DCompiler;
using DirectX.D3D11Shader;
using DirectX.Common;
using System.Diagnostics;
using internal GlitchyEngine.Renderer;
@@ -15,15 +12,7 @@ namespace GlitchyEngine.Renderer
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, "ps_5_0", flags, let shaderBlob);
Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "ps_5_0", DefaultCompileFlags, let shaderBlob);
var result = _context.nativeDevice.CreatePixelShader(shaderBlob.GetBufferPointer(), shaderBlob.GetBufferSize(), null, &nativeShader);
if(result.Failed)
@@ -35,36 +24,5 @@ namespace GlitchyEngine.Renderer
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.D3D11;
using DirectX.D3DCompiler;
using DirectX.D3D11Shader;
using internal GlitchyEngine.Renderer;
@@ -10,6 +11,13 @@ namespace GlitchyEngine.Renderer
{
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)
{
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}");
}
}
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)
{
ShaderCompileFlags flags = .Default;
#if DEBUG
flags |= .Debug;
#else
flags |= .OptimizationLevel3;
#endif
Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "vs_5_0", flags, out nativeCode);
Shader.PlattformCompileShaderFromSource(code, macros, entryPoint, "vs_5_0", DefaultCompileFlags, out nativeCode);
var result = _context.nativeDevice.CreateVertexShader(nativeCode.GetBufferPointer(), nativeCode.GetBufferSize(), null, &nativeShader);
if(result.Failed)
@@ -32,7 +24,7 @@ namespace GlitchyEngine.Renderer
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;
}
@@ -18,7 +26,7 @@ struct PS_IN
PS_IN VS(VS_IN input)
{
PS_IN output;
output.Position = float4(input.Position, 1);
output.Position = mul(Transform, float4(input.Position, 1));
output.Color = input.Color;
return output;