Commit: 9accd7e58086d26c1287c2e8876a381d1249180e
Author: Brecht Van Lommel
Date:   Mon Feb 12 17:01:27 2018 +0100
Branches: temp-drawcontext
https://developer.blender.org/rB9accd7e58086d26c1287c2e8876a381d1249180e

GHOST: offscreen context support for macOS.

===================================================================

M       intern/ghost/GHOST_IContext.h
M       intern/ghost/intern/GHOST_ContextCGL.mm
M       intern/ghost/intern/GHOST_SystemCocoa.h
M       intern/ghost/intern/GHOST_SystemCocoa.mm

===================================================================

diff --git a/intern/ghost/GHOST_IContext.h b/intern/ghost/GHOST_IContext.h
index 33cbbe7bacd..fd8647b6335 100644
--- a/intern/ghost/GHOST_IContext.h
+++ b/intern/ghost/GHOST_IContext.h
@@ -45,7 +45,7 @@
  * \see GHOST_ISystem#createOffscreenContext
  *
  * \author  Clément Foucault
- * \date    Fev 9, 2012
+ * \date    Feb 9, 2018
  */
 class GHOST_IContext
 {
diff --git a/intern/ghost/intern/GHOST_ContextCGL.mm 
b/intern/ghost/intern/GHOST_ContextCGL.mm
index 03af3cc497e..88aba680f91 100644
--- a/intern/ghost/intern/GHOST_ContextCGL.mm
+++ b/intern/ghost/intern/GHOST_ContextCGL.mm
@@ -62,8 +62,6 @@ GHOST_ContextCGL::GHOST_ContextCGL(
       m_openGLContext(nil),
       m_debug(contextFlags)
 {
-       assert(openGLView != nil);
-
        // for now be very strict about OpenGL version requested
        switch (contextMajorVersion) {
                case 2:
@@ -88,7 +86,10 @@ GHOST_ContextCGL::~GHOST_ContextCGL()
        if (m_openGLContext != nil) {
                if (m_openGLContext == [NSOpenGLContext currentContext]) {
                        [NSOpenGLContext clearCurrentContext];
-                       [m_openGLView clearGLContext];
+
+                       if(m_openGLView) {
+                               [m_openGLView clearGLContext];
+                       }
                }
 
                if (m_openGLContext != s_sharedOpenGLContext || s_sharedCount 
== 1) {
@@ -258,7 +259,7 @@ GHOST_TSuccess GHOST_ContextCGL::initializeDrawingContext()
        std::vector<NSOpenGLPixelFormatAttribute> attribs;
        attribs.reserve(40);
 
-       NSOpenGLContext *prev_openGLContext = [m_openGLView openGLContext];
+       NSOpenGLContext *prev_openGLContext = (m_openGLView) ? [m_openGLView 
openGLContext] : NULL;
 
 #ifdef GHOST_OPENGL_ALPHA
        static const bool needAlpha   = true;
@@ -362,8 +363,10 @@ GHOST_TSuccess GHOST_ContextCGL::initializeDrawingContext()
 
        initContextGLEW();
 
-       [m_openGLView setOpenGLContext:m_openGLContext];
-       [m_openGLContext setView:m_openGLView];
+       if (m_openGLView) {
+               [m_openGLView setOpenGLContext:m_openGLContext];
+               [m_openGLContext setView:m_openGLView];
+       }
 
        if (s_sharedCount == 0)
                s_sharedOpenGLContext = m_openGLContext;
@@ -380,7 +383,10 @@ GHOST_TSuccess GHOST_ContextCGL::initializeDrawingContext()
 
 error:
 
-       [m_openGLView setOpenGLContext:prev_openGLContext];
+       if (m_openGLView) {
+               [m_openGLView setOpenGLContext:prev_openGLContext];
+       }
+
        [pixelFormat release];
 
        [pool drain];
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h 
b/intern/ghost/intern/GHOST_SystemCocoa.h
index 6802ad42c7b..62d9774d81d 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.h
+++ b/intern/ghost/intern/GHOST_SystemCocoa.h
@@ -123,6 +123,25 @@ public:
            const GHOST_TEmbedderWindowID parentWindow = 0
            );
        
+       /**
+        * Create a new offscreen context.
+        * Never explicitly delete the context, use disposeContext() instead.
+        * \return  The new context (or 0 if creation failed).
+        */
+       GHOST_IContext *
+       createOffscreenContext(
+           );
+
+       /**
+        * Dispose of a context.
+        * \param   context Pointer to the context to be disposed.
+        * \return  Indication of success.
+        */
+       GHOST_TSuccess
+       disposeContext(
+           GHOST_IContext *context
+           );
+
        
/***************************************************************************************
         * Event management functionality
         
***************************************************************************************/
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm 
b/intern/ghost/intern/GHOST_SystemCocoa.mm
index e9fffb6f60b..16d9de396f6 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -27,15 +27,6 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-#import <Cocoa/Cocoa.h>
-
-/*For the currently not ported to Cocoa keyboard layout functions (64bit & 
10.6 compatible)*/
-#include <Carbon/Carbon.h>
-
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-
 #include "GHOST_SystemCocoa.h"
 
 #include "GHOST_DisplayManagerCocoa.h"
@@ -51,12 +42,26 @@
 #include "GHOST_WindowManager.h"
 #include "GHOST_WindowCocoa.h"
 
+#if defined(WITH_GL_EGL)
+#  include "GHOST_ContextEGL.h"
+#else
+#  include "GHOST_ContextCGL.h"
+#endif
+
 #ifdef WITH_INPUT_NDOF
   #include "GHOST_NDOFManagerCocoa.h"
 #endif
 
 #include "AssertMacros.h"
 
+#import <Cocoa/Cocoa.h>
+
+/* For the currently not ported to Cocoa keyboard layout functions (64bit & 
10.6 compatible) */
+#include <Carbon/Carbon.h>
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
 
 #pragma mark KeyMap, mouse converters
 
@@ -580,6 +585,53 @@ GHOST_IWindow* GHOST_SystemCocoa::createWindow(
        return window;
 }
 
+/**
+ * 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_SystemCocoa::
+createOffscreenContext()
+{
+       GHOST_Context *context = new GHOST_ContextCGL(
+               false,
+               0,
+               NULL,
+               NULL,
+
+#if defined(WITH_GL_PROFILE_CORE)
+               GL_CONTEXT_CORE_PROFILE_BIT,
+               3, 2,
+#else
+               0, // no profile bit
+               2, 1,
+#endif
+               GHOST_OPENGL_CGL_CONTEXT_FLAGS,
+               GHOST_OPENGL_CGL_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_SystemCocoa::
+disposeContext(GHOST_IContext *context)
+{
+       delete context;
+
+       return GHOST_kSuccess;
+}
+
 /**
  * \note : returns coordinates in Cocoa screen coordinates
  */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to