public VertexBufferStreamLayout_NativeInterop(ref VertexBufferStreamLayout layout)
        {
            // init defaults
            descCount    = 0;
            descs        = null;
            elementCount = 0;
            elements     = null;

            // init descriptions
            if (layout.descs != null)
            {
                descCount = layout.descs.Length;
                descs     = (VertexBufferStreamDesc_NativeInterop *)Marshal.AllocHGlobal(Marshal.SizeOf <VertexBufferStreamDesc_NativeInterop>() * descCount);
                for (int i = 0; i != descCount; ++i)
                {
                    descs[i] = new VertexBufferStreamDesc_NativeInterop(ref layout.descs[i]);
                }
            }

            // init elements
            if (layout.elements != null)
            {
                elementCount = layout.elements.Length;
                elements     = (VertexBufferStreamElement_NativeInterop *)Marshal.AllocHGlobal(Marshal.SizeOf <VertexBufferStreamElement_NativeInterop>() * elementCount);
                for (int i = 0; i != elementCount; ++i)
                {
                    elements[i] = new VertexBufferStreamElement_NativeInterop(ref layout.elements[i]);
                }
            }
        }
 public void Dispose()
 {
     if (elements != null)
     {
         Marshal.FreeHGlobal((IntPtr)elements);
         elements = null;
     }
 }