Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
VertexArrayObject.Direct3D.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 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_DIRECT3D
4 using System;
5 using System.Linq;
6 using SharpDX;
7 using SharpDX.Direct3D11;
8 using SiliconStudio.Core.ReferenceCounting;
9 
10 namespace SiliconStudio.Paradox.Graphics
11 {
12  public partial class VertexArrayObject
13  {
14  private readonly SharpDX.DXGI.Format indexFormat;
15  private readonly int indexBufferOffset;
16  internal readonly EffectInputSignature EffectInputSignature;
17  private SharpDX.Direct3D11.VertexBufferBinding[] nativeVertexBufferBindings;
18  private SharpDX.Direct3D11.Buffer nativeIndexBuffer;
19  internal InputLayout InputLayout;
20 
21  internal VertexArrayLayout Layout { get; private set; }
22 
23  private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
24  : base(graphicsDevice)
25  {
26  this.vertexBufferBindings = vertexBufferBindings;
27  this.indexBufferBinding = indexBufferBinding;
28  this.EffectInputSignature = shaderSignature;
29 
30  // Calculate Direct3D11 InputElement
31  int inputElementCount = vertexBufferBindings.Sum(t => t.Declaration.VertexElements.Length);
32  var inputElements = new InputElement[inputElementCount];
33 
34  int j = 0;
35  for (int i = 0; i < vertexBufferBindings.Length; i++)
36  {
37  var declaration = vertexBufferBindings[i].Declaration;
38  vertexBufferBindings[i].Buffer.AddReferenceInternal();
39  foreach (var vertexElementWithOffset in declaration.EnumerateWithOffsets())
40  {
41  var vertexElement = vertexElementWithOffset.VertexElement;
42  inputElements[j++] = new InputElement
43  {
44  Slot = i,
45  SemanticName = vertexElement.SemanticName,
46  SemanticIndex = vertexElement.SemanticIndex,
47  AlignedByteOffset = vertexElementWithOffset.Offset,
48  Format = (SharpDX.DXGI.Format)vertexElement.Format,
49  };
50  }
51  }
52 
53  Layout = VertexArrayLayout.GetOrCreateLayout(new VertexArrayLayout(inputElements));
54 
55  if (indexBufferBinding != null)
56  {
57  indexBufferBinding.Buffer.AddReferenceInternal();
58  indexBufferOffset = indexBufferBinding.Offset;
59  indexFormat = (indexBufferBinding.Is32Bit ? SharpDX.DXGI.Format.R32_UInt : SharpDX.DXGI.Format.R16_UInt);
60  }
61 
62  CreateResources();
63  }
64 
65  void CreateResources()
66  {
67  // If we have a shader signature, we can store the input layout directly
68  if (EffectInputSignature != null)
69  {
70  InputLayout = GraphicsDevice.InputLayoutManager.GetInputLayout(EffectInputSignature, Layout);
71  }
72 
73  nativeVertexBufferBindings = vertexBufferBindings.Select(x => new SharpDX.Direct3D11.VertexBufferBinding(x.Buffer.NativeBuffer, x.Stride, x.Offset)).ToArray();
74 
75  if (indexBufferBinding != null)
76  {
77  nativeIndexBuffer = indexBufferBinding.Buffer.NativeBuffer;
78  }
79  }
80 
81  protected override void DestroyImpl()
82  {
83  if (InputLayout != null)
84  {
85  ((IUnknown)InputLayout).Release();
86  InputLayout = null;
87  }
88 
89  nativeVertexBufferBindings = null;
90  nativeIndexBuffer = null;
91  }
92 
93  /// <inheritdoc/>
94  protected internal override void OnDestroyed()
95  {
96  base.OnDestroyed();
97  DestroyImpl();
98  }
99 
100  /// <inheritdoc/>
101  protected internal override bool OnRecreate()
102  {
103  // Dependency: wait for underlying buffers to be recreated first
104  foreach (var vertexBufferBinding in vertexBufferBindings)
105  {
106  if (vertexBufferBinding.Buffer.LifetimeState != GraphicsResourceLifetimeState.Active)
107  return false;
108  }
109 
110  if (indexBufferBinding != null && indexBufferBinding.Buffer.LifetimeState != GraphicsResourceLifetimeState.Active)
111  return false;
112 
113  CreateResources();
114  return true;
115  }
116 
117  internal void Apply(InputAssemblerStage inputAssemblerStage)
118  {
119  inputAssemblerStage.SetVertexBuffers(0, nativeVertexBufferBindings);
120  inputAssemblerStage.SetIndexBuffer(nativeIndexBuffer, indexFormat, indexBufferOffset);
121  }
122  }
123 }
124 #endif
GraphicsResourceLifetimeState
Describes the lifetime state of a graphics resource.