public override string ToString() { return(string.Concat( nameof(BufferHandle) + "=", BufferHandle.ToString(), ", " + nameof(BufferTarget) + "=", BufferTarget.ToString(), ", " + nameof(StorageOffsetInBytes) + "=", StorageOffsetInBytes.ToString(), ", " + nameof(StorageLengthInBytes) + "=", StorageLengthInBytes.ToString() )); }
/// <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(); } }
// \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 }
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 }