Merge branch 'master' into blender2.8
[blender.git] / intern / ghost / intern / GHOST_SystemX11.cpp
index 93a9f35..42bb05c 100644 (file)
 
 #include "GHOST_Debug.h"
 
+#if defined(WITH_GL_EGL)
+#  include "GHOST_ContextEGL.h"
+#else
+#  include "GHOST_ContextGLX.h"
+#endif
+
 #ifdef WITH_XF86KEYSYM
 #include <X11/XF86keysym.h>
 #endif
@@ -113,6 +119,7 @@ GHOST_SystemX11(
     : GHOST_System(),
       m_start_time(0)
 {
+       XInitThreads();
        m_display = XOpenDisplay(NULL);
 
        if (!m_display) {
@@ -384,6 +391,97 @@ bool GHOST_SystemX11::supportsNativeDialogs(void)
        return false;
 }
 
+/**
+ * Create a new offscreen context.
+ * Never explicitly delete the context, use disposeContext() instead.
+ * \return  The new context (or 0 if creation failed).
+ */
+GHOST_IContext *
+GHOST_SystemX11::
+createOffscreenContext()
+{
+       // During development:
+       //   try 4.x compatibility profile
+       //   try 3.3 compatibility profile
+       //   fall back to 3.0 if needed
+       //
+       // Final Blender 2.8:
+       //   try 4.x core profile
+       //   try 3.3 core profile
+       //   no fallbacks
+
+#if defined(WITH_GL_PROFILE_CORE)
+       {
+               const char *version_major = (char*)glewGetString(GLEW_VERSION_MAJOR);
+               if (version_major != NULL && version_major[0] == '1') {
+                       fprintf(stderr, "Error: GLEW version 2.0 and above is required.\n");
+                       abort();
+               }
+       }
+#endif
+
+       const int profile_mask =
+#if defined(WITH_GL_PROFILE_CORE)
+               GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
+#elif defined(WITH_GL_PROFILE_COMPAT)
+               GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
+#else
+#  error // must specify either core or compat at build time
+#endif
+
+       GHOST_Context *context;
+
+       for (int minor = 5; minor >= 0; --minor) {
+               context = new GHOST_ContextGLX(
+                       false,
+                       0,
+                       (Window)NULL,
+                       m_display,
+                       (GLXFBConfig)NULL,
+                       profile_mask,
+                       4, minor,
+                       GHOST_OPENGL_GLX_CONTEXT_FLAGS | (false ? GLX_CONTEXT_DEBUG_BIT_ARB : 0),
+                       GHOST_OPENGL_GLX_RESET_NOTIFICATION_STRATEGY);
+
+               if (context->initializeDrawingContext())
+                       return context;
+               else
+                       delete context;
+       }
+
+       context = new GHOST_ContextGLX(
+               false,
+               0,
+               (Window)NULL,
+               m_display,
+               (GLXFBConfig)NULL,
+               profile_mask,
+               3, 3,
+               GHOST_OPENGL_GLX_CONTEXT_FLAGS | (false ? GLX_CONTEXT_DEBUG_BIT_ARB : 0),
+               GHOST_OPENGL_GLX_RESET_NOTIFICATION_STRATEGY);
+
+       if (context->initializeDrawingContext())
+               return context;
+       else
+               delete context;
+
+       return NULL;
+}
+
+/**
+ * Dispose of a context.
+ * \param   context Pointer to the context to be disposed.
+ * \return  Indication of success.
+ */
+GHOST_TSuccess
+GHOST_SystemX11::
+disposeContext(GHOST_IContext *context)
+{
+       delete context;
+
+       return GHOST_kSuccess;
+}
+
 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
 static void destroyIMCallback(XIM /*xim*/, XPointer ptr, XPointer /*data*/)
 {