3 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_DIRECT3D
7 using SharpDX.Direct3D11;
8 using SiliconStudio.Core.ReferenceCounting;
10 namespace SiliconStudio.
Paradox.Graphics
12 public partial class VertexArrayObject
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;
21 internal VertexArrayLayout Layout {
get;
private set; }
23 private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
24 : base(graphicsDevice)
26 this.vertexBufferBindings = vertexBufferBindings;
27 this.indexBufferBinding = indexBufferBinding;
28 this.EffectInputSignature = shaderSignature;
31 int inputElementCount = vertexBufferBindings.Sum(t => t.Declaration.VertexElements.Length);
32 var inputElements =
new InputElement[inputElementCount];
35 for (
int i = 0; i < vertexBufferBindings.Length; i++)
37 var declaration = vertexBufferBindings[i].Declaration;
38 vertexBufferBindings[i].Buffer.AddReferenceInternal();
39 foreach (var vertexElementWithOffset
in declaration.EnumerateWithOffsets())
41 var vertexElement = vertexElementWithOffset.VertexElement;
42 inputElements[j++] =
new InputElement
45 SemanticName = vertexElement.SemanticName,
46 SemanticIndex = vertexElement.SemanticIndex,
47 AlignedByteOffset = vertexElementWithOffset.Offset,
48 Format = (SharpDX.DXGI.Format)vertexElement.Format,
53 Layout = VertexArrayLayout.GetOrCreateLayout(
new VertexArrayLayout(inputElements));
55 if (indexBufferBinding != null)
57 indexBufferBinding.Buffer.AddReferenceInternal();
58 indexBufferOffset = indexBufferBinding.Offset;
59 indexFormat = (indexBufferBinding.Is32Bit ? SharpDX.DXGI.Format.R32_UInt : SharpDX.DXGI.Format.R16_UInt);
65 void CreateResources()
68 if (EffectInputSignature != null)
70 InputLayout = GraphicsDevice.InputLayoutManager.GetInputLayout(EffectInputSignature, Layout);
73 nativeVertexBufferBindings = vertexBufferBindings.Select(x =>
new SharpDX.Direct3D11.VertexBufferBinding(x.Buffer.NativeBuffer, x.Stride, x.Offset)).ToArray();
75 if (indexBufferBinding != null)
77 nativeIndexBuffer = indexBufferBinding.Buffer.NativeBuffer;
81 protected override void DestroyImpl()
83 if (InputLayout != null)
85 ((IUnknown)InputLayout).Release();
89 nativeVertexBufferBindings = null;
90 nativeIndexBuffer = null;
94 protected internal override void OnDestroyed()
101 protected internal override bool OnRecreate()
104 foreach (var vertexBufferBinding
in vertexBufferBindings)
117 internal void Apply(InputAssemblerStage inputAssemblerStage)
119 inputAssemblerStage.SetVertexBuffers(0, nativeVertexBufferBindings);
120 inputAssemblerStage.SetIndexBuffer(nativeIndexBuffer, indexFormat, indexBufferOffset);
GraphicsResourceLifetimeState
Describes the lifetime state of a graphics resource.