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