Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
InputLayoutManager.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using SiliconStudio.Core;
4 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_DIRECT3D
5 using System;
6 using System.Collections.Generic;
7 using SharpDX;
8 using SharpDX.Direct3D11;
10 namespace SiliconStudio.Paradox.Graphics
11 {
12  internal class InputLayoutManager : ComponentBase
13  {
14  private readonly Dictionary<InputKey, InputLayout> registeredSignatures = new Dictionary<InputKey, InputLayout>(1024);
15  private readonly GraphicsDevice graphicsDevice;
16 
17  public InputLayoutManager(GraphicsDevice graphicsDevice)
18  {
19  this.graphicsDevice = graphicsDevice;
20  }
21 
22  public InputLayout GetInputLayout(EffectInputSignature effectInputSignature, VertexArrayLayout vertexArrayLayout)
23  {
24  var inputKey = new InputKey(effectInputSignature, vertexArrayLayout);
25 
26  InputLayout inputLayout;
27  // TODO: Check if it is really worth to use ConcurrentDictionary
28  lock (registeredSignatures)
29  {
30  if (!registeredSignatures.TryGetValue(inputKey, out inputLayout))
31  {
32  try
33  {
34  inputLayout = new InputLayout(graphicsDevice.NativeDevice, effectInputSignature.NativeSignature, vertexArrayLayout.InputElements);
35  }
36  catch (Exception)
37  {
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()));
40  }
41  registeredSignatures.Add(inputKey, inputLayout);
42  }
43 
44  ((IUnknown)inputLayout).AddReference();
45  }
46  return inputLayout;
47  }
48 
49  internal void OnDestroyed()
50  {
51  lock (registeredSignatures)
52  {
53  foreach (var inputLayout in registeredSignatures)
54  {
55  ((IUnknown)inputLayout.Value).Release();
56  }
57  registeredSignatures.Clear();
58  }
59  }
60 
61  private struct InputKey : IEquatable<InputKey>
62  {
63  private readonly EffectInputSignature effectInputSignature;
64 
65  private readonly VertexArrayLayout vertexArrayLayout;
66 
67  public InputKey(EffectInputSignature effectInputSignature, VertexArrayLayout vertexArrayLayout)
68  {
69  this.effectInputSignature = effectInputSignature;
70  this.vertexArrayLayout = vertexArrayLayout;
71  }
72 
73  public bool Equals(InputKey other)
74  {
75  return ReferenceEquals(effectInputSignature, other.effectInputSignature) && ReferenceEquals(vertexArrayLayout, other.vertexArrayLayout);
76  }
77 
78  public override bool Equals(object obj)
79  {
80  if (ReferenceEquals(null, obj)) return false;
81  return obj is InputKey && Equals((InputKey)obj);
82  }
83 
84  public override int GetHashCode()
85  {
86  unchecked
87  {
88  return (effectInputSignature.GetHashCode() * 397) ^ vertexArrayLayout.GetHashCode();
89  }
90  }
91  }
92  }
93 }
94 #endif
Base class for a framework component.