From 68c6aa664a9e8412a2551dc008784cc9175536e2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 13 Dec 2012 15:47:29 +0100 Subject: [PATCH] Replaced OpenGL namespace with static class Fixed OpenGL functions not being exported It is also more consistent Former-commit-id: 3eddcb6f72412443eb56580180d0b9544ae4a9df --- include/Nazara/Renderer/OpenGL.hpp | 85 +- src/Nazara/Renderer/OpenGL.cpp | 1523 ++++++++++++++-------------- 2 files changed, 803 insertions(+), 805 deletions(-) diff --git a/include/Nazara/Renderer/OpenGL.hpp b/include/Nazara/Renderer/OpenGL.hpp index e8508487f..ea1da6a92 100644 --- a/include/Nazara/Renderer/OpenGL.hpp +++ b/include/Nazara/Renderer/OpenGL.hpp @@ -43,52 +43,53 @@ enum nzOpenGLExtension using NzOpenGLFunc = void (*)(); -namespace NzOpenGL +class NAZARA_API NzOpenGL { - enum FormatType - { - FormatType_RenderBuffer, -// FormatType_MultisampleTexture, - FormatType_Texture - }; + public: + enum FormatType + { + FormatType_RenderBuffer, + // FormatType_MultisampleTexture, + FormatType_Texture + }; - struct Format - { - GLenum dataFormat; - GLenum dataType; - GLint internalFormat; - }; + struct Format + { + GLenum dataFormat; + GLenum dataType; + GLint internalFormat; + }; - NzOpenGLFunc GetEntry(const NzString& entryPoint); - unsigned int GetVersion(); - bool Initialize(); - bool IsSupported(nzOpenGLExtension extension); - bool IsSupported(const NzString& string); - bool TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType target); - void Uninitialize(); + static NzOpenGLFunc GetEntry(const NzString& entryPoint); + static unsigned int GetVersion(); + static bool Initialize(); + static bool IsSupported(nzOpenGLExtension extension); + static bool IsSupported(const NzString& string); + static bool TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType target); + static void Uninitialize(); - extern GLenum Attachment[nzAttachmentPoint_Max+1]; - extern nzUInt8 AttributeIndex[nzElementUsage_Max+1]; - extern GLenum BlendFunc[nzBlendFunc_Max+1]; - extern GLenum BufferLock[nzBufferAccess_Max+1]; - extern GLenum BufferLockRange[nzBufferAccess_Max+1]; - extern GLenum BufferTarget[nzBufferType_Max+1]; - extern GLenum BufferTargetBinding[nzBufferType_Max+1]; - extern GLenum BufferUsage[nzBufferUsage_Max+1]; - extern GLenum CubemapFace[6]; // Un cube possède six faces et ça n'est pas prêt de changer - extern GLenum ElementType[nzElementType_Max+1]; - extern GLenum FaceCulling[nzFaceCulling_Max+1]; - extern GLenum FaceFilling[nzFaceFilling_Max+1]; - extern GLenum PrimitiveType[nzPrimitiveType_Max+1]; - extern GLenum RendererComparison[nzRendererComparison_Max+1]; - extern GLenum RendererParameter[nzRendererParameter_Max+1]; - extern GLenum ShaderType[nzShaderType_Max+1]; - extern GLenum StencilOperation[nzStencilOperation_Max+1]; - extern GLenum TextureTarget[nzImageType_Max+1]; - extern GLenum TextureTargetBinding[nzImageType_Max+1]; - extern GLenum TextureTargetProxy[nzImageType_Max+1]; - extern GLenum TextureWrapMode[nzTextureWrap_Max+1]; -} + static GLenum Attachment[nzAttachmentPoint_Max+1]; + static nzUInt8 AttributeIndex[nzElementUsage_Max+1]; + static GLenum BlendFunc[nzBlendFunc_Max+1]; + static GLenum BufferLock[nzBufferAccess_Max+1]; + static GLenum BufferLockRange[nzBufferAccess_Max+1]; + static GLenum BufferTarget[nzBufferType_Max+1]; + static GLenum BufferTargetBinding[nzBufferType_Max+1]; + static GLenum BufferUsage[nzBufferUsage_Max+1]; + static GLenum CubemapFace[6]; // Un cube possède six faces et ça n'est pas prêt de changer + static GLenum ElementType[nzElementType_Max+1]; + static GLenum FaceCulling[nzFaceCulling_Max+1]; + static GLenum FaceFilling[nzFaceFilling_Max+1]; + static GLenum PrimitiveType[nzPrimitiveType_Max+1]; + static GLenum RendererComparison[nzRendererComparison_Max+1]; + static GLenum RendererParameter[nzRendererParameter_Max+1]; + static GLenum ShaderType[nzShaderType_Max+1]; + static GLenum StencilOperation[nzStencilOperation_Max+1]; + static GLenum TextureTarget[nzImageType_Max+1]; + static GLenum TextureTargetBinding[nzImageType_Max+1]; + static GLenum TextureTargetProxy[nzImageType_Max+1]; + static GLenum TextureWrapMode[nzTextureWrap_Max+1]; +}; NAZARA_API extern PFNGLACTIVETEXTUREPROC glActiveTexture; NAZARA_API extern PFNGLATTACHSHADERPROC glAttachShader; diff --git a/src/Nazara/Renderer/OpenGL.cpp b/src/Nazara/Renderer/OpenGL.cpp index 71fbe62ab..007e69044 100644 --- a/src/Nazara/Renderer/OpenGL.cpp +++ b/src/Nazara/Renderer/OpenGL.cpp @@ -106,810 +106,807 @@ namespace } } -namespace NzOpenGL +NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint) { - NzOpenGLFunc GetEntry(const NzString& entryPoint) + return LoadEntry(entryPoint.GetConstBuffer(), false); +} + +unsigned int NzOpenGL::GetVersion() +{ + return openGLversion; +} + +bool NzOpenGL::Initialize() +{ + if (!LoadLibrary()) { - return LoadEntry(entryPoint.GetConstBuffer(), false); - } - - unsigned int GetVersion() - { - return openGLversion; - } - - bool Initialize() - { - if (!LoadLibrary()) - { - NazaraError("Failed to load OpenGL library"); - return false; - } - - // Le chargement des fonctions OpenGL nécessite un contexte OpenGL - NzContextParameters parameters; - parameters.majorVersion = 2; - parameters.minorVersion = 0; - parameters.shared = false; - - /* - Note: Même le contexte de chargement nécessite quelques fonctions de base pour correctement s'initialiser - Pour cette raison, deux contextes sont créés, le premier sert à récupérer les fonctions permetttant - de créer le second avec les bons paramètres. - - Non sérieusement si vous avez une meilleure idée contactez-moi - */ - - /****************************************Initialisation****************************************/ - - NzContext loadContext; - if (!loadContext.Create(parameters)) - { - NazaraError("Failed to create load context"); - Uninitialize(); - - return false; - } - - #if defined(NAZARA_PLATFORM_WINDOWS) - wglCreateContextAttribs = reinterpret_cast(LoadEntry("wglCreateContextAttribsARB", false)); - wglChoosePixelFormat = reinterpret_cast(LoadEntry("wglChoosePixelFormatARB", false)); - if (!wglChoosePixelFormat) - wglChoosePixelFormat = reinterpret_cast(LoadEntry("wglChoosePixelFormatEXT", false)); - #elif defined(NAZARA_PLATFORM_LINUX) - glXCreateContextAttribs = reinterpret_cast(LoadEntry("glXCreateContextAttribsARB", false)); - #endif - - // Récupération de la version d'OpenGL - // Ce code se base sur le fait que la carte graphique renverra un contexte de compatibilité avec la plus haute version supportée - // Ce qui semble vrai au moins chez ATI/AMD et NVidia, mais si quelqu'un à une meilleure idée ... - glGetString = reinterpret_cast(LoadEntry("glGetString", false)); - if (!glGetString) - { - NazaraError("Unable to load OpenGL: failed to load glGetString"); - Uninitialize(); - - return false; - } - - const GLubyte* version = glGetString(GL_VERSION); - if (!version) - { - NazaraError("Unable to retrieve OpenGL version"); - Uninitialize(); - - return false; - } - - unsigned int major = version[0] - '0'; - unsigned int minor = version[2] - '0'; - - if (major == 0 || major > 9) - { - NazaraError("Unable to retrieve OpenGL major version"); - return false; - } - - if (minor > 9) - { - NazaraWarning("Unable to retrieve OpenGL minor version (using 0)"); - minor = 0; - } - - openGLversion = major*100 + minor*10; - if (openGLversion < 200) - { - NazaraError("OpenGL version is too low, please upgrade your drivers or your video card"); - Uninitialize(); - - return false; - } - - parameters.debugMode = true; // Certaines extensions n'apparaissent qu'avec un contexte de debug (e.g. ARB_debug_output) - parameters.majorVersion = NzContextParameters::defaultMajorVersion = major; - parameters.minorVersion = NzContextParameters::defaultMinorVersion = minor; - - if (!loadContext.Create(parameters)) // Destruction implicite du premier contexte - { - NazaraError("Failed to create load context"); - Uninitialize(); - - return false; - } - - /****************************************Noyau****************************************/ - - try - { - glActiveTexture = reinterpret_cast(LoadEntry("glActiveTexture")); - glAttachShader = reinterpret_cast(LoadEntry("glAttachShader")); - glBeginQuery = reinterpret_cast(LoadEntry("glBeginQuery")); - glBindAttribLocation = reinterpret_cast(LoadEntry("glBindAttribLocation")); - glBindBuffer = reinterpret_cast(LoadEntry("glBindBuffer")); - glBindTexture = reinterpret_cast(LoadEntry("glBindTexture")); - glBlendFunc = reinterpret_cast(LoadEntry("glBlendFunc")); - glBufferData = reinterpret_cast(LoadEntry("glBufferData")); - glBufferSubData = reinterpret_cast(LoadEntry("glBufferSubData")); - glClear = reinterpret_cast(LoadEntry("glClear")); - glClearColor = reinterpret_cast(LoadEntry("glClearColor")); - glClearDepth = reinterpret_cast(LoadEntry("glClearDepth")); - glClearStencil = reinterpret_cast(LoadEntry("glClearStencil")); - glCreateProgram = reinterpret_cast(LoadEntry("glCreateProgram")); - glCreateShader = reinterpret_cast(LoadEntry("glCreateShader")); - glColorMask = reinterpret_cast(LoadEntry("glColorMask")); - glCullFace = reinterpret_cast(LoadEntry("glCullFace")); - glCompileShader = reinterpret_cast(LoadEntry("glCompileShader")); - glCopyTexSubImage2D = reinterpret_cast(LoadEntry("glCopyTexSubImage2D")); - glDeleteBuffers = reinterpret_cast(LoadEntry("glDeleteBuffers")); - glDeleteQueries = reinterpret_cast(LoadEntry("glDeleteQueries")); - glDeleteProgram = reinterpret_cast(LoadEntry("glDeleteProgram")); - glDeleteShader = reinterpret_cast(LoadEntry("glDeleteShader")); - glDeleteTextures = reinterpret_cast(LoadEntry("glDeleteTextures")); - glDepthFunc = reinterpret_cast(LoadEntry("glDepthFunc")); - glDepthMask = reinterpret_cast(LoadEntry("glDepthMask")); - glDisable = reinterpret_cast(LoadEntry("glDisable")); - glDisableVertexAttribArray = reinterpret_cast(LoadEntry("glDisableVertexAttribArray")); - glDrawArrays = reinterpret_cast(LoadEntry("glDrawArrays")); - glDrawBuffer = reinterpret_cast(LoadEntry("glDrawBuffer")); - glDrawBuffers = reinterpret_cast(LoadEntry("glDrawBuffers")); - glDrawElements = reinterpret_cast(LoadEntry("glDrawElements")); - glEnable = reinterpret_cast(LoadEntry("glEnable")); - glEnableVertexAttribArray = reinterpret_cast(LoadEntry("glEnableVertexAttribArray")); - glEndQuery = reinterpret_cast(LoadEntry("glEndQuery")); - glFlush = reinterpret_cast(LoadEntry("glFlush")); - glGenBuffers = reinterpret_cast(LoadEntry("glGenBuffers")); - glGenQueries = reinterpret_cast(LoadEntry("glGenQueries")); - glGenTextures = reinterpret_cast(LoadEntry("glGenTextures")); - glGetBooleanv = reinterpret_cast(LoadEntry("glGetBooleanv")); - glGetBufferParameteriv = reinterpret_cast(LoadEntry("glGetBufferParameteriv")); - glGetError = reinterpret_cast(LoadEntry("glGetError")); - glGetFloatv = reinterpret_cast(LoadEntry("glGetFloatv")); - glGetIntegerv = reinterpret_cast(LoadEntry("glGetIntegerv")); - glGetQueryiv = reinterpret_cast(LoadEntry("glGetQueryiv")); - glGetQueryObjectiv = reinterpret_cast(LoadEntry("glGetQueryObjectiv")); - glGetQueryObjectuiv = reinterpret_cast(LoadEntry("glGetQueryObjectuiv")); - glGetProgramiv = reinterpret_cast(LoadEntry("glGetProgramiv")); - glGetProgramInfoLog = reinterpret_cast(LoadEntry("glGetProgramInfoLog")); - glGetShaderInfoLog = reinterpret_cast(LoadEntry("glGetShaderInfoLog")); - glGetShaderiv = reinterpret_cast(LoadEntry("glGetShaderiv")); - glGetShaderSource = reinterpret_cast(LoadEntry("glGetShaderSource")); - glGetTexImage = reinterpret_cast(LoadEntry("glGetTexImage")); - glGetTexLevelParameterfv = reinterpret_cast(LoadEntry("glGetTexLevelParameterfv")); - glGetTexLevelParameteriv = reinterpret_cast(LoadEntry("glGetTexLevelParameteriv")); - glGetTexParameterfv = reinterpret_cast(LoadEntry("glGetTexParameterfv")); - glGetTexParameteriv = reinterpret_cast(LoadEntry("glGetTexParameteriv")); - glGetUniformLocation = reinterpret_cast(LoadEntry("glGetUniformLocation")); - glIsEnabled = reinterpret_cast(LoadEntry("glIsEnabled")); - glLineWidth = reinterpret_cast(LoadEntry("glLineWidth")); - glLinkProgram = reinterpret_cast(LoadEntry("glLinkProgram")); - glMapBuffer = reinterpret_cast(LoadEntry("glMapBuffer")); - glPixelStorei = reinterpret_cast(LoadEntry("glPixelStorei")); - glPointSize = reinterpret_cast(LoadEntry("glPointSize")); - glPolygonMode = reinterpret_cast(LoadEntry("glPolygonMode")); - glReadPixels = reinterpret_cast(LoadEntry("glReadPixels")); - glScissor = reinterpret_cast(LoadEntry("glScissor")); - glShaderSource = reinterpret_cast(LoadEntry("glShaderSource")); - glStencilFunc = reinterpret_cast(LoadEntry("glStencilFunc")); - glStencilOp = reinterpret_cast(LoadEntry("glStencilOp")); - glTexImage2D = reinterpret_cast(LoadEntry("glTexImage2D")); - glTexImage3D = reinterpret_cast(LoadEntry("glTexImage3D")); - glTexParameterf = reinterpret_cast(LoadEntry("glTexParameterf")); - glTexParameteri = reinterpret_cast(LoadEntry("glTexParameteri")); - glTexSubImage2D = reinterpret_cast(LoadEntry("glTexSubImage2D")); - glTexSubImage3D = reinterpret_cast(LoadEntry("glTexSubImage3D")); - glUniform1f = reinterpret_cast(LoadEntry("glUniform1f")); - glUniform1i = reinterpret_cast(LoadEntry("glUniform1i")); - glUniform2fv = reinterpret_cast(LoadEntry("glUniform2fv")); - glUniform3fv = reinterpret_cast(LoadEntry("glUniform3fv")); - glUniform4fv = reinterpret_cast(LoadEntry("glUniform4fv")); - glUniformMatrix4fv = reinterpret_cast(LoadEntry("glUniformMatrix4fv")); - glUnmapBuffer = reinterpret_cast(LoadEntry("glUnmapBuffer")); - glUseProgram = reinterpret_cast(LoadEntry("glUseProgram")); - glVertexAttrib4f = reinterpret_cast(LoadEntry("glVertexAttrib4f")); - glVertexAttribPointer = reinterpret_cast(LoadEntry("glVertexAttribPointer")); - glViewport = reinterpret_cast(LoadEntry("glViewport")); - } - catch (const std::exception& e) - { - NazaraError("Unable to load OpenGL: " + NzString(e.what())); - Uninitialize(); - - return false; - } - - /****************************************Extensions****************************************/ - - // Fonctions optionnelles - glBindFragDataLocation = reinterpret_cast(LoadEntry("glBindFragDataLocation", false)); - if (!glBindFragDataLocation) - glBindFragDataLocation = reinterpret_cast(LoadEntry("glBindFragDataLocationEXT", false)); - - glGetStringi = reinterpret_cast(LoadEntry("glGetStringi", false)); - glMapBufferRange = reinterpret_cast(LoadEntry("glMapBufferRange", false)); - - #if defined(NAZARA_PLATFORM_WINDOWS) - wglGetExtensionsStringARB = reinterpret_cast(LoadEntry("wglGetExtensionsStringARB", false)); - wglGetExtensionsStringEXT = reinterpret_cast(LoadEntry("wglGetExtensionsStringEXT", false)); - wglSwapInterval = reinterpret_cast(LoadEntry("wglSwapIntervalEXT", false)); - #elif defined(NAZARA_PLATFORM_LINUX) - glXSwapInterval = reinterpret_cast(LoadEntry("glXSwapIntervalSGI", false)); - #endif - - if (!glGetStringi || !LoadExtensions3()) - { - if (openGLversion >= 300) // Dans le cas contraire c'est normal - NazaraWarning("Failed to load OpenGL 3 extension system, switching to OpenGL 2 extension system..."); - - if (!LoadExtensionsString(reinterpret_cast(glGetString(GL_EXTENSIONS)))) - NazaraWarning("Failed to load extension system"); - } - - #ifdef NAZARA_PLATFORM_WINDOWS - { - bool loaded; - if (wglGetExtensionsStringARB) - loaded = LoadExtensionsString(reinterpret_cast(wglGetExtensionsStringARB(wglGetCurrentDC()))); - else if (wglGetExtensionsStringEXT) - loaded = LoadExtensionsString(reinterpret_cast(wglGetExtensionsStringEXT())); - else - loaded = false; - - if (!loaded) - NazaraWarning("Failed to load wgl extension string"); - } - #endif - - // AnisotropicFilter - openGLextensions[nzOpenGLExtension_AnisotropicFilter] = IsSupported("GL_EXT_texture_filter_anisotropic"); - - // DebugOutput - if (openGLversion >= 430 || IsSupported("GL_KHR_debug")) - { - try - { - glDebugMessageCallback = reinterpret_cast(LoadEntry("glDebugMessageCallback")); - glDebugMessageControl = reinterpret_cast(LoadEntry("glDebugMessageControl")); - glDebugMessageInsert = reinterpret_cast(LoadEntry("glDebugMessageInsert")); - glGetDebugMessageLog = reinterpret_cast(LoadEntry("glGetDebugMessageLog")); - - openGLextensions[nzOpenGLExtension_DebugOutput] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load GL_KHR_debug: " + NzString(e.what())); - } - } - - if (!openGLextensions[nzOpenGLExtension_DebugOutput] && IsSupported("GL_ARB_debug_output")) - { - try - { - glDebugMessageCallback = reinterpret_cast(LoadEntry("glDebugMessageCallbackARB")); - glDebugMessageControl = reinterpret_cast(LoadEntry("glDebugMessageControlARB")); - glDebugMessageInsert = reinterpret_cast(LoadEntry("glDebugMessageInsertARB")); - glGetDebugMessageLog = reinterpret_cast(LoadEntry("glGetDebugMessageLogARB")); - - openGLextensions[nzOpenGLExtension_DebugOutput] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load GL_ARB_debug_output: " + NzString(e.what())); - } - } - - // FP64 - if (openGLversion >= 400 || IsSupported("GL_ARB_gpu_shader_fp64")) - { - try - { - glUniform1d = reinterpret_cast(LoadEntry("glUniform1d")); - glUniform2dv = reinterpret_cast(LoadEntry("glUniform2dv")); - glUniform3dv = reinterpret_cast(LoadEntry("glUniform3dv")); - glUniform4dv = reinterpret_cast(LoadEntry("glUniform4dv")); - - openGLextensions[nzOpenGLExtension_FP64] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load ARB_gpu_shader_fp64: " + NzString(e.what())); - } - } - - // FrameBufferObject - if (openGLversion >= 300 || IsSupported("GL_ARB_framebuffer_object")) - { - try - { - glBindFramebuffer = reinterpret_cast(LoadEntry("glBindFramebuffer")); - glBindRenderbuffer = reinterpret_cast(LoadEntry("glBindRenderbuffer")); - glCheckFramebufferStatus = reinterpret_cast(LoadEntry("glCheckFramebufferStatus")); - glDeleteFramebuffers = reinterpret_cast(LoadEntry("glDeleteFramebuffers")); - glDeleteRenderbuffers = reinterpret_cast(LoadEntry("glDeleteRenderbuffers")); - glFramebufferRenderbuffer = reinterpret_cast(LoadEntry("glFramebufferRenderbuffer")); - glFramebufferTexture = reinterpret_cast(LoadEntry("glFramebufferTexture")); - glFramebufferTexture1D = reinterpret_cast(LoadEntry("glFramebufferTexture1D")); - glFramebufferTexture2D = reinterpret_cast(LoadEntry("glFramebufferTexture2D")); - glFramebufferTexture3D = reinterpret_cast(LoadEntry("glFramebufferTexture3D")); - glFramebufferTextureLayer = reinterpret_cast(LoadEntry("glFramebufferTextureLayer")); - glGenerateMipmap = reinterpret_cast(LoadEntry("glGenerateMipmap")); - glGenFramebuffers = reinterpret_cast(LoadEntry("glGenFramebuffers")); - glGenRenderbuffers = reinterpret_cast(LoadEntry("glGenRenderbuffers")); - glRenderbufferStorage = reinterpret_cast(LoadEntry("glRenderbufferStorage")); - - openGLextensions[nzOpenGLExtension_FrameBufferObject] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load ARB_framebuffer_object: (" + NzString(e.what()) + ")"); - } - } - - // PixelBufferObject - openGLextensions[nzOpenGLExtension_PixelBufferObject] = (openGLversion >= 210 || IsSupported("GL_ARB_pixel_buffer_object")); - - // SamplerObjects - if (openGLversion >= 330 || IsSupported("GL_ARB_sampler_objects")) - { - try - { - glBindSampler = reinterpret_cast(LoadEntry("glBindSampler")); - glDeleteSamplers = reinterpret_cast(LoadEntry("glDeleteSamplers")); - glGenSamplers = reinterpret_cast(LoadEntry("glGenSamplers")); - glSamplerParameterf = reinterpret_cast(LoadEntry("glSamplerParameterf")); - glSamplerParameteri = reinterpret_cast(LoadEntry("glSamplerParameteri")); - - openGLextensions[nzOpenGLExtension_SamplerObjects] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load ARB_sampler_objects: (" + NzString(e.what()) + ")"); - } - } - - // SeparateShaderObjects - if (openGLversion >= 400 || IsSupported("GL_ARB_separate_shader_objects")) - { - try - { - glProgramUniform1f = reinterpret_cast(LoadEntry("glProgramUniform1f")); - glProgramUniform1i = reinterpret_cast(LoadEntry("glProgramUniform1i")); - glProgramUniform2fv = reinterpret_cast(LoadEntry("glProgramUniform2fv")); - glProgramUniform3fv = reinterpret_cast(LoadEntry("glProgramUniform3fv")); - glProgramUniform4fv = reinterpret_cast(LoadEntry("glProgramUniform4fv")); - glProgramUniformMatrix4fv = reinterpret_cast(LoadEntry("glProgramUniformMatrix4fv")); - - // Si ARB_gpu_shader_fp64 est supporté, alors cette extension donne également accès aux fonctions utilisant des double - if (openGLextensions[nzOpenGLExtension_FP64]) - { - glProgramUniform1d = reinterpret_cast(LoadEntry("glProgramUniform1d")); - glProgramUniform2dv = reinterpret_cast(LoadEntry("glProgramUniform2dv")); - glProgramUniform3dv = reinterpret_cast(LoadEntry("glProgramUniform3dv")); - glProgramUniform4dv = reinterpret_cast(LoadEntry("glProgramUniform4dv")); - glProgramUniformMatrix4dv = reinterpret_cast(LoadEntry("glProgramUniformMatrix4dv")); - } - - openGLextensions[nzOpenGLExtension_SeparateShaderObjects] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load ARB_separate_shader_objects: (" + NzString(e.what()) + ")"); - } - } - - // TextureArray - openGLextensions[nzOpenGLExtension_TextureArray] = (openGLversion >= 300 || IsSupported("GL_EXT_texture_array")); - - // TextureCompression_s3tc - openGLextensions[nzOpenGLExtension_TextureCompression_s3tc] = IsSupported("GL_EXT_texture_compression_s3tc"); - - // TextureStorage - if (openGLversion >= 420 || IsSupported("GL_ARB_texture_storage")) - { - try - { - glTexStorage1D = reinterpret_cast(LoadEntry("glTexStorage1D")); - glTexStorage2D = reinterpret_cast(LoadEntry("glTexStorage2D")); - glTexStorage3D = reinterpret_cast(LoadEntry("glTexStorage3D")); - - openGLextensions[nzOpenGLExtension_TextureStorage] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load ARB_texture_storage: " + NzString(e.what())); - } - } - - // VertexArrayObject - if (openGLversion >= 300 || IsSupported("GL_ARB_vertex_array_object")) - { - try - { - glBindVertexArray = reinterpret_cast(LoadEntry("glBindVertexArray")); - glDeleteVertexArrays = reinterpret_cast(LoadEntry("glDeleteVertexArrays")); - glGenVertexArrays = reinterpret_cast(LoadEntry("glGenVertexArrays")); - - openGLextensions[nzOpenGLExtension_VertexArrayObject] = true; - } - catch (const std::exception& e) - { - NazaraWarning("Failed to load ARB_vertex_array_object: " + NzString(e.what())); - } - } - - // Fonctions de substitut - if (!glGenerateMipmap) - glGenerateMipmap = reinterpret_cast(LoadEntry("glGenerateMipmapEXT", false)); - - /****************************************Contexte de référence****************************************/ - - ///FIXME: Utiliser le contexte de chargement comme référence ? (Vérifier mode debug) - if (!NzContext::Initialize()) - { - NazaraError("Failed to initialize contexts"); - Uninitialize(); - - return false; - } - - NzContextParameters::defaultShareContext = NzContext::GetReference(); - - return true; - } - - bool IsSupported(nzOpenGLExtension extension) - { - return openGLextensions[extension]; - } - - bool IsSupported(const NzString& string) - { - return openGLextensionSet.find(string) != openGLextensionSet.end(); - } - - bool TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type) - { - switch (pixelFormat) - { - case nzPixelFormat_BGR8: - format->dataFormat = GL_BGR; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_RGB8; - return true; - - case nzPixelFormat_BGRA8: - format->dataFormat = GL_BGRA; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_RGBA8; - return true; - - case nzPixelFormat_DXT1: - format->dataFormat = GL_RGB; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - return true; - - case nzPixelFormat_DXT3: - format->dataFormat = GL_RGBA; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - return true; - - case nzPixelFormat_DXT5: - format->dataFormat = GL_RGBA; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - return true; - - case nzPixelFormat_L8: - case nzPixelFormat_LA8: - return false; - - case nzPixelFormat_RGB5A1: - format->dataFormat = GL_RGBA; - format->dataType = GL_UNSIGNED_SHORT_5_5_5_1; - format->internalFormat = GL_RGB5_A1; - return true; - - case nzPixelFormat_RGB8: - format->dataFormat = GL_RGB; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_RGB8; - return true; - - case nzPixelFormat_RGBA4: - format->dataFormat = GL_RGBA; - format->dataType = GL_UNSIGNED_SHORT_4_4_4_4; - format->internalFormat = GL_RGBA4; - return true; - - case nzPixelFormat_RGBA8: - format->dataFormat = GL_RGBA; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_RGBA8; - return true; - - case nzPixelFormat_Depth16: - format->dataFormat = GL_DEPTH_COMPONENT; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_DEPTH_COMPONENT16; - return true; - - case nzPixelFormat_Depth24: - format->dataFormat = GL_DEPTH_COMPONENT; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_DEPTH_COMPONENT24; - return true; - - case nzPixelFormat_Depth24Stencil8: - format->dataFormat = GL_DEPTH_STENCIL; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_DEPTH24_STENCIL8; - return true; - - case nzPixelFormat_Depth32: - format->dataFormat = GL_DEPTH_COMPONENT; - format->dataType = GL_UNSIGNED_BYTE; - format->internalFormat = GL_DEPTH_COMPONENT32; - return true; - - case nzPixelFormat_Stencil1: - if (type == FormatType_Texture) // Les formats de stencil ne sont pas supportés par les textures - return false; - else - { - format->dataFormat = GL_NONE; - format->dataType = GL_NONE; - format->internalFormat = GL_STENCIL_INDEX1; - return true; - } - - case nzPixelFormat_Stencil4: - if (type == FormatType_Texture) - return false; - else - { - format->dataFormat = GL_NONE; - format->dataType = GL_NONE; - format->internalFormat = GL_STENCIL_INDEX4; - return true; - } - - case nzPixelFormat_Stencil8: - if (type == FormatType_Texture) - return false; - else - { - format->dataFormat = GL_NONE; - format->dataType = GL_NONE; - format->internalFormat = GL_STENCIL_INDEX8; - return true; - } - - case nzPixelFormat_Stencil16: - if (type == FormatType_Texture) - return false; - else - { - format->dataFormat = GL_NONE; - format->dataType = GL_NONE; - format->internalFormat = GL_STENCIL_INDEX16; - return true; - } - - case nzPixelFormat_Undefined: - break; - } - - NazaraError("Invalid pixel format"); + NazaraError("Failed to load OpenGL library"); return false; } - void Uninitialize() + // Le chargement des fonctions OpenGL nécessite un contexte OpenGL + NzContextParameters parameters; + parameters.majorVersion = 2; + parameters.minorVersion = 0; + parameters.shared = false; + + /* + Note: Même le contexte de chargement nécessite quelques fonctions de base pour correctement s'initialiser + Pour cette raison, deux contextes sont créés, le premier sert à récupérer les fonctions permetttant + de créer le second avec les bons paramètres. + + Non sérieusement si vous avez une meilleure idée contactez-moi + */ + + /****************************************Initialisation****************************************/ + + NzContext loadContext; + if (!loadContext.Create(parameters)) { - NzContext::Uninitialize(); + NazaraError("Failed to create load context"); + Uninitialize(); - for (bool& ext : openGLextensions) - ext = false; - - openGLextensionSet.clear(); - openGLversion = 0; - - UnloadLibrary(); + return false; } - GLenum Attachment[nzAttachmentPoint_Max+1] = - { - GL_COLOR_ATTACHMENT0, // nzAttachmentPoint_Color - GL_DEPTH_ATTACHMENT, // nzAttachmentPoint_Depth - GL_DEPTH_STENCIL_ATTACHMENT, // nzAttachmentPoint_DepthStencil - GL_STENCIL_ATTACHMENT // nzAttachmentPoint_Stencil - }; + #if defined(NAZARA_PLATFORM_WINDOWS) + wglCreateContextAttribs = reinterpret_cast(LoadEntry("wglCreateContextAttribsARB", false)); + wglChoosePixelFormat = reinterpret_cast(LoadEntry("wglChoosePixelFormatARB", false)); + if (!wglChoosePixelFormat) + wglChoosePixelFormat = reinterpret_cast(LoadEntry("wglChoosePixelFormatEXT", false)); + #elif defined(NAZARA_PLATFORM_LINUX) + glXCreateContextAttribs = reinterpret_cast(LoadEntry("glXCreateContextAttribsARB", false)); + #endif - nzUInt8 AttributeIndex[nzElementUsage_Max+1] = + // Récupération de la version d'OpenGL + // Ce code se base sur le fait que la carte graphique renverra un contexte de compatibilité avec la plus haute version supportée + // Ce qui semble vrai au moins chez ATI/AMD et NVidia, mais si quelqu'un à une meilleure idée ... + glGetString = reinterpret_cast(LoadEntry("glGetString", false)); + if (!glGetString) { - 2, // nzElementUsage_Diffuse - 1, // nzElementUsage_Normal - 0, // nzElementUsage_Position - 3, // nzElementUsage_Tangent + NazaraError("Unable to load OpenGL: failed to load glGetString"); + Uninitialize(); - 4 // nzElementUsage_TexCoord (Doit être le dernier de la liste car extensible) - }; + return false; + } - GLenum BlendFunc[nzBlendFunc_Max+1] = + const GLubyte* version = glGetString(GL_VERSION); + if (!version) { - GL_DST_ALPHA, // nzBlendFunc_DestAlpha - GL_DST_COLOR, // nzBlendFunc_DestColor - GL_SRC_ALPHA, // nzBlendFunc_SrcAlpha - GL_SRC_COLOR, // nzBlendFunc_SrcColor - GL_ONE_MINUS_DST_ALPHA, // nzBlendFunc_InvDestAlpha - GL_ONE_MINUS_DST_COLOR, // nzBlendFunc_InvDestColor - GL_ONE_MINUS_SRC_ALPHA, // nzBlendFunc_InvSrcAlpha - GL_ONE_MINUS_SRC_COLOR, // nzBlendFunc_InvSrcColor - GL_ONE, // nzBlendFunc_One - GL_ZERO // nzBlendFunc_Zero - }; + NazaraError("Unable to retrieve OpenGL version"); + Uninitialize(); - GLenum BufferLock[nzBufferAccess_Max+1] = - { - GL_WRITE_ONLY, // nzBufferAccess_DiscardAndWrite - GL_READ_ONLY, // nzBufferAccess_ReadOnly - GL_READ_WRITE, // nzBufferAccess_ReadWrite - GL_WRITE_ONLY // nzBufferAccess_WriteOnly - }; + return false; + } - GLenum BufferLockRange[nzBufferAccess_Max+1] = - { - GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_WRITE_BIT, // nzBufferAccess_DiscardAndWrite - GL_MAP_READ_BIT, // nzBufferAccess_ReadOnly - GL_MAP_READ_BIT | GL_MAP_WRITE_BIT, // nzBufferAccess_ReadWrite - GL_MAP_WRITE_BIT // nzBufferAccess_WriteOnly - }; + unsigned int major = version[0] - '0'; + unsigned int minor = version[2] - '0'; - GLenum BufferTarget[nzBufferType_Max+1] = + if (major == 0 || major > 9) { - GL_ELEMENT_ARRAY_BUFFER, // nzBufferType_Index, - GL_ARRAY_BUFFER, // nzBufferType_Vertex - }; + NazaraError("Unable to retrieve OpenGL major version"); + return false; + } - GLenum BufferTargetBinding[nzBufferType_Max+1] = + if (minor > 9) { - GL_ELEMENT_ARRAY_BUFFER_BINDING, // nzBufferType_Index, - GL_ARRAY_BUFFER_BINDING, // nzBufferType_Vertex - }; + NazaraWarning("Unable to retrieve OpenGL minor version (using 0)"); + minor = 0; + } - GLenum BufferUsage[nzBufferUsage_Max+1] = + openGLversion = major*100 + minor*10; + if (openGLversion < 200) { - // J'ai choisi DYNAMIC à la place de STREAM car DYNAMIC semble plus adapté au profil "une mise à jour pour quelques rendus" - // Ce qui est je pense le scénario qui arrivera le plus souvent (Prévoir une option pour permettre d'utiliser le STREAM_DRAW ?) - // Source: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=160839 - GL_DYNAMIC_DRAW, // nzBufferUsage_Dynamic - GL_STATIC_DRAW // nzBufferUsage_Static - }; + NazaraError("OpenGL version is too low, please upgrade your drivers or your video card"); + Uninitialize(); - GLenum CubemapFace[6] = - { - GL_TEXTURE_CUBE_MAP_POSITIVE_X, // nzCubemapFace_PositiveX - GL_TEXTURE_CUBE_MAP_NEGATIVE_X, // nzCubemapFace_NegativeX - GL_TEXTURE_CUBE_MAP_POSITIVE_Y, // nzCubemapFace_PositiveY - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, // nzCubemapFace_NegativeY - GL_TEXTURE_CUBE_MAP_POSITIVE_Z, // nzCubemapFace_PositiveZ - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z // nzCubemapFace_NegativeZ - }; + return false; + } - GLenum ElementType[nzElementType_Max+1] = - { - GL_UNSIGNED_BYTE, // nzElementType_Color - GL_DOUBLE, // nzElementType_Double1 - GL_DOUBLE, // nzElementType_Double2 - GL_DOUBLE, // nzElementType_Double3 - GL_DOUBLE, // nzElementType_Double4 - GL_FLOAT, // nzElementType_Float1 - GL_FLOAT, // nzElementType_Float2 - GL_FLOAT, // nzElementType_Float3 - GL_FLOAT // nzElementType_Float4 - }; + parameters.debugMode = true; // Certaines extensions n'apparaissent qu'avec un contexte de debug (e.g. ARB_debug_output) + parameters.majorVersion = NzContextParameters::defaultMajorVersion = major; + parameters.minorVersion = NzContextParameters::defaultMinorVersion = minor; - GLenum FaceCulling[nzFaceCulling_Max+1] = + if (!loadContext.Create(parameters)) // Destruction implicite du premier contexte { - GL_BACK, // nzFaceCulling_Back - GL_FRONT, // nzFaceCulling_Front - GL_FRONT_AND_BACK // nzFaceCulling_FrontAndBack - }; + NazaraError("Failed to create load context"); + Uninitialize(); - GLenum FaceFilling[nzFaceFilling_Max+1] = - { - GL_POINT, // nzFaceFilling_Point - GL_LINE, // nzFaceFilling_Line - GL_FILL // nzFaceFilling_Fill - }; + return false; + } - GLenum PrimitiveType[nzPrimitiveType_Max+1] = - { - GL_LINES, // nzPrimitiveType_LineList, - GL_LINE_STRIP, // nzPrimitiveType_LineStrip, - GL_POINTS, // nzPrimitiveType_PointList, - GL_TRIANGLES, // nzPrimitiveType_TriangleList, - GL_TRIANGLE_STRIP, // nzPrimitiveType_TriangleStrip, - GL_TRIANGLE_FAN // nzPrimitiveType_TriangleFan - }; + /****************************************Noyau****************************************/ - GLenum RendererComparison[nzRendererComparison_Max+1] = + try { - GL_ALWAYS, // nzRendererComparison_Always - GL_EQUAL, // nzRendererComparison_Equal - GL_GREATER, // nzRendererComparison_Greater - GL_GEQUAL, // nzRendererComparison_GreaterOrEqual - GL_LESS, // nzRendererComparison_Less - GL_LEQUAL, // nzRendererComparison_LessOrEqual - GL_NEVER // nzRendererComparison_Never - }; + glActiveTexture = reinterpret_cast(LoadEntry("glActiveTexture")); + glAttachShader = reinterpret_cast(LoadEntry("glAttachShader")); + glBeginQuery = reinterpret_cast(LoadEntry("glBeginQuery")); + glBindAttribLocation = reinterpret_cast(LoadEntry("glBindAttribLocation")); + glBindBuffer = reinterpret_cast(LoadEntry("glBindBuffer")); + glBindTexture = reinterpret_cast(LoadEntry("glBindTexture")); + glBlendFunc = reinterpret_cast(LoadEntry("glBlendFunc")); + glBufferData = reinterpret_cast(LoadEntry("glBufferData")); + glBufferSubData = reinterpret_cast(LoadEntry("glBufferSubData")); + glClear = reinterpret_cast(LoadEntry("glClear")); + glClearColor = reinterpret_cast(LoadEntry("glClearColor")); + glClearDepth = reinterpret_cast(LoadEntry("glClearDepth")); + glClearStencil = reinterpret_cast(LoadEntry("glClearStencil")); + glCreateProgram = reinterpret_cast(LoadEntry("glCreateProgram")); + glCreateShader = reinterpret_cast(LoadEntry("glCreateShader")); + glColorMask = reinterpret_cast(LoadEntry("glColorMask")); + glCullFace = reinterpret_cast(LoadEntry("glCullFace")); + glCompileShader = reinterpret_cast(LoadEntry("glCompileShader")); + glCopyTexSubImage2D = reinterpret_cast(LoadEntry("glCopyTexSubImage2D")); + glDeleteBuffers = reinterpret_cast(LoadEntry("glDeleteBuffers")); + glDeleteQueries = reinterpret_cast(LoadEntry("glDeleteQueries")); + glDeleteProgram = reinterpret_cast(LoadEntry("glDeleteProgram")); + glDeleteShader = reinterpret_cast(LoadEntry("glDeleteShader")); + glDeleteTextures = reinterpret_cast(LoadEntry("glDeleteTextures")); + glDepthFunc = reinterpret_cast(LoadEntry("glDepthFunc")); + glDepthMask = reinterpret_cast(LoadEntry("glDepthMask")); + glDisable = reinterpret_cast(LoadEntry("glDisable")); + glDisableVertexAttribArray = reinterpret_cast(LoadEntry("glDisableVertexAttribArray")); + glDrawArrays = reinterpret_cast(LoadEntry("glDrawArrays")); + glDrawBuffer = reinterpret_cast(LoadEntry("glDrawBuffer")); + glDrawBuffers = reinterpret_cast(LoadEntry("glDrawBuffers")); + glDrawElements = reinterpret_cast(LoadEntry("glDrawElements")); + glEnable = reinterpret_cast(LoadEntry("glEnable")); + glEnableVertexAttribArray = reinterpret_cast(LoadEntry("glEnableVertexAttribArray")); + glEndQuery = reinterpret_cast(LoadEntry("glEndQuery")); + glFlush = reinterpret_cast(LoadEntry("glFlush")); + glGenBuffers = reinterpret_cast(LoadEntry("glGenBuffers")); + glGenQueries = reinterpret_cast(LoadEntry("glGenQueries")); + glGenTextures = reinterpret_cast(LoadEntry("glGenTextures")); + glGetBooleanv = reinterpret_cast(LoadEntry("glGetBooleanv")); + glGetBufferParameteriv = reinterpret_cast(LoadEntry("glGetBufferParameteriv")); + glGetError = reinterpret_cast(LoadEntry("glGetError")); + glGetFloatv = reinterpret_cast(LoadEntry("glGetFloatv")); + glGetIntegerv = reinterpret_cast(LoadEntry("glGetIntegerv")); + glGetQueryiv = reinterpret_cast(LoadEntry("glGetQueryiv")); + glGetQueryObjectiv = reinterpret_cast(LoadEntry("glGetQueryObjectiv")); + glGetQueryObjectuiv = reinterpret_cast(LoadEntry("glGetQueryObjectuiv")); + glGetProgramiv = reinterpret_cast(LoadEntry("glGetProgramiv")); + glGetProgramInfoLog = reinterpret_cast(LoadEntry("glGetProgramInfoLog")); + glGetShaderInfoLog = reinterpret_cast(LoadEntry("glGetShaderInfoLog")); + glGetShaderiv = reinterpret_cast(LoadEntry("glGetShaderiv")); + glGetShaderSource = reinterpret_cast(LoadEntry("glGetShaderSource")); + glGetTexImage = reinterpret_cast(LoadEntry("glGetTexImage")); + glGetTexLevelParameterfv = reinterpret_cast(LoadEntry("glGetTexLevelParameterfv")); + glGetTexLevelParameteriv = reinterpret_cast(LoadEntry("glGetTexLevelParameteriv")); + glGetTexParameterfv = reinterpret_cast(LoadEntry("glGetTexParameterfv")); + glGetTexParameteriv = reinterpret_cast(LoadEntry("glGetTexParameteriv")); + glGetUniformLocation = reinterpret_cast(LoadEntry("glGetUniformLocation")); + glIsEnabled = reinterpret_cast(LoadEntry("glIsEnabled")); + glLineWidth = reinterpret_cast(LoadEntry("glLineWidth")); + glLinkProgram = reinterpret_cast(LoadEntry("glLinkProgram")); + glMapBuffer = reinterpret_cast(LoadEntry("glMapBuffer")); + glPixelStorei = reinterpret_cast(LoadEntry("glPixelStorei")); + glPointSize = reinterpret_cast(LoadEntry("glPointSize")); + glPolygonMode = reinterpret_cast(LoadEntry("glPolygonMode")); + glReadPixels = reinterpret_cast(LoadEntry("glReadPixels")); + glScissor = reinterpret_cast(LoadEntry("glScissor")); + glShaderSource = reinterpret_cast(LoadEntry("glShaderSource")); + glStencilFunc = reinterpret_cast(LoadEntry("glStencilFunc")); + glStencilOp = reinterpret_cast(LoadEntry("glStencilOp")); + glTexImage2D = reinterpret_cast(LoadEntry("glTexImage2D")); + glTexImage3D = reinterpret_cast(LoadEntry("glTexImage3D")); + glTexParameterf = reinterpret_cast(LoadEntry("glTexParameterf")); + glTexParameteri = reinterpret_cast(LoadEntry("glTexParameteri")); + glTexSubImage2D = reinterpret_cast(LoadEntry("glTexSubImage2D")); + glTexSubImage3D = reinterpret_cast(LoadEntry("glTexSubImage3D")); + glUniform1f = reinterpret_cast(LoadEntry("glUniform1f")); + glUniform1i = reinterpret_cast(LoadEntry("glUniform1i")); + glUniform2fv = reinterpret_cast(LoadEntry("glUniform2fv")); + glUniform3fv = reinterpret_cast(LoadEntry("glUniform3fv")); + glUniform4fv = reinterpret_cast(LoadEntry("glUniform4fv")); + glUniformMatrix4fv = reinterpret_cast(LoadEntry("glUniformMatrix4fv")); + glUnmapBuffer = reinterpret_cast(LoadEntry("glUnmapBuffer")); + glUseProgram = reinterpret_cast(LoadEntry("glUseProgram")); + glVertexAttrib4f = reinterpret_cast(LoadEntry("glVertexAttrib4f")); + glVertexAttribPointer = reinterpret_cast(LoadEntry("glVertexAttribPointer")); + glViewport = reinterpret_cast(LoadEntry("glViewport")); + } + catch (const std::exception& e) + { + NazaraError("Unable to load OpenGL: " + NzString(e.what())); + Uninitialize(); - GLenum RendererParameter[nzRendererParameter_Max+1] = - { - GL_BLEND, // nzRendererParameter_Blend - GL_NONE, // nzRendererParameter_ColorWrite - GL_DEPTH_TEST, // nzRendererParameter_DepthTest - GL_NONE, // nzRendererParameter_DepthWrite - GL_CULL_FACE, // nzRendererParameter_FaceCulling - GL_STENCIL_TEST // nzRendererParameter_Stencil - }; + return false; + } - GLenum ShaderType[nzShaderType_Max+1] = - { - GL_FRAGMENT_SHADER, // nzShaderType_Fragment - GL_GEOMETRY_SHADER, // nzShaderType_Geometry - GL_VERTEX_SHADER // nzShaderType_Vertex - }; + /****************************************Extensions****************************************/ - GLenum StencilOperation[nzStencilOperation_Max+1] = - { - GL_DECR, // nzStencilOperation_Decrement - GL_DECR_WRAP, // nzStencilOperation_DecrementToSaturation - GL_INCR, // nzStencilOperation_Increment - GL_INCR_WRAP, // nzStencilOperation_IncrementToSaturation - GL_INVERT, // nzStencilOperation_Invert - GL_KEEP, // nzStencilOperation_Keep - GL_REPLACE, // nzStencilOperation_Replace - GL_ZERO // nzStencilOperation_Zero - }; + // Fonctions optionnelles + glBindFragDataLocation = reinterpret_cast(LoadEntry("glBindFragDataLocation", false)); + if (!glBindFragDataLocation) + glBindFragDataLocation = reinterpret_cast(LoadEntry("glBindFragDataLocationEXT", false)); - GLenum TextureTarget[nzImageType_Max+1] = - { - GL_TEXTURE_1D, // nzImageType_1D - GL_TEXTURE_1D_ARRAY, // nzImageType_1D_Array - GL_TEXTURE_2D, // nzImageType_2D - GL_TEXTURE_2D_ARRAY, // nzImageType_2D_Array - GL_TEXTURE_3D, // nzImageType_3D - GL_TEXTURE_CUBE_MAP // nzImageType_Cubemap - }; + glGetStringi = reinterpret_cast(LoadEntry("glGetStringi", false)); + glMapBufferRange = reinterpret_cast(LoadEntry("glMapBufferRange", false)); - GLenum TextureTargetBinding[nzImageType_Max+1] = - { - GL_TEXTURE_BINDING_1D, // nzImageType_1D - GL_TEXTURE_BINDING_1D_ARRAY, // nzImageType_1D_Array - GL_TEXTURE_BINDING_2D, // nzImageType_2D - GL_TEXTURE_BINDING_2D_ARRAY, // nzImageType_2D_Array - GL_TEXTURE_BINDING_3D, // nzImageType_3D - GL_TEXTURE_BINDING_CUBE_MAP // nzImageType_Cubemap - }; + #if defined(NAZARA_PLATFORM_WINDOWS) + wglGetExtensionsStringARB = reinterpret_cast(LoadEntry("wglGetExtensionsStringARB", false)); + wglGetExtensionsStringEXT = reinterpret_cast(LoadEntry("wglGetExtensionsStringEXT", false)); + wglSwapInterval = reinterpret_cast(LoadEntry("wglSwapIntervalEXT", false)); + #elif defined(NAZARA_PLATFORM_LINUX) + glXSwapInterval = reinterpret_cast(LoadEntry("glXSwapIntervalSGI", false)); + #endif - GLenum TextureTargetProxy[nzImageType_Max+1] = + if (!glGetStringi || !LoadExtensions3()) { - GL_PROXY_TEXTURE_1D, // nzImageType_1D - GL_PROXY_TEXTURE_1D_ARRAY, // nzImageType_1D_Array - GL_PROXY_TEXTURE_2D, // nzImageType_2D - GL_PROXY_TEXTURE_2D_ARRAY, // nzImageType_2D_Array - GL_PROXY_TEXTURE_3D, // nzImageType_3D - GL_PROXY_TEXTURE_CUBE_MAP // nzImageType_Cubemap - }; + if (openGLversion >= 300) // Dans le cas contraire c'est normal + NazaraWarning("Failed to load OpenGL 3 extension system, switching to OpenGL 2 extension system..."); - GLenum TextureWrapMode[nzTextureWrap_Max+1] = + if (!LoadExtensionsString(reinterpret_cast(glGetString(GL_EXTENSIONS)))) + NazaraWarning("Failed to load extension system"); + } + + #ifdef NAZARA_PLATFORM_WINDOWS { - GL_CLAMP_TO_EDGE, // nzTextureWrap_Clamp - GL_REPEAT // nzTextureWrap_Repeat - }; + bool loaded; + if (wglGetExtensionsStringARB) + loaded = LoadExtensionsString(reinterpret_cast(wglGetExtensionsStringARB(wglGetCurrentDC()))); + else if (wglGetExtensionsStringEXT) + loaded = LoadExtensionsString(reinterpret_cast(wglGetExtensionsStringEXT())); + else + loaded = false; + + if (!loaded) + NazaraWarning("Failed to load wgl extension string"); + } + #endif + + // AnisotropicFilter + openGLextensions[nzOpenGLExtension_AnisotropicFilter] = IsSupported("GL_EXT_texture_filter_anisotropic"); + + // DebugOutput + if (openGLversion >= 430 || IsSupported("GL_KHR_debug")) + { + try + { + glDebugMessageCallback = reinterpret_cast(LoadEntry("glDebugMessageCallback")); + glDebugMessageControl = reinterpret_cast(LoadEntry("glDebugMessageControl")); + glDebugMessageInsert = reinterpret_cast(LoadEntry("glDebugMessageInsert")); + glGetDebugMessageLog = reinterpret_cast(LoadEntry("glGetDebugMessageLog")); + + openGLextensions[nzOpenGLExtension_DebugOutput] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load GL_KHR_debug: " + NzString(e.what())); + } + } + + if (!openGLextensions[nzOpenGLExtension_DebugOutput] && IsSupported("GL_ARB_debug_output")) + { + try + { + glDebugMessageCallback = reinterpret_cast(LoadEntry("glDebugMessageCallbackARB")); + glDebugMessageControl = reinterpret_cast(LoadEntry("glDebugMessageControlARB")); + glDebugMessageInsert = reinterpret_cast(LoadEntry("glDebugMessageInsertARB")); + glGetDebugMessageLog = reinterpret_cast(LoadEntry("glGetDebugMessageLogARB")); + + openGLextensions[nzOpenGLExtension_DebugOutput] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load GL_ARB_debug_output: " + NzString(e.what())); + } + } + + // FP64 + if (openGLversion >= 400 || IsSupported("GL_ARB_gpu_shader_fp64")) + { + try + { + glUniform1d = reinterpret_cast(LoadEntry("glUniform1d")); + glUniform2dv = reinterpret_cast(LoadEntry("glUniform2dv")); + glUniform3dv = reinterpret_cast(LoadEntry("glUniform3dv")); + glUniform4dv = reinterpret_cast(LoadEntry("glUniform4dv")); + + openGLextensions[nzOpenGLExtension_FP64] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load ARB_gpu_shader_fp64: " + NzString(e.what())); + } + } + + // FrameBufferObject + if (openGLversion >= 300 || IsSupported("GL_ARB_framebuffer_object")) + { + try + { + glBindFramebuffer = reinterpret_cast(LoadEntry("glBindFramebuffer")); + glBindRenderbuffer = reinterpret_cast(LoadEntry("glBindRenderbuffer")); + glCheckFramebufferStatus = reinterpret_cast(LoadEntry("glCheckFramebufferStatus")); + glDeleteFramebuffers = reinterpret_cast(LoadEntry("glDeleteFramebuffers")); + glDeleteRenderbuffers = reinterpret_cast(LoadEntry("glDeleteRenderbuffers")); + glFramebufferRenderbuffer = reinterpret_cast(LoadEntry("glFramebufferRenderbuffer")); + glFramebufferTexture = reinterpret_cast(LoadEntry("glFramebufferTexture")); + glFramebufferTexture1D = reinterpret_cast(LoadEntry("glFramebufferTexture1D")); + glFramebufferTexture2D = reinterpret_cast(LoadEntry("glFramebufferTexture2D")); + glFramebufferTexture3D = reinterpret_cast(LoadEntry("glFramebufferTexture3D")); + glFramebufferTextureLayer = reinterpret_cast(LoadEntry("glFramebufferTextureLayer")); + glGenerateMipmap = reinterpret_cast(LoadEntry("glGenerateMipmap")); + glGenFramebuffers = reinterpret_cast(LoadEntry("glGenFramebuffers")); + glGenRenderbuffers = reinterpret_cast(LoadEntry("glGenRenderbuffers")); + glRenderbufferStorage = reinterpret_cast(LoadEntry("glRenderbufferStorage")); + + openGLextensions[nzOpenGLExtension_FrameBufferObject] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load ARB_framebuffer_object: (" + NzString(e.what()) + ")"); + } + } + + // PixelBufferObject + openGLextensions[nzOpenGLExtension_PixelBufferObject] = (openGLversion >= 210 || IsSupported("GL_ARB_pixel_buffer_object")); + + // SamplerObjects + if (openGLversion >= 330 || IsSupported("GL_ARB_sampler_objects")) + { + try + { + glBindSampler = reinterpret_cast(LoadEntry("glBindSampler")); + glDeleteSamplers = reinterpret_cast(LoadEntry("glDeleteSamplers")); + glGenSamplers = reinterpret_cast(LoadEntry("glGenSamplers")); + glSamplerParameterf = reinterpret_cast(LoadEntry("glSamplerParameterf")); + glSamplerParameteri = reinterpret_cast(LoadEntry("glSamplerParameteri")); + + openGLextensions[nzOpenGLExtension_SamplerObjects] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load ARB_sampler_objects: (" + NzString(e.what()) + ")"); + } + } + + // SeparateShaderObjects + if (openGLversion >= 400 || IsSupported("GL_ARB_separate_shader_objects")) + { + try + { + glProgramUniform1f = reinterpret_cast(LoadEntry("glProgramUniform1f")); + glProgramUniform1i = reinterpret_cast(LoadEntry("glProgramUniform1i")); + glProgramUniform2fv = reinterpret_cast(LoadEntry("glProgramUniform2fv")); + glProgramUniform3fv = reinterpret_cast(LoadEntry("glProgramUniform3fv")); + glProgramUniform4fv = reinterpret_cast(LoadEntry("glProgramUniform4fv")); + glProgramUniformMatrix4fv = reinterpret_cast(LoadEntry("glProgramUniformMatrix4fv")); + + // Si ARB_gpu_shader_fp64 est supporté, alors cette extension donne également accès aux fonctions utilisant des double + if (openGLextensions[nzOpenGLExtension_FP64]) + { + glProgramUniform1d = reinterpret_cast(LoadEntry("glProgramUniform1d")); + glProgramUniform2dv = reinterpret_cast(LoadEntry("glProgramUniform2dv")); + glProgramUniform3dv = reinterpret_cast(LoadEntry("glProgramUniform3dv")); + glProgramUniform4dv = reinterpret_cast(LoadEntry("glProgramUniform4dv")); + glProgramUniformMatrix4dv = reinterpret_cast(LoadEntry("glProgramUniformMatrix4dv")); + } + + openGLextensions[nzOpenGLExtension_SeparateShaderObjects] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load ARB_separate_shader_objects: (" + NzString(e.what()) + ")"); + } + } + + // TextureArray + openGLextensions[nzOpenGLExtension_TextureArray] = (openGLversion >= 300 || IsSupported("GL_EXT_texture_array")); + + // TextureCompression_s3tc + openGLextensions[nzOpenGLExtension_TextureCompression_s3tc] = IsSupported("GL_EXT_texture_compression_s3tc"); + + // TextureStorage + if (openGLversion >= 420 || IsSupported("GL_ARB_texture_storage")) + { + try + { + glTexStorage1D = reinterpret_cast(LoadEntry("glTexStorage1D")); + glTexStorage2D = reinterpret_cast(LoadEntry("glTexStorage2D")); + glTexStorage3D = reinterpret_cast(LoadEntry("glTexStorage3D")); + + openGLextensions[nzOpenGLExtension_TextureStorage] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load ARB_texture_storage: " + NzString(e.what())); + } + } + + // VertexArrayObject + if (openGLversion >= 300 || IsSupported("GL_ARB_vertex_array_object")) + { + try + { + glBindVertexArray = reinterpret_cast(LoadEntry("glBindVertexArray")); + glDeleteVertexArrays = reinterpret_cast(LoadEntry("glDeleteVertexArrays")); + glGenVertexArrays = reinterpret_cast(LoadEntry("glGenVertexArrays")); + + openGLextensions[nzOpenGLExtension_VertexArrayObject] = true; + } + catch (const std::exception& e) + { + NazaraWarning("Failed to load ARB_vertex_array_object: " + NzString(e.what())); + } + } + + // Fonctions de substitut + if (!glGenerateMipmap) + glGenerateMipmap = reinterpret_cast(LoadEntry("glGenerateMipmapEXT", false)); + + /****************************************Contexte de référence****************************************/ + + ///FIXME: Utiliser le contexte de chargement comme référence ? (Vérifier mode debug) + if (!NzContext::Initialize()) + { + NazaraError("Failed to initialize contexts"); + Uninitialize(); + + return false; + } + + NzContextParameters::defaultShareContext = NzContext::GetReference(); + + return true; } +bool NzOpenGL::IsSupported(nzOpenGLExtension extension) +{ + return openGLextensions[extension]; +} + +bool NzOpenGL::IsSupported(const NzString& string) +{ + return openGLextensionSet.find(string) != openGLextensionSet.end(); +} + +bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type) +{ + switch (pixelFormat) + { + case nzPixelFormat_BGR8: + format->dataFormat = GL_BGR; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_RGB8; + return true; + + case nzPixelFormat_BGRA8: + format->dataFormat = GL_BGRA; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_RGBA8; + return true; + + case nzPixelFormat_DXT1: + format->dataFormat = GL_RGB; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + return true; + + case nzPixelFormat_DXT3: + format->dataFormat = GL_RGBA; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + return true; + + case nzPixelFormat_DXT5: + format->dataFormat = GL_RGBA; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + return true; + + case nzPixelFormat_L8: + case nzPixelFormat_LA8: + return false; + + case nzPixelFormat_RGB5A1: + format->dataFormat = GL_RGBA; + format->dataType = GL_UNSIGNED_SHORT_5_5_5_1; + format->internalFormat = GL_RGB5_A1; + return true; + + case nzPixelFormat_RGB8: + format->dataFormat = GL_RGB; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_RGB8; + return true; + + case nzPixelFormat_RGBA4: + format->dataFormat = GL_RGBA; + format->dataType = GL_UNSIGNED_SHORT_4_4_4_4; + format->internalFormat = GL_RGBA4; + return true; + + case nzPixelFormat_RGBA8: + format->dataFormat = GL_RGBA; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_RGBA8; + return true; + + case nzPixelFormat_Depth16: + format->dataFormat = GL_DEPTH_COMPONENT; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_DEPTH_COMPONENT16; + return true; + + case nzPixelFormat_Depth24: + format->dataFormat = GL_DEPTH_COMPONENT; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_DEPTH_COMPONENT24; + return true; + + case nzPixelFormat_Depth24Stencil8: + format->dataFormat = GL_DEPTH_STENCIL; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_DEPTH24_STENCIL8; + return true; + + case nzPixelFormat_Depth32: + format->dataFormat = GL_DEPTH_COMPONENT; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_DEPTH_COMPONENT32; + return true; + + case nzPixelFormat_Stencil1: + if (type == FormatType_Texture) // Les formats de stencil ne sont pas supportés par les textures + return false; + else + { + format->dataFormat = GL_NONE; + format->dataType = GL_NONE; + format->internalFormat = GL_STENCIL_INDEX1; + return true; + } + + case nzPixelFormat_Stencil4: + if (type == FormatType_Texture) + return false; + else + { + format->dataFormat = GL_NONE; + format->dataType = GL_NONE; + format->internalFormat = GL_STENCIL_INDEX4; + return true; + } + + case nzPixelFormat_Stencil8: + if (type == FormatType_Texture) + return false; + else + { + format->dataFormat = GL_NONE; + format->dataType = GL_NONE; + format->internalFormat = GL_STENCIL_INDEX8; + return true; + } + + case nzPixelFormat_Stencil16: + if (type == FormatType_Texture) + return false; + else + { + format->dataFormat = GL_NONE; + format->dataType = GL_NONE; + format->internalFormat = GL_STENCIL_INDEX16; + return true; + } + + case nzPixelFormat_Undefined: + break; + } + + NazaraError("Invalid pixel format"); + return false; +} + +void NzOpenGL::Uninitialize() +{ + NzContext::Uninitialize(); + + for (bool& ext : openGLextensions) + ext = false; + + openGLextensionSet.clear(); + openGLversion = 0; + + UnloadLibrary(); +} + +GLenum NzOpenGL::Attachment[nzAttachmentPoint_Max+1] = +{ + GL_COLOR_ATTACHMENT0, // nzAttachmentPoint_Color + GL_DEPTH_ATTACHMENT, // nzAttachmentPoint_Depth + GL_DEPTH_STENCIL_ATTACHMENT, // nzAttachmentPoint_DepthStencil + GL_STENCIL_ATTACHMENT // nzAttachmentPoint_Stencil +}; + +nzUInt8 NzOpenGL::AttributeIndex[nzElementUsage_Max+1] = +{ + 2, // nzElementUsage_Diffuse + 1, // nzElementUsage_Normal + 0, // nzElementUsage_Position + 3, // nzElementUsage_Tangent + + 4 // nzElementUsage_TexCoord (Doit être le dernier de la liste car extensible) +}; + +GLenum NzOpenGL::BlendFunc[nzBlendFunc_Max+1] = +{ + GL_DST_ALPHA, // nzBlendFunc_DestAlpha + GL_DST_COLOR, // nzBlendFunc_DestColor + GL_SRC_ALPHA, // nzBlendFunc_SrcAlpha + GL_SRC_COLOR, // nzBlendFunc_SrcColor + GL_ONE_MINUS_DST_ALPHA, // nzBlendFunc_InvDestAlpha + GL_ONE_MINUS_DST_COLOR, // nzBlendFunc_InvDestColor + GL_ONE_MINUS_SRC_ALPHA, // nzBlendFunc_InvSrcAlpha + GL_ONE_MINUS_SRC_COLOR, // nzBlendFunc_InvSrcColor + GL_ONE, // nzBlendFunc_One + GL_ZERO // nzBlendFunc_Zero +}; + +GLenum NzOpenGL::BufferLock[nzBufferAccess_Max+1] = +{ + GL_WRITE_ONLY, // nzBufferAccess_DiscardAndWrite + GL_READ_ONLY, // nzBufferAccess_ReadOnly + GL_READ_WRITE, // nzBufferAccess_ReadWrite + GL_WRITE_ONLY // nzBufferAccess_WriteOnly +}; + +GLenum NzOpenGL::BufferLockRange[nzBufferAccess_Max+1] = +{ + GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_WRITE_BIT, // nzBufferAccess_DiscardAndWrite + GL_MAP_READ_BIT, // nzBufferAccess_ReadOnly + GL_MAP_READ_BIT | GL_MAP_WRITE_BIT, // nzBufferAccess_ReadWrite + GL_MAP_WRITE_BIT // nzBufferAccess_WriteOnly +}; + +GLenum NzOpenGL::BufferTarget[nzBufferType_Max+1] = +{ + GL_ELEMENT_ARRAY_BUFFER, // nzBufferType_Index, + GL_ARRAY_BUFFER, // nzBufferType_Vertex +}; + +GLenum NzOpenGL::BufferTargetBinding[nzBufferType_Max+1] = +{ + GL_ELEMENT_ARRAY_BUFFER_BINDING, // nzBufferType_Index, + GL_ARRAY_BUFFER_BINDING, // nzBufferType_Vertex +}; + +GLenum NzOpenGL::BufferUsage[nzBufferUsage_Max+1] = +{ + // J'ai choisi DYNAMIC à la place de STREAM car DYNAMIC semble plus adapté au profil "une mise à jour pour quelques rendus" + // Ce qui est je pense le scénario qui arrivera le plus souvent (Prévoir une option pour permettre d'utiliser le STREAM_DRAW ?) + // Source: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=160839 + GL_DYNAMIC_DRAW, // nzBufferUsage_Dynamic + GL_STATIC_DRAW // nzBufferUsage_Static +}; + +GLenum NzOpenGL::CubemapFace[6] = +{ + GL_TEXTURE_CUBE_MAP_POSITIVE_X, // nzCubemapFace_PositiveX + GL_TEXTURE_CUBE_MAP_NEGATIVE_X, // nzCubemapFace_NegativeX + GL_TEXTURE_CUBE_MAP_POSITIVE_Y, // nzCubemapFace_PositiveY + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, // nzCubemapFace_NegativeY + GL_TEXTURE_CUBE_MAP_POSITIVE_Z, // nzCubemapFace_PositiveZ + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z // nzCubemapFace_NegativeZ +}; + +GLenum NzOpenGL::ElementType[nzElementType_Max+1] = +{ + GL_UNSIGNED_BYTE, // nzElementType_Color + GL_DOUBLE, // nzElementType_Double1 + GL_DOUBLE, // nzElementType_Double2 + GL_DOUBLE, // nzElementType_Double3 + GL_DOUBLE, // nzElementType_Double4 + GL_FLOAT, // nzElementType_Float1 + GL_FLOAT, // nzElementType_Float2 + GL_FLOAT, // nzElementType_Float3 + GL_FLOAT // nzElementType_Float4 +}; + +GLenum NzOpenGL::FaceCulling[nzFaceCulling_Max+1] = +{ + GL_BACK, // nzFaceCulling_Back + GL_FRONT, // nzFaceCulling_Front + GL_FRONT_AND_BACK // nzFaceCulling_FrontAndBack +}; + +GLenum NzOpenGL::FaceFilling[nzFaceFilling_Max+1] = +{ + GL_POINT, // nzFaceFilling_Point + GL_LINE, // nzFaceFilling_Line + GL_FILL // nzFaceFilling_Fill +}; + +GLenum NzOpenGL::PrimitiveType[nzPrimitiveType_Max+1] = +{ + GL_LINES, // nzPrimitiveType_LineList, + GL_LINE_STRIP, // nzPrimitiveType_LineStrip, + GL_POINTS, // nzPrimitiveType_PointList, + GL_TRIANGLES, // nzPrimitiveType_TriangleList, + GL_TRIANGLE_STRIP, // nzPrimitiveType_TriangleStrip, + GL_TRIANGLE_FAN // nzPrimitiveType_TriangleFan +}; + +GLenum NzOpenGL::RendererComparison[nzRendererComparison_Max+1] = +{ + GL_ALWAYS, // nzRendererComparison_Always + GL_EQUAL, // nzRendererComparison_Equal + GL_GREATER, // nzRendererComparison_Greater + GL_GEQUAL, // nzRendererComparison_GreaterOrEqual + GL_LESS, // nzRendererComparison_Less + GL_LEQUAL, // nzRendererComparison_LessOrEqual + GL_NEVER // nzRendererComparison_Never +}; + +GLenum NzOpenGL::RendererParameter[nzRendererParameter_Max+1] = +{ + GL_BLEND, // nzRendererParameter_Blend + GL_NONE, // nzRendererParameter_ColorWrite + GL_DEPTH_TEST, // nzRendererParameter_DepthTest + GL_NONE, // nzRendererParameter_DepthWrite + GL_CULL_FACE, // nzRendererParameter_FaceCulling + GL_STENCIL_TEST // nzRendererParameter_Stencil +}; + +GLenum NzOpenGL::ShaderType[nzShaderType_Max+1] = +{ + GL_FRAGMENT_SHADER, // nzShaderType_Fragment + GL_GEOMETRY_SHADER, // nzShaderType_Geometry + GL_VERTEX_SHADER // nzShaderType_Vertex +}; + +GLenum NzOpenGL::StencilOperation[nzStencilOperation_Max+1] = +{ + GL_DECR, // nzStencilOperation_Decrement + GL_DECR_WRAP, // nzStencilOperation_DecrementToSaturation + GL_INCR, // nzStencilOperation_Increment + GL_INCR_WRAP, // nzStencilOperation_IncrementToSaturation + GL_INVERT, // nzStencilOperation_Invert + GL_KEEP, // nzStencilOperation_Keep + GL_REPLACE, // nzStencilOperation_Replace + GL_ZERO // nzStencilOperation_Zero +}; + +GLenum NzOpenGL::TextureTarget[nzImageType_Max+1] = +{ + GL_TEXTURE_1D, // nzImageType_1D + GL_TEXTURE_1D_ARRAY, // nzImageType_1D_Array + GL_TEXTURE_2D, // nzImageType_2D + GL_TEXTURE_2D_ARRAY, // nzImageType_2D_Array + GL_TEXTURE_3D, // nzImageType_3D + GL_TEXTURE_CUBE_MAP // nzImageType_Cubemap +}; + +GLenum NzOpenGL::TextureTargetBinding[nzImageType_Max+1] = +{ + GL_TEXTURE_BINDING_1D, // nzImageType_1D + GL_TEXTURE_BINDING_1D_ARRAY, // nzImageType_1D_Array + GL_TEXTURE_BINDING_2D, // nzImageType_2D + GL_TEXTURE_BINDING_2D_ARRAY, // nzImageType_2D_Array + GL_TEXTURE_BINDING_3D, // nzImageType_3D + GL_TEXTURE_BINDING_CUBE_MAP // nzImageType_Cubemap +}; + +GLenum NzOpenGL::TextureTargetProxy[nzImageType_Max+1] = +{ + GL_PROXY_TEXTURE_1D, // nzImageType_1D + GL_PROXY_TEXTURE_1D_ARRAY, // nzImageType_1D_Array + GL_PROXY_TEXTURE_2D, // nzImageType_2D + GL_PROXY_TEXTURE_2D_ARRAY, // nzImageType_2D_Array + GL_PROXY_TEXTURE_3D, // nzImageType_3D + GL_PROXY_TEXTURE_CUBE_MAP // nzImageType_Cubemap +}; + +GLenum NzOpenGL::TextureWrapMode[nzTextureWrap_Max+1] = +{ + GL_CLAMP_TO_EDGE, // nzTextureWrap_Clamp + GL_REPEAT // nzTextureWrap_Repeat +}; + PFNGLACTIVETEXTUREPROC glActiveTexture = nullptr; PFNGLATTACHSHADERPROC glAttachShader = nullptr; PFNGLBEGINQUERYPROC glBeginQuery = nullptr;