internal IDisposable GetNativeObject() { if (Disposed) { Log.Fatal("GpuVertexBuffer: GetNativeObject: Disposed."); } EngineThreading.CheckMainThread(); if (Flags.HasFlag(GpuBufferFlags.Dynamic) || Flags.HasFlag(GpuBufferFlags.ComputeWrite)) { ////delete old static when changed to dynamic //if( realObject != null && realObject is SharpBgfx.VertexBuffer ) //{ // realObject.Dispose(); // realObject = null; //} if (realObject == null) { var nativeFlags = SharpBgfx.BufferFlags.ComputeRead; // | SharpBgfx.BufferFlags.ComputeTypeFloat; if (Flags.HasFlag(GpuBufferFlags.ComputeWrite)) { nativeFlags |= SharpBgfx.BufferFlags.ComputeWrite; } realObject = new SharpBgfx.DynamicVertexBuffer(vertexCount, vertexDeclaration, nativeFlags); dynamic_needUpdateNative = true; } if (!Flags.HasFlag(GpuBufferFlags.ComputeWrite)) { if (dynamic_needUpdateNative) { dynamic_needUpdateNative = false; var buffer = (SharpBgfx.DynamicVertexBuffer)realObject; var memory = RendererMemoryUtility.AllocateAutoReleaseMemoryBlock(new ArraySegment <byte>(vertices, 0, vertexCountActual * vertexSize)); buffer.Update(0, memory); } } } else { if (realObject == null) { var memory = RendererMemoryUtility.AllocateAutoReleaseMemoryBlock(vertices); realObject = new SharpBgfx.VertexBuffer(memory, vertexDeclaration, SharpBgfx.BufferFlags.ComputeRead /* | SharpBgfx.BufferFlags.ComputeTypeFloat*/); } } return(realObject); }
internal IDisposable GetNativeObject() { if (Disposed) { Log.Fatal("GpuIndexBuffer: GetNativeObject: Disposed."); } EngineThreading.CheckMainThread(); if (Flags.HasFlag(GpuBufferFlags.Dynamic) || Flags.HasFlag(GpuBufferFlags.ComputeWrite)) { ////delete old static when changed to dynamic //if( realObject != null && realObject is SharpBgfx.IndexBuffer ) //{ // realObject.Dispose(); // realObject = null; //} if (realObject == null) { var nativeFlags = SharpBgfx.BufferFlags.Index32 | SharpBgfx.BufferFlags.ComputeRead; // | SharpBgfx.BufferFlags.ComputeTypeFloat; if (Flags.HasFlag(GpuBufferFlags.ComputeWrite)) { nativeFlags |= SharpBgfx.BufferFlags.ComputeWrite; } //dynamic buffers are always 32-bit realObject = new SharpBgfx.DynamicIndexBuffer(indices.Length, nativeFlags); dynamic_needUpdateNative = true; realObject16Bit = false; } if (!Flags.HasFlag(GpuBufferFlags.ComputeWrite)) { if (dynamic_needUpdateNative) { dynamic_needUpdateNative = false; var buffer = (SharpBgfx.DynamicIndexBuffer)realObject; var memory = RendererMemoryUtility.AllocateAutoReleaseMemoryBlock(new ArraySegment <int>(indices, 0, indexCountActual)); buffer.Update(0, memory); } } } else { if (realObject == null) { bool use16Bit = true; foreach (var index in indices) { if (index > 65535) { use16Bit = false; break; } } if (use16Bit) { var indices16 = new ushort[indices.Length]; for (int n = 0; n < indices16.Length; n++) { indices16[n] = (ushort)indices[n]; } var memory = RendererMemoryUtility.AllocateAutoReleaseMemoryBlock(indices16); realObject = new SharpBgfx.IndexBuffer(memory, SharpBgfx.BufferFlags.ComputeRead /* | SharpBgfx.BufferFlags.ComputeTypeFloat*/); } else { var memory = RendererMemoryUtility.AllocateAutoReleaseMemoryBlock(indices); realObject = new SharpBgfx.IndexBuffer(memory, SharpBgfx.BufferFlags.Index32 | SharpBgfx.BufferFlags.ComputeRead /* | SharpBgfx.BufferFlags.ComputeTypeFloat*/); } realObject16Bit = use16Bit; } } return(realObject); }