evas: use a shared OpenGL context in gl_cocoa backend.
authorRomain Perier <romain.perier@openwide.fr>
Thu, 22 Jan 2015 09:26:55 +0000 (10:26 +0100)
committerCedric BAIL <cedric@osg.samsung.com>
Thu, 12 Mar 2015 06:43:58 +0000 (07:43 +0100)
Evas GL backend uses a global OpenGL context for all windows inside
an application. Each window has its own texture to render its
content. We use a singleton NSOpenGLContext shared between all
NSOpenGLView, it solves rendering issues for multiple windows.

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
src/modules/evas/engines/gl_cocoa/evas_gl_cocoa_main.m

index 67b9453..13bc5e3 100644 (file)
@@ -4,6 +4,7 @@
 #include "evas_engine.h"
 
 static Evas_GL_Cocoa_Window *_evas_gl_cocoa_window = NULL;
+static NSOpenGLContext *_evas_gl_cocoa_shared_context = NULL;
 
 @interface EvasGLView : NSOpenGLView
 {
@@ -43,6 +44,18 @@ static Evas_GL_Cocoa_Window *_evas_gl_cocoa_window = NULL;
 {
    NSOpenGLPixelFormat * pf = [EvasGLView basicPixelFormat];
    self = [super initWithFrame: frameRect pixelFormat: pf];
+
+
+   NSOpenGLContext *ctx;
+   if (!_evas_gl_cocoa_shared_context) {
+     _evas_gl_cocoa_shared_context = [[NSOpenGLContext alloc] initWithFormat: [EvasGLView basicPixelFormat] shareContext: nil];
+     ctx = _evas_gl_cocoa_shared_context;
+   } else {
+     ctx = [[NSOpenGLContext alloc] initWithFormat: [EvasGLView basicPixelFormat] shareContext: _evas_gl_cocoa_shared_context];
+   }
+   [self setOpenGLContext: ctx];
+   [ctx setView: self];
+
    return self;
 }
 
@@ -127,4 +140,3 @@ eng_window_resize(Evas_GL_Cocoa_Window *gw, int width, int height)
   [(EvasGLView*)gw->view setFrame:view_frame];
   [[(NSOpenGLView*)gw->view openGLContext] flushBuffer];
 }
-