Added Shader base and PixelShader

This commit is contained in:
Simon Lübeß
2020-12-04 19:02:42 +01:00
parent b12baf695a
commit 242d9e728c
6 changed files with 177 additions and 45 deletions
@@ -165,5 +165,13 @@ namespace GlitchyEngine.Renderer
{
nativeContext.InputAssembler.SetPrimitiveTopology((DirectX.Common.PrimitiveTopology)primitiveTopology);
}
public override void SetPixelShader(PixelShader pixelShader)
{
//Todo: nativeContext.PixelShader.SetSamplers();
//Todo: nativeContext.PixelShader.SetConstantBuffers();
//Todo: nativeContext.PixelShader.SetShaderResources();
nativeContext.PixelShader.SetShader(pixelShader.nativeShader);
}
}
}
@@ -0,0 +1,83 @@
using System;
using DirectX.D3D11;
using DirectX.D3DCompiler;
using DirectX.D3D11Shader;
using DirectX.Common;
using internal GlitchyEngine.Renderer;
namespace GlitchyEngine.Renderer
{
extension Shader
{
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]*;
for(int i < macros?.Count ?? 0)
{
nativeMacros[i].Name = macros[i].Name.ToScopedNativeWChar!();
nativeMacros[i].Definition = macros[i].Definition.ToScopedNativeWChar!();
}
// Todo: sourceName, includes,
// Todo: variable shader target?
ID3DBlob* errorBlob = null;
shaderBlob = null;
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())}");
}
}
}
extension PixelShader
{
internal ID3D11PixelShader* nativeShader ~ _?.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, "ps_5_0", flags, let shaderBlob);
var result = _context.nativeDevice.CreatePixelShader(shaderBlob.GetBufferPointer(), shaderBlob.GetBufferSize(), null, &nativeShader);
if(result.Failed)
{
Log.EngineLogger.Error($"Failed to create pixel shader: Message ({(int)result}): {result}");
}
Reflect(shaderBlob);
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)
{
var bufferReflection = reflection.GetConstantBufferByIndex(i);
bufferReflection.GetDescription(let bufferDesc);
}
}
}
}