private void BufferSubData(int target, IntPtr offset, uint size, IntPtr ptr) { _boundBuffers.TryGetValue(target, out uint boundBuffer); var memoryName = $"DataBuffer{target}|{boundBuffer}"; var offsetInt = (int)offset; // It is assumed that the offset and size are valid per the already allocated buffer. // Check just in case. IntPtr wholeBuffer = UnmanagedMemoryAllocator.GetNamedMemory(memoryName, out int allocatedSize); if (offsetInt + size > allocatedSize) { Engine.Log.Error($"Invalid uploading sub data of {boundBuffer} in range {offsetInt}:{size}. Buffer is {allocatedSize} long.", "WebGLInternal"); return; } // Update driver copy, in case of mapping. This could potentially be useless as mapping might not be used. NativeHelpers.MemCopy(ptr, IntPtr.Add(wholeBuffer, offsetInt), (int)size); var args = new BufferDataArgs { Ptr = ptr, Target = target, Offset = offsetInt, Length = size }; _gl.InvokeUnmarshalled <BufferDataArgs, object>("glBufferSubData", args); }
private bool UnmapBuffer(int target) { _boundBuffers.TryGetValue(target, out uint boundBuffer); var memoryName = $"DataBuffer{target}|{boundBuffer}"; IntPtr memory = UnmanagedMemoryAllocator.GetNamedMemory(memoryName, out int size); _bufferMapping.TryGetValue(boundBuffer, out BufferMappingState state); if (state == null || !state.Mapping) { return(true); } state.Mapping = false; state.RangeStart = 0; state.RangeLength = 0; //Engine.Log.Info($"Flushing buffer {boundBuffer}"); var args = new BufferDataArgs { //Usage = _bufferUsage[boundBuffer], //SizeWholeBuffer = (uint) bufferSize, Ptr = memory, Target = target, Offset = 0, Length = (uint)size }; _gl.InvokeUnmarshalled <BufferDataArgs, object>("glBufferSubData", args); return(true); }
private void FlushMappedRange(int target, IntPtr offset, uint length) { _boundBuffers.TryGetValue(target, out uint boundBuffer); var memoryName = $"DataBuffer{target}|{boundBuffer}"; IntPtr ptr = UnmanagedMemoryAllocator.GetNamedMemory(memoryName, out int _); _bufferMapping.TryGetValue(boundBuffer, out BufferMappingState state); if (state == null || !state.Mapping) { return; } int bufferStart = (int)offset + state.RangeStart; state.Mapping = false; state.RangeStart = 0; state.RangeLength = 0; //Engine.Log.Infoe($"Flushing buffer {boundBuffer} in range {offset}:{length}"); //if (target == (int) BufferTarget.ArrayBuffer) //{ // var test = new Span<VertexData>((void*)(ptr + (int)offset), (int) length / VertexData.SizeInBytes); // for (var i = 0; i < test.Length; i++) // { // Console.Write(test[i].Vertex + ", "); // } // Console.Write("\n"); //} //else if (target == (int) BufferTarget.ElementArrayBuffer) //{ // var test = new Span<ushort>((void*)(ptr + (int)offset), (int) length / sizeof(ushort)); // for (var i = 0; i < test.Length; i++) // { // Console.Write(test[i] + ", "); // } // Console.Write("\n"); //} var args = new BufferDataArgs { //Usage = _bufferUsage[boundBuffer], //SizeWholeBuffer = (uint) bufferSize, Ptr = ptr + bufferStart, Target = target, Offset = bufferStart, Length = length }; _gl.InvokeUnmarshalled <BufferDataArgs, object>("glBufferSubData", args); }
private void BufferData(int target, uint size, IntPtr ptr, int usage) { _boundBuffers.TryGetValue(target, out uint boundBuffer); var memoryName = $"DataBuffer{target}|{boundBuffer}"; if (ptr == IntPtr.Zero) { ptr = UnmanagedMemoryAllocator.MemAllocOrReAllocNamed((int)size, memoryName); } else { // Pointer passed from outside. Copy its data. IntPtr allocatedMemory = UnmanagedMemoryAllocator.MemAllocOrReAllocNamed((int)size, memoryName); NativeHelpers.MemCopy(ptr, allocatedMemory, (int)size); ptr = allocatedMemory; } if (usage != -1) { _bufferUsage[boundBuffer] = usage; } else { usage = _bufferUsage[boundBuffer]; } var args = new BufferDataArgs { Usage = usage, SizeWholeBuffer = size, Ptr = ptr, Target = target, Offset = 0, Length = size }; _gl.InvokeUnmarshalled <BufferDataArgs, object>("glBufferData", args); }