using StgSharp.Logic; using StgSharp.Math; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace StgSharp.Graphics { internal unsafe partial class GLonUpdate : IglFunc { private IntPtr ActiveTexturePtr = (IntPtr)(delegate*)&InternalActiveTexture; private IntPtr AttachShaderPtr = (IntPtr)(delegate*)&InternalAttachShader; private IntPtr BindBufferPtr = (IntPtr)(delegate*)&InternalBindBuffer; private IntPtr BindTexturePtr = (IntPtr)(delegate*)&InternalBindTexture; private IntPtr BindVertexArrayPtr = (IntPtr)(delegate*)&InternalBindVertexArray; private IntPtr BufferDataPtr = (IntPtr)(delegate*)&InternalSetBufferData; private IntPtr CanUpdatePtr = (IntPtr)(delegate*)&InternalFrameCanUpdate; private IntPtr ClearColorPtr = (IntPtr)(delegate*)&InternalClearColor; private IntPtr ClearGraphicErrorPtr = (IntPtr)(delegate*)&InternalClearGraphicError; private IntPtr ClearPtr = (IntPtr)(delegate*)&InternalClear; private IntPtr CompileShaderPtr = (IntPtr)(delegate*)&InternalCompileShader; private IntPtr CreateProgramPtr = (IntPtr)(delegate*)&InternalCreateProgram; private IntPtr CreateProgramSetPtr = (IntPtr)(delegate*)&InternalCreateProgramSet; private IntPtr CreateShaderPtr = (IntPtr)(delegate*)&InternalCreateShader; private IntPtr DeleBufferPtr = (IntPtr)(delegate*)&InternalDeleteBuffer; private IntPtr DeleteVertexArrayPtr = (IntPtr)(delegate*)&InternalDeleteVertexArrays; private IntPtr DrawElementsPtr = (IntPtr)(delegate*)&InternalDrawElements; private IntPtr GenBufferPtr = (IntPtr)(delegate*)&InternalGenBuffers; private IntPtr GenTexturesPtr = (IntPtr)(delegate*)&InternalGenTextures; private IntPtr GenVertexArraysPtr = (IntPtr)(delegate*)&InternalGenVertexArrays; private IntPtr GetUniformLocationPtr = (IntPtr)(delegate*)&InternalGetUniformLocation; private IntPtr SetVertexArrayPtr = (IntPtr)(delegate*)&InternalSetVertexAttribute; private IntPtr ShaderSourcePtr = (IntPtr)(delegate*)&InternalShaderSource; private IntPtr textureImage2dPtr = (IntPtr)(delegate*)&InternalTextureImage2d; private IntPtr TextureParameterPtr = (IntPtr)(delegate*)&InternalTextureParameter; private IntPtr UseProgramPtr = (IntPtr)(delegate*)&InternalUseProgram; private IntPtr ViewPortPtr = (IntPtr)(delegate*)&InternalViewport; private static void InternalActiveTexture() { uint t; paramQueue.TryDequeue(out t); paramQueue.context->glActiveTexture(t); } private static void InternalAttachShader() { uint p, s; paramQueue.TryDequeue(out p, out s); paramQueue.context->glAttachShader(p, s); } private static void InternalBindBuffer() { M128 m = new M128(); paramQueue.TryDequeue(out m); uint usage = m.Read(0); uint handle = *(uint*)m.Read(1); paramQueue.context->glBindBuffer(usage, handle); } private static void InternalBindTexture() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glBindTexture( m.Read(0), *(uint*)m.Read(1) ); } private static void InternalBindVertexArray() { IntPtr i; paramQueue.TryDequeue(out i); paramQueue.context->glBindVertexArray(*(uint*)i); } private static void InternalClear() { uint mt; paramQueue.TryDequeue(out mt); paramQueue.context->glClear(mt); } private static void InternalClearColor() { float r, g, b, a; paramQueue.TryDequeue(out r, out g, out b, out a); paramQueue.context->glClearColor(r, g, b, a); } private static void InternalClearGraphicError() { while (paramQueue.context->glGetError() != 0) { } } private static unsafe void InternalCompileShader() { IntPtr handle = default; paramQueue.TryDequeue(out handle); paramQueue.context->glCompileShader(*(uint*)handle); } private static void InternalCreateProgram() { IntPtr programHandle = default; paramQueue.TryDequeue(out programHandle); *(uint*)programHandle = paramQueue.context->glCreateProgram(); } private static void InternalCreateProgramSet() { uint* programHandle; M128 m = default; paramQueue.TryDequeue(out m); programHandle = (uint*)m.Read(0); for (int i = 0; i < m.Read(2); i++) { *(programHandle + i) = paramQueue.context->glCreateProgram(); } } private static unsafe void InternalCreateShader() { M128 m = default; paramQueue.TryDequeue(out m); int count = m.Read(0); uint type = m.Read(1); uint* handle = (uint*)m.Read(1); for (int i = 0; i < count; i++) { *(handle + i) = paramQueue.context->glCreateShader(type); } } private static void InternalDeleteBuffer() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glDeleteBuffers(m.Read(2), (uint*)m.Read(0)); for (int i = 0; i < m.Read(2); i++) { *((uint*)m.Read(0) + i) = 0; } } private static void InternalDeleteVertexArrays() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glDeleteVertexArrays((uint)m.Read(0), (uint*)m.Read(0)); } private static void InternalDrawElements() { uint mode, count, type; IntPtr ptr; paramQueue.TryDequeue(out mode, out count, out type); paramQueue.TryDequeue(out ptr); paramQueue.context->glDrawElements(mode, count, type, (void*)ptr); } private static void InternalFrameCanUpdate() { IntPtr ptr; paramQueue.TryDequeue(out ptr); Interlocked.Add(ref *(int*)ptr, -1); } private static void InternalGenBuffers() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glGenBuffers(m.Read(2), (uint*)m.Read(0)); } private static void InternalGenTextures() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glGenTextures(m.Read(2), (uint*)m.Read(0)); } private static void InternalGenVertexArrays() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glGenVertexArrays(m.Read(2), (uint*)m.Read(0)); } private static void InternalGetUniformLocation() { IntPtr programHandle = default, nameHandle = default, targetHandle = default; paramQueue.TryDequeue(out programHandle, out nameHandle); paramQueue.TryDequeue(out targetHandle); *(int*)targetHandle = paramQueue.context->glGetUniformLocation(*(uint*)programHandle, (byte*)nameHandle); } private static void InternalSetBufferData() { uint type = 0, use = 0; IntPtr size = default; glArrayHandle array = default; paramQueue.TryDequeue(out type, out use); paramQueue.TryDequeue(out size); paramQueue.TryDequeue(out array); paramQueue.context->glBufferData(type, size, array.AddressOfArray(), use); } private static void InternalSetVertexAttribute() { uint index, type, stride; int size, normalized, pointer; paramQueue.TryDequeue(out index, out type, out stride); paramQueue.TryDequeue(out size, out normalized, out pointer); paramQueue.context->glVertexAttribPointer(index, size, type, normalized, stride, (void*)pointer); paramQueue.context->glEnableVertexAttribArray(index); } private static unsafe void InternalShaderSource() { IntPtr handle = default; glArrayHandle stream = default; paramQueue.TryDequeue(out handle); paramQueue.TryDequeue(out stream); IntPtr buffer = stream.AddressOfArray(); paramQueue.context->glShaderSource(*(uint*)handle, 1, (byte**)&buffer, (void*)0); } private static void InternalTextureImage2d() { IntPtr pix = IntPtr.Zero; uint target, level, internalFormat, width, height, format, type; paramQueue.TryDequeue(out pix); paramQueue.TryDequeue(out level, out internalFormat, out width, out height); paramQueue.TryDequeue(out target, out format, out type); paramQueue.context->glTexImage2D(target, (int)level, internalFormat, width, height, 0, format, type, (void*)pix); } private static void InternalTextureParameter() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glTextureParameteri(m.Read(0), m.Read(2), m.Read(3)); } private static void InternalUseProgram() { IntPtr handle = IntPtr.Zero; paramQueue.TryDequeue(out handle); paramQueue.context->glUseProgram(*(uint*)handle); } private static void InternalViewport() { M128 m = default; paramQueue.TryDequeue(out m); paramQueue.context->glViewport(m.Read(0), m.Read(1), m.Read(2), m.Read(3)); } private void InternalMakeContexCurrent(Form form) { throw new NotImplementedException(); } private void InternalSwitchContext() { throw new NotImplementedException(); } } }