internal unsafe void MoveToGPU() { var context = MyImmediateRC.RC.DeviceContext; if (m_tableDirty) { var array = m_instancingTable.Data; fixed(void *ptr = array) { var intPtr = new IntPtr(ptr); MyHwBuffers.ResizeAndUpdateStaticStructuredBuffer(ref m_indirectionBuffer, array.Length, sizeof(MyInstancingTableEntry), intPtr, "MyMergeInstancing/Tables", context); m_SRVs[0] = m_indirectionBuffer.Srv; } m_tableDirty = false; } if (m_instancesDataDirty) { var array = m_perInstance.Data; fixed(void *ptr = array) { var intPtr = new IntPtr(ptr); if (m_instanceBuffer != StructuredBufferId.NULL && m_instanceBuffer.Capacity < array.Length) { MyHwBuffers.Destroy(m_instanceBuffer); m_instanceBuffer = StructuredBufferId.NULL; m_SRVs[1] = null; } if (m_instanceBuffer == StructuredBufferId.NULL) { m_instanceBuffer = MyHwBuffers.CreateStructuredBuffer(array.Length, sizeof(MyPerInstanceData), true, intPtr, "MyMergeInstancing instances"); m_SRVs[1] = m_instanceBuffer.Srv; } else { var mapping = MyMapping.MapDiscard(context, m_instanceBuffer.Buffer); mapping.WriteAndPosition(array, 0, array.Length); mapping.Unmap(); } } m_instancesDataDirty = false; } }