Pass VertexShader to VertexLayout, don't reassign layout

This commit is contained in:
Simon Lübeß
2024-08-23 23:00:10 +02:00
parent ff1c6db222
commit d8b3b137dd
2 changed files with 15 additions and 8 deletions
@@ -187,7 +187,13 @@ namespace GlitchyEngine.Renderer
{ {
if (_currentInputLayout == null) if (_currentInputLayout == null)
{ {
_currentInputLayout = _currentVertexLayout.GetNativeVertexLayout(_currentVertexShader.nativeCode); ID3D11InputLayout* newInputLayout = _currentVertexLayout.GetNativeVertexLayout(_currentVertexShader);
if (newInputLayout == _currentInputLayout)
return;
_currentInputLayout.Release();
_currentInputLayout = newInputLayout;
_currentInputLayout.AddRef(); _currentInputLayout.AddRef();
using (ContextMonitor.Enter()) using (ContextMonitor.Enter())
@@ -14,13 +14,14 @@ namespace GlitchyEngine.Renderer
{ {
public extension VertexLayout public extension VertexLayout
{ {
private Dictionary<ID3DBlob*, ID3D11InputLayout*> _validatedShaders = new .() ~ // TODO: This will leak memory, when a shader reloads
private Dictionary<VertexShader, ID3D11InputLayout*> _validatedShaders = new .() ~
{ {
if (_ != null) if (_ != null)
{ {
for (let entry in _) for (let entry in _)
{ {
entry.key.Release(); entry.key.ReleaseRef();
entry.value.Release(); entry.value.Release();
} }
@@ -36,28 +37,28 @@ namespace GlitchyEngine.Renderer
output[i] = .(input[i].SemanticName, input[i].SemanticIndex, (.)input[i].Format, input[i].InputSlot, input[i].AlignedByteOffset, (.)input[i].InputSlotClass, input[i].InstanceDataStepRate); output[i] = .(input[i].SemanticName, input[i].SemanticIndex, (.)input[i].Format, input[i].InputSlot, input[i].AlignedByteOffset, (.)input[i].InputSlotClass, input[i].InstanceDataStepRate);
} }
/// This should happen during shader compilation!
/// Validates or gets the validated input layout for the given vertexshader. /// Validates or gets the validated input layout for the given vertexshader.
internal ID3D11InputLayout* GetNativeVertexLayout(ID3DBlob* vertexShaderCode) internal ID3D11InputLayout* GetNativeVertexLayout(VertexShader vertexShader)
{ {
Debug.Profiler.ProfileResourceFunction!(); Debug.Profiler.ProfileResourceFunction!();
ID3D11InputLayout* layout = null; ID3D11InputLayout* layout = null;
if (!_validatedShaders.TryGetValue(vertexShaderCode, out layout)) if (!_validatedShaders.TryGetValue(vertexShader, out layout))
{ {
var nativeElements = scope InputElementDescription[_elements.Count]; var nativeElements = scope InputElementDescription[_elements.Count];
ToNativeLayout(_elements, nativeElements); ToNativeLayout(_elements, nativeElements);
var result = NativeDevice.CreateInputLayout(nativeElements.CArray(), (.)nativeElements.Count, vertexShaderCode.GetBufferPointer(), vertexShaderCode.GetBufferSize(), &layout); var result = NativeDevice.CreateInputLayout(nativeElements.CArray(), (.)nativeElements.Count,
vertexShader.nativeCode.GetBufferPointer(), vertexShader.nativeCode.GetBufferSize(), &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}");
Debug.FatalError(); Debug.FatalError();
} }
_validatedShaders[vertexShaderCode..AddRef()] = layout; _validatedShaders[vertexShader..AddRef()] = layout;
} }
return layout; return layout;