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 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 IntPtr GetString(int paramId) { var stringGetMemoryName = $"glGetString{paramId}"; // Check if already gotten and allocated memory for it. IntPtr ptr = UnmanagedMemoryAllocator.GetNamedMemory(stringGetMemoryName, out int _); if (ptr != IntPtr.Zero) { return(ptr); } // Extensions are gotten from another function. string value; if (paramId == (int)StringName.Extensions) { value = _gl.InvokeUnmarshalled <string>("GetGLExtensions"); } else { value = _gl.InvokeUnmarshalled <int, string>("glGet", paramId); } //Engine.Log.Trace($"String query {(StringName) paramId} got {value}", "WebGLInternal"); ptr = NativeHelpers.StringToPtr(value); UnmanagedMemoryAllocator.RegisterAllocatedMemory(ptr, stringGetMemoryName, value.Length * sizeof(char)); return(ptr); }
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 IntPtr MapBuffer(int target, int access) { _boundBuffers.TryGetValue(target, out uint boundBuffer); var memoryName = $"DataBuffer{target}|{boundBuffer}"; IntPtr memory = UnmanagedMemoryAllocator.GetNamedMemory(memoryName, out int bufferSize); _bufferMapping.TryGetValue(boundBuffer, out BufferMappingState state); if (state == null) { state = new BufferMappingState(); _bufferMapping.Add(boundBuffer, state); } state.Mapping = true; state.RangeStart = 0; state.RangeLength = bufferSize; return(memory); }
private IntPtr MapBufferRange(int target, IntPtr offset, uint length, uint access) { _boundBuffers.TryGetValue(target, out uint boundBuffer); var memoryName = $"DataBuffer{target}|{boundBuffer}"; IntPtr memory = UnmanagedMemoryAllocator.GetNamedMemory(memoryName, out int _); _bufferMapping.TryGetValue(boundBuffer, out BufferMappingState state); if (state == null) { state = new BufferMappingState(); _bufferMapping.Add(boundBuffer, state); } state.Mapping = true; state.RangeStart = (int)offset; state.RangeLength = (int)length; //Engine.Log.Info($"Starting map range of buffer {boundBuffer} in range {offset}:{length}", "WebGLInternal"); return(memory + state.RangeStart); }