Example #1
0
 public override string ToString()
 {
     return(string.Concat(
                nameof(BufferHandle) + "=", BufferHandle.ToString(),
                ", " + nameof(BufferTarget) + "=", BufferTarget.ToString(),
                ", " + nameof(StorageOffsetInBytes) + "=", StorageOffsetInBytes.ToString(),
                ", " + nameof(StorageLengthInBytes) + "=", StorageLengthInBytes.ToString()
                ));
 }
Example #2
0
        /// <summary>
        /// Updates a subset of the buffer object's data store.
        /// </summary>
        /// <param name="data">The new data that will be copied to the data store.</param>
        /// <param name="size">The size in bytes of the data store region being replaced.</param>
        /// <param name="offset">The offset in bytes into the buffer object's data store where data replacement will begin.</param>
        public void BufferSubData(T[] data, int size, int offset)
        {
            if (BufferTarget != OpenGL.BufferTarget.ArrayBuffer && BufferTarget != OpenGL.BufferTarget.ElementArrayBuffer &&
                BufferTarget != OpenGL.BufferTarget.PixelPackBuffer && BufferTarget != OpenGL.BufferTarget.PixelUnpackBuffer)
            {
                throw new InvalidOperationException(string.Format("BufferSubData cannot be called with a BufferTarget of type {0}", BufferTarget.ToString()));
            }

            GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);

            try
            {
                Gl.BindBuffer(this);
                Gl.BufferSubData(BufferTarget, (IntPtr)offset, (IntPtr)size, handle.AddrOfPinnedObject());
            }
            finally
            {
                handle.Free();
            }
        }
Example #3
0
        //  \brief Copies all buffer ranges to buffer
        public void UpdateAll()
        {
            lock (this)
            {
                int  newSize     = 0;
                bool sizeChanged = false;
                foreach (var bufferRange in bufferRanges)
                {
                    newSize += (int)bufferRange.Size;
                }
                Use();
#if DEBUG_BUFFER_OBJECTS
                System.Diagnostics.Debug.WriteLine("Buffer.UpdateAll() " + bufferObject + " with " + bufferRanges.Count.ToString() + " BufferRanges, BufferObject = " + BufferObject + ", new size = " + newSize + ", old size = " + size);
#endif
                if (newSize != size)
                {
#if DEBUG_BUFFER_OBJECTS
                    //Debug.WriteLine("Buffer.UpdateAll() " + bufferObject + " with " + bufferRanges.Count.ToString() + " BufferRanges, BufferObject = " + BufferObject +  " new size = " + newSize +  " old size + " + size);
                    System.Console.WriteLine("BufferRL.UpdateAll() " + bufferObject.ToString("X") + " with " + bufferRanges.Count.ToString() + " BufferRanges, new size = " + newSize + " old size " + size);
#endif
                    size        = newSize;
                    sizeChanged = true;
                    RL.BufferData(
                        bufferTarget,
                        size,
                        IntPtr.Zero,
                        bufferUsageHint
                        );
                }

                //long align = 0xf;
                int offset = 0;

#if DEBUG_BUFFER_OBJECTS
                Debug.WriteLine("Buffer.UpdateAll() with " + bufferRanges.Count.ToString() + " BufferRanges, BufferObject = " + BufferObject + " " + bufferTarget.ToString());
#endif

                //  Collect all buffer range data to a single MemoryStream
                foreach (var bufferRange in bufferRanges)
                {
                    //  Write buffer range to memory stream
                    bufferRange.WriteTo(offset, sizeChanged);

                    //  EXtra alignment just in case
                    offset += (int)bufferRange.Size;
                    //long padding = (-size) & (align - 1);  //  = align - (size & (align - 1))
                    //size = (size + align - 1) & ~(align - 1);
                    //memoryStream.Seek(size, SeekOrigin.Begin);
                    //Debug.WriteLine("Padding " + padding.ToString());
                }
            }

#if DEBUG_BUFFER_OBJECTS
            System.Diagnostics.Debug.WriteLine("Buffer.UpdateAll() " + bufferObject + " total size " + size);
#endif
        }
Example #4
0
        public void UpdateAll()
        {
            lock (this)
            {
                if (OpenTK.Graphics.GraphicsContext.CurrentContext == null)
                {
#if DEBUG_BUFFER_OBJECTS
                    System.Diagnostics.Debug.WriteLine("Buffer.UpdateAll() - delayed");
#endif
                    lock (delayedUpdates)
                    {
                        delayedUpdates.Add(this);
                        return;
                    }
                }

                long newSize     = 0;
                bool sizeChanged = false;
                foreach (var bufferRange in bufferRanges)
                {
                    newSize += bufferRange.Size;
                }
                UseGL();
#if DEBUG_BUFFER_OBJECTS
                System.Diagnostics.Debug.WriteLine("Buffer.UpdateAll() " + bufferObject + " with " + bufferRanges.Count.ToString() + " BufferRanges, BufferObject = " + BufferObject + ", new size = " + newSize + ", old size = " + size);
#endif
                if (newSize != size)
                {
#if DEBUG_BUFFER_OBJECTS
                    //Debug.WriteLine("Buffer.UpdateAll() " + bufferObject + " with " + bufferRanges.Count.ToString() + " BufferRanges, BufferObject = " + BufferObject +  " new size = " + newSize +  " old size + " + size);
#endif
                    size        = newSize;
                    sizeChanged = true;
                    GL.BufferData(
                        BufferTargetGL,
                        (System.IntPtr)(size),
                        System.IntPtr.Zero,
                        bufferUsageHint
                        );
                }

                //long align = 0xf;
                long offset = 0;

#if DEBUG_BUFFER_OBJECTS
                Debug.WriteLine("Buffer.UpdateAll() with " + bufferRanges.Count.ToString() + " BufferRanges, BufferObject = " + BufferObject + " " + bufferTarget.ToString());
#endif

                //  Collect all buffer range data to a single MemoryStream
                foreach (var bufferRange in bufferRanges)
                {
                    //  Write buffer range to memory stream
                    bufferRange.WriteTo(offset, sizeChanged);

                    //  EXtra alignment just in case
                    offset += bufferRange.Size;
                    //long padding = (-size) & (align - 1);  //  = align - (size & (align - 1))
                    //size = (size + align - 1) & ~(align - 1);
                    //memoryStream.Seek(size, SeekOrigin.Begin);
                    //Debug.WriteLine("Padding " + padding.ToString());
                }
            }

#if DEBUG_BUFFER_OBJECTS
            System.Diagnostics.Debug.WriteLine("Buffer.UpdateAll() " + bufferObject + " total size " + size);
#endif
        }