mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 21:01:52 +00:00
Pass VertexShader to VertexLayout, don't reassign layout
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user