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)
{
_currentInputLayout = _currentVertexLayout.GetNativeVertexLayout(_currentVertexShader.nativeCode);
ID3D11InputLayout* newInputLayout = _currentVertexLayout.GetNativeVertexLayout(_currentVertexShader);
if (newInputLayout == _currentInputLayout)
return;
_currentInputLayout.Release();
_currentInputLayout = newInputLayout;
_currentInputLayout.AddRef();
using (ContextMonitor.Enter())
@@ -14,13 +14,14 @@ namespace GlitchyEngine.Renderer
{
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)
{
for (let entry in _)
{
entry.key.Release();
entry.key.ReleaseRef();
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);
}
/// This should happen during shader compilation!
/// Validates or gets the validated input layout for the given vertexshader.
internal ID3D11InputLayout* GetNativeVertexLayout(ID3DBlob* vertexShaderCode)
internal ID3D11InputLayout* GetNativeVertexLayout(VertexShader vertexShader)
{
Debug.Profiler.ProfileResourceFunction!();
ID3D11InputLayout* layout = null;
if (!_validatedShaders.TryGetValue(vertexShaderCode, out layout))
if (!_validatedShaders.TryGetValue(vertexShader, out layout))
{
var nativeElements = scope InputElementDescription[_elements.Count];
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)
{
Log.EngineLogger.Error($"Failed to create D3D11 input layout: Message({(int)result}): {result}");
Debug.FatalError();
}
_validatedShaders[vertexShaderCode..AddRef()] = layout;
_validatedShaders[vertexShader..AddRef()] = layout;
}
return layout;