3 using SiliconStudio.Core;
4 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_DIRECT3D
6 using System.Collections.Generic;
8 using SharpDX.Direct3D11;
10 namespace SiliconStudio.
Paradox.Graphics
14 private readonly Dictionary<InputKey, InputLayout> registeredSignatures =
new Dictionary<InputKey, InputLayout>(1024);
15 private readonly GraphicsDevice graphicsDevice;
17 public InputLayoutManager(GraphicsDevice graphicsDevice)
19 this.graphicsDevice = graphicsDevice;
22 public InputLayout GetInputLayout(EffectInputSignature effectInputSignature, VertexArrayLayout vertexArrayLayout)
24 var inputKey =
new InputKey(effectInputSignature, vertexArrayLayout);
26 InputLayout inputLayout;
28 lock (registeredSignatures)
30 if (!registeredSignatures.TryGetValue(inputKey, out inputLayout))
34 inputLayout =
new InputLayout(graphicsDevice.NativeDevice, effectInputSignature.NativeSignature, vertexArrayLayout.InputElements);
38 throw new InvalidOperationException(
"The provided vertex array input elements are not matching the ones of the shader." +
39 " [Details: EffectInputSignature='{0}', VertexArrayLayout='{1}]".ToFormat(effectInputSignature.ToString(), vertexArrayLayout.ToString()));
41 registeredSignatures.Add(inputKey, inputLayout);
44 ((IUnknown)inputLayout).AddReference();
49 internal void OnDestroyed()
51 lock (registeredSignatures)
53 foreach (var inputLayout
in registeredSignatures)
55 ((IUnknown)inputLayout.Value).Release();
57 registeredSignatures.Clear();
61 private struct InputKey : IEquatable<InputKey>
63 private readonly EffectInputSignature effectInputSignature;
65 private readonly VertexArrayLayout vertexArrayLayout;
67 public InputKey(EffectInputSignature effectInputSignature, VertexArrayLayout vertexArrayLayout)
69 this.effectInputSignature = effectInputSignature;
70 this.vertexArrayLayout = vertexArrayLayout;
73 public bool Equals(InputKey other)
75 return ReferenceEquals(effectInputSignature, other.effectInputSignature) && ReferenceEquals(vertexArrayLayout, other.vertexArrayLayout);
78 public override bool Equals(
object obj)
80 if (ReferenceEquals(null, obj))
return false;
81 return obj is InputKey && Equals((InputKey)obj);
84 public override int GetHashCode()
88 return (effectInputSignature.GetHashCode() * 397) ^ vertexArrayLayout.GetHashCode();
Base class for a framework component.