Example #1
0
        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);
        }
Example #2
0
        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);
        }