예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }