[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58507] branches/soc-2013-viewport_fx: Added EGL initialization code to GHOST_WindowWin32, but this is just temporary until I' m sure exactly how GHOST_Context will be implemented.

Jason Wilkins Jason.A.Wilkins at gmail.com
Mon Jul 22 19:58:55 CEST 2013


Revision: 58507
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58507
Author:   jwilkins
Date:     2013-07-22 17:58:54 +0000 (Mon, 22 Jul 2013)
Log Message:
-----------
Added EGL initialization code to GHOST_WindowWin32, but this is just temporary until I'm sure exactly how GHOST_Context will be implemented.

Modified Paths:
--------------
    branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.cpp
    branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.h
    branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowX11.cpp
    branches/soc-2013-viewport_fx/source/blender/blenfont/intern/blf_lang.c

Modified: branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.cpp
===================================================================
--- branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.cpp	2013-07-22 16:49:37 UTC (rev 58506)
+++ branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.cpp	2013-07-22 17:58:54 UTC (rev 58507)
@@ -29,7 +29,8 @@
  *  \ingroup GHOST
  */
 
-#include <string.h>
+#define _USE_MATH_DEFINES
+
 #include "GHOST_WindowWin32.h"
 #include "GHOST_SystemWin32.h"
 #include "GHOST_DropTargetWin32.h"
@@ -38,20 +39,27 @@
 
 // Need glew for some defines
 #include <GL/glew.h>
+
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 #include <GL/wglew.h>
+#endif
+
 #include <math.h>
+#include <string.h>
 
 // MSVC6 still doesn't define M_PI
 #ifndef M_PI
-#  define M_PI 3.1415926536
+#define M_PI 3.1415926536
 #endif
 
+const wchar_t *GHOST_WindowWin32::s_windowClassName = L"GHOST_WindowClass";
+const int GHOST_WindowWin32::s_maxTitleLength = 128;
+
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 // Some more multisample defines
 #define WGL_SAMPLE_BUFFERS_ARB  0x2041
 #define WGL_SAMPLES_ARB         0x2042
 
-const wchar_t *GHOST_WindowWin32::s_windowClassName = L"GHOST_WindowClass";
-const int GHOST_WindowWin32::s_maxTitleLength = 128;
 HGLRC GHOST_WindowWin32::s_firsthGLRc = NULL;
 HDC GHOST_WindowWin32::s_firstHDC = NULL;
 
@@ -88,7 +96,25 @@
 	0,                              /* reserved */
 	0, 0, 0                         /* no layer, visible, damage masks */
 };
+#endif
 
+#if defined(WITH_GL_SYSTEM_EMBEDDED)
+static EGLint attribList[] = {
+	EGL_RED_SIZE,       8,
+	EGL_GREEN_SIZE,     8,
+	EGL_BLUE_SIZE,      8,
+	EGL_DEPTH_SIZE,     8,
+#ifdef GHOST_OPENGL_ALPHA
+	EGL_ALPHA_SIZE,     8,
+#else
+	EGL_ALPHA_SIZE,     0,
+#endif
+	//EGL_STENCIL_SIZE,   8,
+	//EGL_SAMPLE_BUFFERS  1,
+	EGL_NONE
+};
+#endif
+
 /* Intel videocards don't work fine with multiple contexts and
  * have to share the same context for all windows.
  * But if we just share context for all windows it could work incorrect
@@ -125,7 +151,9 @@
 	             stereoVisual, false, numOfAASamples),
 	m_system(system),
 	m_hDC(0),
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 	m_hGlRc(0),
+#endif
 	m_hasMouseCaptured(false),
 	m_hasGrabMouse(false),
 	m_nPressedButtons(0),
@@ -268,9 +296,11 @@
 		// Store the device context
 		m_hDC = ::GetDC(m_hWnd);
 
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 		if (!s_firstHDC) {
 			s_firstHDC = m_hDC;
 		}
+#endif
 
 		// Show the window
 		int nCmdShow;
@@ -400,7 +430,7 @@
 #if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 	::wglMakeCurrent(NULL, NULL);
 #elif defined(WITH_GL_SYSTEM_EMBEDDED)
-	GHOST_PRINT("GHOST_WindowWin32::~GHOST_WindowWin32 for WITH_GL_SYSTEM_EMBEDDED not implemented\n");
+	::eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 #else
 #error
 #endif
@@ -408,10 +438,19 @@
 	m_multisampleEnabled = GHOST_kFailure;
 	m_multisample = 0;
 	setDrawingContextType(GHOST_kDrawingContextTypeNone);
+
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 	if (m_hDC && m_hDC != s_firstHDC) {
 		::ReleaseDC(m_hWnd, m_hDC);
 		m_hDC = 0;
 	}
+#else
+	if (m_hDC && m_hDC) {
+		::ReleaseDC(m_hWnd, m_hDC);
+		m_hDC = 0;
+	}
+#endif
+
 	if (m_hWnd) {
 		if (m_dropTarget) {
 			// Disable DragDrop
@@ -650,8 +689,7 @@
 
 	return ::SwapBuffers(hDC) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
 #elif defined(WITH_GL_SYSTEM_EMBEDDED)
-	GHOST_PRINT("GHOST_WindowWin32::swapBuffers for WITH_GL_SYSTEM_EMBEDDED not implemented\n");
-	return GHOST_kFailure;
+	return ::eglSwapBuffers(egl_display, egl_surface) ? GHOST_kSuccess : GHOST_kFailure;
 #else
 #error
 #endif
@@ -664,14 +702,18 @@
 	if (m_drawingContextType == GHOST_kDrawingContextTypeOpenGL) {
 #if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 		if (m_hDC && m_hGlRc) {
-			success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+			success = ::wglMakeCurrent(m_hDC, m_hGlRc) ? GHOST_kSuccess : GHOST_kFailure;
 		}
 		else {
 			success = GHOST_kFailure;
 		}
 #elif defined(WITH_GL_SYSTEM_EMBEDDED)
-	success = GHOST_kFailure;
-	GHOST_PRINT("GHOST_WindowWin32::activateDrawingContext for WITH_GL_SYSTEM_EMBEDDED not implemented\n");
+		if (m_hDC) {
+			success = ::eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context) ? GHOST_kSuccess : GHOST_kFailure;
+		}
+		else {
+			success = GHOST_kFailure;
+		}
 #else
 #error
 #endif
@@ -679,6 +721,7 @@
 	else {
 		success = GHOST_kSuccess;
 	}
+
 	return success;
 }
 
@@ -761,6 +804,7 @@
 GHOST_TSuccess GHOST_WindowWin32::installDrawingContext(GHOST_TDrawingContextType type)
 {
 	GHOST_TSuccess success;
+
 	switch (type) {
 		case GHOST_kDrawingContextTypeOpenGL:
 #if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
@@ -925,12 +969,62 @@
 		}
 		break;
 #elif defined(WITH_GL_SYSTEM_EMBEDDED)
-		GHOST_PRINT("GHOST_WindowWin32::installDrawingContext for WITH_GL_SYSTEM_EMBEDDED not implemented\n");
-		success = GHOST_kFailure;
-		break;
+		{
+			EGLint major, minor;
+			EGLint num_config;
+			EGLConfig config;
+#if defined(WITH_GL_PROFILE_ES20)
+			EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE };
+#endif
+
+			egl_display = ::eglGetDisplay((EGLNativeDisplayType)m_hDC);
+
+			if(egl_display == EGL_NO_DISPLAY) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			if(!::eglInitialize(egl_display, &major, &minor)) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			if(!::eglGetConfigs(egl_display, NULL, 0, &num_config)) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			if(!::eglChooseConfig(egl_display, attribList, &config, 1, &num_config)) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			egl_surface = ::eglCreateWindowSurface(egl_display, config, (EGLNativeWindowType)m_hWnd, NULL);
+
+			if (egl_surface == EGL_NO_SURFACE ) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			egl_context = ::eglCreateContext(egl_display, config, EGL_NO_CONTEXT, attribs);
+
+			if (egl_context == EGL_NO_CONTEXT) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			if (!::eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)) {
+				success = GHOST_kFailure;
+				break;
+			}
+
+			success = GHOST_kSuccess;
+			break;
+		}
 #else
 #error
 #endif
+
 		case GHOST_kDrawingContextTypeNone:
 			success = GHOST_kSuccess;
 			break;
@@ -938,6 +1032,7 @@
 		default:
 			success = GHOST_kFailure;
 	}
+
 	return success;
 }
 
@@ -958,8 +1053,18 @@
 			}
 			break;
 #elif defined(WITH_GL_SYSTEM_EMBEDDED)
-			GHOST_PRINT("GHOST_WindowWin32::removeDrawingContext for WITH_GL_SYSTEM_EMBEDDED not implemented\n");
-			success = GHOST_kFailure;
+			if (egl_context != NULL) {
+				if (eglDestroyContext(egl_display, egl_context)) {
+					egl_context = NULL;
+					success = GHOST_kSuccess;
+				}
+				else {
+					success = GHOST_kFailure;
+				}
+			}
+			else {
+				success = GHOST_kFailure;
+			}
 			break;
 #else
 #error
@@ -1319,6 +1424,8 @@
 	return GHOST_kFailure;
 }
 
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
+
 /* Ron Fosner's code for weighting pixel formats and forcing software.
  * See http://www.opengl.org/resources/faq/technical/weight.cpp */
 
@@ -1410,4 +1517,4 @@
 	return iPixelFormat;
 }
 
-
+#endif

Modified: branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.h
===================================================================
--- branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.h	2013-07-22 16:49:37 UTC (rev 58506)
+++ branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowWin32.h	2013-07-22 17:58:54 UTC (rev 58507)
@@ -44,6 +44,9 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
+#if defined(WITH_GL_SYSTEM_EMBEDDED) // XXX jwilkins: can remove this after implementing GHOST_Context
+#include <GL/eglew.h>
+#endif
 
 #include <wintab.h>
 #define PACKETDATA  (PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR)
@@ -345,12 +348,19 @@
 	HWND m_hWnd;
 	/** Device context handle. */
 	HDC m_hDC;
+#if defined(WITH_GL_SYSTEM_DESKTOP) || defined(WITH_GL_SYSTEM_LEGACY)
 	/** OpenGL rendering context. */
 	HGLRC m_hGlRc;
 	/** The first created OpenGL context (for sharing display lists) */
 	static HGLRC s_firsthGLRc;
 	/** The first created device context handle. */
 	static HDC s_firstHDC;
+#endif
+#if defined(WITH_GL_SYSTEM_EMBEDDED)
+	EGLContext egl_context;
+	EGLSurface egl_surface;
+	EGLDisplay egl_display;
+#endif
 	/** Flag for if window has captured the mouse */
 	bool m_hasMouseCaptured;
 	/** Flag if an operator grabs the mouse with WM_cursor_grab_enable/ungrab() 

Modified: branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowX11.cpp
===================================================================
--- branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowX11.cpp	2013-07-22 16:49:37 UTC (rev 58506)
+++ branches/soc-2013-viewport_fx/intern/ghost/intern/GHOST_WindowX11.cpp	2013-07-22 17:58:54 UTC (rev 58507)
@@ -1349,6 +1349,7 @@
 #ifndef GLEW_INC_EGL
 	if (m_context != NULL) {
 		glXDestroyContext(m_display, m_context);
+		m_context = NULL;
 		success = GHOST_kSuccess;
 	}
 	else {

Modified: branches/soc-2013-viewport_fx/source/blender/blenfont/intern/blf_lang.c
===================================================================
--- branches/soc-2013-viewport_fx/source/blender/blenfont/intern/blf_lang.c	2013-07-22 16:49:37 UTC (rev 58506)
+++ branches/soc-2013-viewport_fx/source/blender/blenfont/intern/blf_lang.c	2013-07-22 17:58:54 UTC (rev 58507)
@@ -66,7 +66,7 @@
 			MEM_freeN((void *)locales_menu[idx].description); /* Also frees locales's relevant value! */
 		}
 
-		MEM_freeN(locales);
+		MEM_freeN((void*)locales);
 		locales = NULL;
 	}
 	if (locales_menu) {




More information about the Bf-blender-cvs mailing list