Only hold on to vertex input layout shader code

This commit is contained in:
Simon Lübeß
2024-08-23 23:29:43 +02:00
parent d788853dd3
commit b98de9835d
3 changed files with 19 additions and 7 deletions
@@ -192,7 +192,7 @@ namespace GlitchyEngine.Renderer
if (newInputLayout == _currentInputLayout) if (newInputLayout == _currentInputLayout)
return; return;
_currentInputLayout.Release(); _currentInputLayout?.Release();
_currentInputLayout = newInputLayout; _currentInputLayout = newInputLayout;
_currentInputLayout.AddRef(); _currentInputLayout.AddRef();
@@ -23,19 +23,31 @@ namespace GlitchyEngine.Renderer
/** /**
* Internal compiled code of the shader. * Internal compiled code of the shader.
*/ */
internal ID3DBlob* nativeCode ~ _?.Release(); internal uint8[] nativeCode ~ delete _;
protected override Result<void> InternalCreateFromBlob(Span<uint8> blob) protected override Result<void> InternalCreateFromBlob(Span<uint8> blob)
{ {
HResult shaderCreationResult = HResult.S_FALSE; 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) switch (_shaderType)
{ {
case .Vertex: 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<uint8> 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); shaderCreationResult = NativeDevice.CreateVertexShader(blob.Ptr, (uint)blob.Length, null, (ID3D11VertexShader**)&nativeShader);
case .Pixel: case .Pixel:
shaderCreationResult = NativeDevice.CreatePixelShader(blob.Ptr, (uint)blob.Length, null, (ID3D11PixelShader**)&nativeShader); shaderCreationResult = NativeDevice.CreatePixelShader(blob.Ptr, (uint)blob.Length, null, (ID3D11PixelShader**)&nativeShader);
@@ -51,7 +51,7 @@ namespace GlitchyEngine.Renderer
ToNativeLayout(_elements, nativeElements); ToNativeLayout(_elements, nativeElements);
var result = NativeDevice.CreateInputLayout(nativeElements.CArray(), (.)nativeElements.Count, 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) if(result.Failed)
{ {
Log.EngineLogger.Error($"Failed to create D3D11 input layout: Message({(int)result}): {result}"); Log.EngineLogger.Error($"Failed to create D3D11 input layout: Message({(int)result}): {result}");