mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-06 05:01:53 +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)
|
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user