using StgSharp.Graphics; using StgSharp.Math; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace StgSharp.Logic { internal unsafe class GLparamQueue { private string _dequeueLog = "\n"; internal GLcontext* context; private ConcurrentQueue paramQueue; private ConcurrentQueue streamQueue; public GLparamQueue() { paramQueue = new ConcurrentQueue(); streamQueue = new ConcurrentQueue(); } internal void ShowDequeueLog() { Console.WriteLine(_dequeueLog); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(Vec4d v) { paramQueue.Enqueue(v); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(M128 m) { Console.WriteLine(m.ToString(10)); paramQueue.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(uint u0) { M128 m = default; m.Write(0, u0); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(uint u0, uint u1) { M128 m = default; m.Write(0, u0); m.Write(1, u1); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(ulong u0, ulong u1) { M128 m = default; m.Write(0, u0); m.Write(1, u1); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(uint u0, uint u1, uint u2) { M128 m = default; m.Write(0, u0); m.Write(1, u1); m.Write(2, u2); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(float f0, float f1, float f2) { M128 m = default; m.Write(0, f0); m.Write(1, f1); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(float f0, float f1, float f2, float f3) { M128 m = default; m.Write(0, f0); m.Write(1, f1); m.Write(2, f2); m.Write(3, f3); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(IntPtr p0, IntPtr p1) { M128 m = default; m.Write(0, (ulong)p0); m.Write(1, (ulong)p1); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(IntPtr p) { M128 m = default; m.Write(0, (ulong)p); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(glHandle handle) { M128 m = default; m.Write(0, (ulong)handle.valuePtr); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(glHandle handle, glHandle handle1) { M128 m = default; m.Write(0, (ulong)handle.valuePtr); m.Write(1, (ulong)handle1.valuePtr); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(int i0) { M128 m = default; m.Write(0, i0); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(int i0, int i1) { M128 m = default; m.Write(0, i0); m.Write(1, i1); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(int i0, int i1, int i2) { M128 m = default; m.Write(0, i0); m.Write(1, i1); m.Write(2, i2); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(int i0, int i1, int i2, int i3) { M128 m = default; m.Write(0, i0); m.Write(1, i1); m.Write(2, i2); m.Write(3, i3); this.Enqueue(m); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(string str) { byte[] code = Encoding.UTF8.GetBytes(str); streamQueue.Enqueue(glArrayHandle.Alloc(code)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(T[] array) where T : struct { streamQueue.Enqueue(glArrayHandle.Alloc(array)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out glArrayHandle arrayHandle) { glArrayHandle handle = default; if (streamQueue.TryDequeue(out handle)) { arrayHandle = handle; } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool TryDequeue(out M128 m) { bool ret = paramQueue.TryDequeue(out m); _dequeueLog += $"{m.ToString(10)}\n"; return ret; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out Vec4d v) { M128 m; if (this.TryDequeue(out m)) { v = *(Vec4d*)&m; } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out T[] array) { glArrayHandle output = default; if (streamQueue.TryDequeue(out output)) { array = output.copy as T[]; } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out int i0) { M128 ret; if (this.TryDequeue(out ret)) { i0 = ret.Read(0); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out int i0, out int i1) { M128 ret; if (this.TryDequeue(out ret)) { i0 = ret.Read(0); i1 = ret.Read(1); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out int i0, out int i1, out int i2) { M128 ret; if (this.TryDequeue(out ret)) { i0 = ret.Read(0); i1 = ret.Read(1); i2 = ret.Read(2); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out int i0, out int i1, out int i2, out int i3) { M128 ret; if (this.TryDequeue(out ret)) { i0 = ret.Read(0); i1 = ret.Read(1); i2 = ret.Read(2); i3 = ret.Read(3); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out IntPtr p) { M128 ret; if (this.TryDequeue(out ret)) { p = (IntPtr)ret.Read(0); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out IntPtr p0, out IntPtr p1) { M128 ret; if (this.TryDequeue(out ret)) { p0 = (IntPtr)ret.Read(0); p1 = (IntPtr)ret.Read(1); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out float f0, out float f1, out float f2, out float f3) { M128 ret; if (this.TryDequeue(out ret)) { f0 = ret.Read(0); f1 = ret.Read(1); f2 = ret.Read(2); f3 = ret.Read(3); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out float f0, out float f1, out float f2) { M128 ret; if (this.TryDequeue(out ret)) { f0 = ret.Read(0); f1 = ret.Read(1); f2 = ret.Read(2); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out uint u0) { M128 ret; if (this.TryDequeue(out ret)) { u0 = ret.Read(0); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out uint u0, out uint u1) { M128 ret; if (this.TryDequeue(out ret)) { u0 = ret.Read(0); u1 = ret.Read(1); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out uint u0, out uint u1, out uint u2) { M128 ret; if (this.TryDequeue(out ret)) { u0 = ret.Read(0); u1 = ret.Read(1); u2 = ret.Read(2); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void TryDequeue(out uint u0, out uint u1, out uint u2, out uint u3) { M128 ret; if (this.TryDequeue(out ret)) { u0 = ret.Read(0); u1 = ret.Read(1); u2 = ret.Read(2); u3 = ret.Read(3); } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } internal void SetContext(GLcontext* p) { context = p; } internal void TryDequeue(out Array array) { glArrayHandle output = default; if (streamQueue.TryDequeue(out output)) { array = output.copy; } else { InternalIO.InternalWriteLog("No param in buffer when calling gl function.", LogType.Error); throw new Exception(); } } } }