From 1327c124a4ed50d5572474aa11eb5e84bc0bc036 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 07:56:17 +0300 Subject: [PATCH 01/66] Seperate Context from Window in CMakeLists, add option to build for EGL --- CMakeLists.txt | 96 +++++++++++++++++++++++++++++++++++++++------- src/CMakeLists.txt | 5 +++ 2 files changed, 88 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44dcb4d4..dd5c35aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,14 @@ set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON) option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) +option(GLFW_USE_EGL "Build for EGL and OpenGL ES platform (Currently only X11)" OFF) -find_package(OpenGL REQUIRED) +if (GLFW_USE_EGL) + SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/modules) + find_package(EGL REQUIRED) +else() + find_package(OpenGL REQUIRED) +endif() #-------------------------------------------------------------------- # Enable all warnings on GCC, regardless of OS @@ -39,8 +45,14 @@ elseif (UNIX AND APPLE) set(_GLFW_COCOA_NSGL 1) message(STATUS "Building GLFW for Cocoa and NSOpenGL on Mac OS X") elseif (UNIX AND NOT APPLE) - set(_GLFW_X11_GLX 1) - message(STATUS "Building GLFW for X11 and GLX on a Unix-like system") + set(_GLFW_X11 1) + if (GLFW_USE_EGL) + set(_GLFW_X11_EGL 1) + message(STATUS "Building GLFW for X11 and EGL on a Unix-like system") + else() + set(_GLFW_X11_GLX 1) + message(STATUS "Building GLFW for X11 and GLX on a Unix-like system") + endif() else() message(FATAL_ERROR "No supported platform was detected") endif() @@ -62,20 +74,18 @@ if (_GLFW_WIN32_WGL) endif() #-------------------------------------------------------------------- -# Set up GLFW for Xlib and GLX on Unix-like systems with X Windows +# Set up GLFW for Xlib and GLX or EGL on Unix-like systems with X Windows #-------------------------------------------------------------------- -if (_GLFW_X11_GLX) +if (_GLFW_X11) find_package(X11 REQUIRED) - # Set up library and include paths - list(APPEND glfw_INCLUDE_DIRS ${X11_X11_INCLUDE_PATH} ${OPENGL_INCLUDE_DIR}) - list(APPEND glfw_LIBRARIES ${X11_X11_LIB} ${OPENGL_gl_LIBRARY}) - - set(GLFW_PKG_DEPS "gl x11") set(GLFW_PKG_LIBS "") + set(GLFW_PKG_DEPS "x11") - include(CheckFunctionExists) + # Set up library and include paths + list(APPEND glfw_INCLUDE_DIRS ${X11_X11_INCLUDE_PATH}) + list(APPEND glfw_LIBRARIES ${X11_X11_LIB}) # Check for XRandR (modern resolution switching extension) if (X11_Xrandr_FOUND) @@ -121,6 +131,25 @@ if (_GLFW_X11_GLX) set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -lm") endif() + if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + set(_GLFW_USE_LINUX_JOYSTICKS 1) + endif() + +endif() + +#-------------------------------------------------------------------- +# GLX Context +#-------------------------------------------------------------------- +if (_GLFW_X11_GLX) + + # Set up library and include paths + list(APPEND glfw_INCLUDE_DIRS${OPENGL_INCLUDE_DIR}) + list(APPEND glfw_LIBRARIES ${OPENGL_gl_LIBRARY}) + + set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} gl") + + include(CheckFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES ${OPENGL_gl_LIBRARY}) check_function_exists(glXGetProcAddress _GLFW_HAS_GLXGETPROCADDRESS) @@ -160,9 +189,50 @@ if (_GLFW_X11_GLX) endif() endif() - if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(_GLFW_USE_LINUX_JOYSTICKS 1) +endif() + +#-------------------------------------------------------------------- +# EGL Context +#-------------------------------------------------------------------- +if (_GLFW_X11_EGL) + + # Set up library and include paths + list(APPEND glfw_INCLUDE_DIRS${EGL_INCLUDE_DIR}) + list(APPEND glfw_LIBRARIES ${EGL_LIBRARY}) + + set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl") + + include(CheckFunctionExists) + + set(CMAKE_REQUIRED_LIBRARIES ${EGL_LIBRARY}) + + check_function_exists(eglGetProcAddress _GLFW_HAS_EGLGETPROCADDRESS) + + if (NOT _GLFW_HAS_EGLGETPROCADDRESS) + message(WARNING "No eglGetProcAddress found") + + # Check for dlopen support as a fallback + + find_library(DL_LIBRARY dl) + mark_as_advanced(DL_LIBRARY) + if (DL_LIBRARY) + set(CMAKE_REQUIRED_LIBRARIES ${DL_LIBRARY}) + else() + set(CMAKE_REQUIRED_LIBRARIES "") + endif() + + check_function_exists(dlopen _GLFW_HAS_DLOPEN) + + if (NOT _GLFW_HAS_DLOPEN) + message(FATAL_ERROR "No entry point retrieval mechanism found") + endif() + + if (DL_LIBRARY) + list(APPEND glfw_LIBRARIES ${DL_LIBRARY}) + set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") + endif() endif() + endif() #-------------------------------------------------------------------- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index add05982..9a4fba68 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,6 +25,11 @@ elseif (_GLFW_X11_GLX) set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c x11_joystick.c x11_keysym2unicode.c x11_opengl.c x11_time.c x11_window.c) +elseif (_GLFW_X11_EGL) + set(glfw_HEADERS ${common_HEADERS} x11_egl_platform.h) + set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c + x11_gamma.c x11_init.c x11_input.c x11_joystick.c + x11_keysym2unicode.c x11_egl_opengl.c x11_time.c x11_window.c) endif() add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) From 85067ede2e3f9c3beab04852e43b83fd580570b6 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 07:56:34 +0300 Subject: [PATCH 02/66] Add EGL related configurations --- src/config.h.in | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.h.in b/src/config.h.in index 01d541a2..ceb7e5a2 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -37,6 +37,8 @@ // Define this to 1 if building GLFW for X11/GLX #cmakedefine _GLFW_X11_GLX +// Define this to 1 if building GLFW for X11/EGL +#cmakedefine _GLFW_X11_EGL // Define this to 1 if building GLFW for Win32/WGL #cmakedefine _GLFW_WIN32_WGL // Define this to 1 if building GLFW for Cocoa/NSOpenGL @@ -63,6 +65,9 @@ // Define this to 1 if glXGetProcAddressEXT is available #cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT +// Define this to 1 if eglGetProcAddress is available +#cmakedefine _GLFW_HAS_EGLGETPROCADDRESS 1 + // Define this to 1 if the Linux joystick API is available #cmakedefine _GLFW_USE_LINUX_JOYSTICKS From 778a76683a38b49d2fcaa9f580841726ee122792 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 07:56:50 +0300 Subject: [PATCH 03/66] Add EGL X11 platform header --- src/internal.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/internal.h b/src/internal.h index 700b6c06..386d5858 100644 --- a/src/internal.h +++ b/src/internal.h @@ -82,6 +82,8 @@ typedef struct _GLFWlibrary _GLFWlibrary; #include "win32_platform.h" #elif defined(_GLFW_X11_GLX) #include "x11_platform.h" +#elif defined(_GLFW_X11_EGL) + #include "x11_egl_platform.h" #else #error "No supported platform selected" #endif From 27a7cc5aa8c0ae64c3ea3e8399583d353a7e4cb3 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 07:57:21 +0300 Subject: [PATCH 04/66] Add FindEGL.cmake module --- CMake/modules/FindEGL.cmake | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 CMake/modules/FindEGL.cmake diff --git a/CMake/modules/FindEGL.cmake b/CMake/modules/FindEGL.cmake new file mode 100644 index 00000000..0d5765ed --- /dev/null +++ b/CMake/modules/FindEGL.cmake @@ -0,0 +1,15 @@ +# Find EGL +# +# EGL_INCLUDE_DIR +# EGL_LIBRARY +# EGL_FOUND + +FIND_PATH(EGL_INCLUDE_DIR NAMES EGL/egl.h) + +SET(EGL_NAMES ${EGL_NAMES} egl EGL) +FIND_LIBRARY(EGL_LIBRARY NAMES ${EGL_NAMES}) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR) + +MARK_AS_ADVANCED(EGL_INCLUDE_DIR EGL_LIBRARY) From 812ebe200d88843f674926fbb245239e6758cc64 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 07:58:07 +0300 Subject: [PATCH 05/66] Add EGL X11 platform header --- src/x11_egl_platform.h | 285 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 src/x11_egl_platform.h diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h new file mode 100644 index 00000000..b1fb53cb --- /dev/null +++ b/src/x11_egl_platform.h @@ -0,0 +1,285 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: X11/EGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _platform_h_ +#define _platform_h_ + +#include +#include +#include +#include +#include +#include +#include + +// Include EGL +#include + +// With XFree86, we can use the XF86VidMode extension +#if defined(_GLFW_HAS_XF86VIDMODE) + #include +#endif + +#if defined(_GLFW_HAS_XRANDR) + #include +#endif + +// Do we have support for dlopen/dlsym? +#if defined(_GLFW_HAS_DLOPEN) + #include +#endif + +// The Xkb extension provides improved keyboard support +#if defined(_GLFW_HAS_XKB) + #include +#endif + +// We support two different ways for getting addresses for EGL +// extension functions: eglGetProcAddress and dlsym +#if defined(_GLFW_HAS_EGLGETPROCADDRESS) + #define _glfw_eglGetProcAddress(x) eglGetProcAddress(x) +#elif defined(_GLFW_HAS_DLOPEN) + #define _glfw_eglGetProcAddress(x) dlsym(_glfwLibrary.EGL.libEGL, x) + #define _GLFW_DLOPEN_LIBEGL +#else + #error "No OpenGL entry point retrieval mechanism was enabled" +#endif + +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL +#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL + +// Clipboard format atom indices +#define _GLFW_CLIPBOARD_FORMAT_UTF8 0 +#define _GLFW_CLIPBOARD_FORMAT_COMPOUND 1 +#define _GLFW_CLIPBOARD_FORMAT_STRING 2 +#define _GLFW_CLIPBOARD_FORMAT_COUNT 3 + +// Clipboard conversion status tokens +#define _GLFW_CONVERSION_INACTIVE 0 +#define _GLFW_CONVERSION_SUCCEEDED 1 +#define _GLFW_CONVERSION_FAILED 2 + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Pointer length integer +//------------------------------------------------------------------------ +typedef intptr_t GLFWintptr; + + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextEGL +{ + EGLConfig config; + EGLContext context; + EGLSurface surface; + XVisualInfo* visual; +} _GLFWcontextEGL; + + +//------------------------------------------------------------------------ +// Platform-specific window structure +//------------------------------------------------------------------------ +typedef struct _GLFWwindowX11 +{ + // Platform specific window resources + Colormap colormap; // Window colormap + Window handle; // Window handle + + // Various platform specific internal variables + GLboolean overrideRedirect; // True if window is OverrideRedirect + GLboolean keyboardGrabbed; // True if keyboard is currently grabbed + GLboolean cursorGrabbed; // True if cursor is currently grabbed + GLboolean cursorHidden; // True if cursor is currently hidden + GLboolean cursorCentered; // True if cursor was moved since last poll + int cursorPosX, cursorPosY; + +} _GLFWwindowX11; + +//------------------------------------------------------------------------ +// Platform-specific library global data for X11 +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryX11 +{ + Display* display; + int screen; + Window root; + Cursor cursor; // Invisible cursor for hidden cursor + + Atom wmDeleteWindow; // WM_DELETE_WINDOW atom + Atom wmName; // _NET_WM_NAME atom + Atom wmIconName; // _NET_WM_ICON_NAME atom + Atom wmPing; // _NET_WM_PING atom + Atom wmState; // _NET_WM_STATE atom + Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom + Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom + + // True if window manager supports EWMH + GLboolean hasEWMH; + + struct { + GLboolean available; + int eventBase; + int errorBase; + } VidMode; + + struct { + GLboolean available; + int eventBase; + int errorBase; + int majorVersion; + int minorVersion; + GLboolean gammaBroken; + } RandR; + + struct { + GLboolean available; + int majorOpcode; + int eventBase; + int errorBase; + int majorVersion; + int minorVersion; + } Xkb; + + // Key code LUT (mapping X11 key codes to GLFW key codes) + int keyCodeLUT[256]; + + // Screensaver data + struct { + GLboolean changed; + int timeout; + int interval; + int blanking; + int exposure; + } saver; + + // Fullscreen data + struct { + GLboolean modeChanged; +#if defined(_GLFW_HAS_XRANDR) + SizeID oldSizeID; + int oldWidth; + int oldHeight; + Rotation oldRotation; +#endif /*_GLFW_HAS_XRANDR*/ +#if defined(_GLFW_HAS_XF86VIDMODE) + XF86VidModeModeInfo oldMode; +#endif /*_GLFW_HAS_XF86VIDMODE*/ + } FS; + + // Timer data + struct { + GLboolean monotonic; + double resolution; + uint64_t base; + } timer; + + // Selection data + struct { + Atom atom; + Atom formats[_GLFW_CLIPBOARD_FORMAT_COUNT]; + char* string; + Atom target; + Atom targets; + Atom property; + int status; + } selection; + +} _GLFWlibraryX11; + +//------------------------------------------------------------------------ +// Platform-specific library global data for EGL +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryEGL +{ + EGLDisplay display; + EGLint majorVersion, minorVersion; + +#if defined(_GLFW_DLOPEN_LIBEGL) + void* libEGL; // dlopen handle for libEGL.so +#endif +} _GLFWlibraryEGL; + +//------------------------------------------------------------------------ +// Joystick information & state +//------------------------------------------------------------------------ +GLFWGLOBAL struct { + int Present; + int fd; + int NumAxes; + int NumButtons; + float* Axis; + unsigned char* Button; +} _glfwJoy[GLFW_JOYSTICK_LAST + 1]; + + +//======================================================================== +// Prototypes for platform specific internal functions +//======================================================================== + +// Time +void _glfwInitTimer(void); + +// OpenGL(|ES) support +int _glfwInitOpenGL(void); +void _glfwTerminateOpenGL(void); +int _glfwCreateContext(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + const _GLFWfbconfig* fbconfig); +void _glfwDestroyContext(_GLFWwindow* window); + +// Fullscreen support +int _glfwGetClosestVideoMode(int* width, int* height, int* rate); +void _glfwSetVideoModeMODE(int mode, int rate); +void _glfwSetVideoMode(int* width, int* height, int* rate); +void _glfwRestoreVideoMode(void); + +// Joystick input +void _glfwInitJoysticks(void); +void _glfwTerminateJoysticks(void); + +// Unicode support +long _glfwKeySym2Unicode(KeySym keysym); + +// Clipboard handling +GLboolean _glfwReadSelection(XSelectionEvent* request); +Atom _glfwWriteSelection(XSelectionRequestEvent* request); + +// Event processing +void _glfwProcessPendingEvents(void); + +#endif // _platform_h_ From c878281487f1e2f3c1c4c0663d9bdd6c90bdcb4d Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 07:58:27 +0300 Subject: [PATCH 06/66] Add EGL platform opengl implentation --- src/x11_egl_opengl.c | 462 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 462 insertions(+) create mode 100644 src/x11_egl_opengl.c diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c new file mode 100644 index 00000000..efbadc06 --- /dev/null +++ b/src/x11_egl_opengl.c @@ -0,0 +1,462 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: X11/EGL/GLES +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + +#include +#include + +// Max number of EGL configuration we handle +#define _GLFW_EGL_CONFIG_IN 15 + +//======================================================================== +// Returns the specified attribute of the specified EGLConfig +//======================================================================== + +static int getFBConfigAttrib(_GLFWwindow* window, EGLConfig fbconfig, int attrib) +{ + int value; + eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, attrib, &value); + return value; +} + + +//======================================================================== +// Return a list of available and usable framebuffer configs +//======================================================================== + +static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) +{ + EGLConfig fbconfigs[_GLFW_EGL_CONFIG_IN]; + _GLFWfbconfig* result; + int i, count = 0; + + *found = 0; + + + eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs, + _GLFW_EGL_CONFIG_IN, &count); + if (!count) + { + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "X11/EGL: No EGLConfigs returned"); + return NULL; + } + + result = (_GLFWfbconfig*) malloc(sizeof(_GLFWfbconfig) * count); + if (!result) + { + _glfwSetError(GLFW_OUT_OF_MEMORY, + "X11/EGL: Failed to allocate _GLFWfbconfig array"); + return NULL; + } + + for (i = 0; i < count; i++) + { + if (!getFBConfigAttrib(window, fbconfigs[i], EGL_NATIVE_VISUAL_ID)) + { + // Only consider EGLConfigs with associated visuals + continue; + } + + if (!(getFBConfigAttrib(window, + fbconfigs[i], + EGL_COLOR_BUFFER_TYPE) & EGL_RGB_BUFFER)) + { + // Only consider RGB(A) EGLConfigs + continue; + } + + if (!(getFBConfigAttrib(window, fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_WINDOW_BIT)) + { + // Only consider window EGLConfigs + continue; + } + + result[*found].redBits = getFBConfigAttrib(window, fbconfigs[i], EGL_RED_SIZE); + result[*found].greenBits = getFBConfigAttrib(window, fbconfigs[i], EGL_GREEN_SIZE); + result[*found].blueBits = getFBConfigAttrib(window, fbconfigs[i], EGL_BLUE_SIZE); + + result[*found].alphaBits = getFBConfigAttrib(window, fbconfigs[i], EGL_ALPHA_SIZE); + result[*found].depthBits = getFBConfigAttrib(window, fbconfigs[i], EGL_DEPTH_SIZE); + result[*found].stencilBits = getFBConfigAttrib(window, fbconfigs[i], EGL_STENCIL_SIZE); + + result[*found].samples = getFBConfigAttrib(window, fbconfigs[i], EGL_SAMPLES); + + result[*found].platformID = (GLFWintptr) getFBConfigAttrib(window, fbconfigs[i], EGL_CONFIG_ID); + + (*found)++; + } + + return result; +} + +//======================================================================== +// Read back framebuffer parameters from the context +//======================================================================== + +static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) +{ + EGLint dummy; + EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN]; + + int attribs[] = { EGL_CONFIG_ID, fbconfigID, None }; + + eglChooseConfig(_glfwLibrary.EGL.display, + attribs, + fbconfig, + _GLFW_EGL_CONFIG_IN, + &dummy); + if (!dummy) + { + // This should never ever happen + // TODO: Flag this as an error and propagate up + _glfwSetError(GLFW_PLATFORM_ERROR, "X11/EGL: Cannot find known " + "EGLConfig by ID. This cannot " + "happen. Have a nice day.\n"); + abort(); + } + + // There is no clear definition of an "accelerated" context on X11/EGL, and + // true sounds better than false, so we hardcode true here + window->accelerated = GL_TRUE; + + window->redBits = getFBConfigAttrib(window, *fbconfig, EGL_RED_SIZE); + window->greenBits = getFBConfigAttrib(window, *fbconfig, EGL_GREEN_SIZE); + window->blueBits = getFBConfigAttrib(window, *fbconfig, EGL_BLUE_SIZE); + + window->alphaBits = getFBConfigAttrib(window, *fbconfig, EGL_ALPHA_SIZE); + window->depthBits = getFBConfigAttrib(window, *fbconfig, EGL_DEPTH_SIZE); + window->stencilBits = getFBConfigAttrib(window, *fbconfig, EGL_STENCIL_SIZE); + + // Get FSAA buffer sample count + window->samples = getFBConfigAttrib(window, *fbconfig, EGL_SAMPLES); +} + + +//======================================================================== +// Create the actual OpenGL(|ES) context +//======================================================================== + +#define setEGLattrib(attribs, index, attribName, attribValue) \ + attribs[index++] = attribName; \ + attribs[index++] = attribValue; + +static int createContext(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + EGLint fbconfigID) +{ + int attribs[40]; + EGLint dummy, index, vid; + EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN]; + EGLContext share = NULL; + XVisualInfo visTemplate; + + if (wndconfig->share) + share = wndconfig->share->EGL.context; + + // Retrieve the previously selected EGLConfig + { + index = 0; + + setEGLattrib(attribs, index, EGL_CONFIG_ID, fbconfigID); + setEGLattrib(attribs, index, None, None); + + eglChooseConfig(_glfwLibrary.EGL.display, + attribs, + fbconfig, + _GLFW_EGL_CONFIG_IN, + &dummy); + + if (!dummy) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: Failed to retrieve the selected EGLConfig"); + return GL_FALSE; + } + } + + // Retrieve the corresponding visual + if (!eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &vid)) { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: Failed to retrieve visual for EGLConfig"); + return GL_FALSE; + } + + // The X window visual must match the EGL config + visTemplate.visualid = vid; + window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, VisualIDMask, &visTemplate, &dummy); + if (window->EGL.visual == NULL) { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/GLX: Failed to retrieve visual for EGLConfig"); + return GL_FALSE; + } + + if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) + { + setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, 2); + } + else + { + setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, 1); + } + + setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); + + eglBindAPI(EGL_OPENGL_ES_API); + + window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, *fbconfig, share, attribs); + if (window->EGL.context == EGL_NO_CONTEXT) + { + // TODO: Handle all the various error codes here + + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: Failed to create OpenGL(|ES) context"); + return GL_FALSE; + } + + refreshContextParams(window, fbconfigID); + + return GL_TRUE; +} + +#undef setEGLattrib + + +////////////////////////////////////////////////////////////////////////// +////// GLFW internal API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Initialize EGL +//======================================================================== + +int _glfwInitOpenGL(void) +{ +#ifdef _GLFW_DLOPEN_LIBGL + int i; + char* libEGL_names[ ] = + { + "libEGL.so", + "libEGL.so.1", + "/usr/lib/libEGL.so", + "/usr/lib/libEGL.so.1", + NULL + }; + + for (i = 0; libEGL_names[i] != NULL; i++) + { + _glfwLibrary.EGL.libEGL = dlopen(libEGL_names[i], RTLD_LAZY | RTLD_GLOBAL); + if (_glfwLibrary.EGL.libEGL) + break; + } + + if (!_glfwLibrary.EGL.libEGL) + { + _glfwSetError(GLFW_PLATFORM_ERROR, "X11/EGL: Failed to find libEGL"); + return GL_FALSE; + } +#endif + + _glfwLibrary.EGL.display = eglGetDisplay((EGLNativeDisplayType)_glfwLibrary.X11.display); + if (_glfwLibrary.EGL.display == EGL_NO_DISPLAY) + { + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "X11/EGL: Failed to get EGL display"); + return GL_FALSE; + } + + if (!eglInitialize(_glfwLibrary.EGL.display, + &_glfwLibrary.EGL.majorVersion, + &_glfwLibrary.EGL.minorVersion)) + { + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "X11/EGL: Failed to initialize EGL"); + return GL_FALSE; + } + + return GL_TRUE; +} + + +//======================================================================== +// Terminate EGL +//======================================================================== + +void _glfwTerminateOpenGL(void) +{ + // Unload libEGL.so if necessary +#ifdef _GLFW_DLOPEN_LIBGL + if (_glfwLibrary.EGL.libEGL != NULL) + { + dlclose(_glfwLibrary.EGL.libEGL); + _glfwLibrary.EGL.libEGL = NULL; + } +#endif + eglTerminate(_glfwLibrary.EGL.display); +} + + +//======================================================================== +// Prepare for creation of the OpenGL context +//======================================================================== + +int _glfwCreateContext(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + const _GLFWfbconfig* fbconfig) +{ + _GLFWfbconfig closest; + + // Choose the best available fbconfig + { + unsigned int fbcount; + _GLFWfbconfig* fbconfigs; + const _GLFWfbconfig* result; + + fbconfigs = getFBConfigs(window, &fbcount); + if (!fbconfigs) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: No usable EGLFBConfigs found"); + return GL_FALSE; + } + + result = _glfwChooseFBConfig(fbconfig, fbconfigs, fbcount); + if (!result) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: No EGLFBConfig matched the criteria"); + + free(fbconfigs); + return GL_FALSE; + } + + closest = *result; + free(fbconfigs); + } + + return createContext(window, wndconfig, closest.platformID); +} + + +//======================================================================== +// Destroy the OpenGL context +//======================================================================== + +void _glfwDestroyContext(_GLFWwindow* window) +{ + if (window->EGL.context) + { + // Release and destroy the context + eglMakeCurrent(_glfwLibrary.EGL.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + window->EGL.context = NULL; + } +} + + +//======================================================================== +// Make the OpenGL context associated with the specified window current +//======================================================================== + +void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) +{ + if (window) + { + eglMakeCurrent(_glfwLibrary.EGL.display, + window->EGL.surface, + window->EGL.surface, + window->EGL.context); + } + else + eglMakeCurrent(_glfwLibrary.EGL.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); +} + + +//======================================================================== +// Swap OpenGL buffers +//======================================================================== + +void _glfwPlatformSwapBuffers(void) +{ + eglSwapBuffers(_glfwLibrary.EGL.display, + _glfwLibrary.currentWindow->EGL.surface); +} + + +//======================================================================== +// Set double buffering swap interval +//======================================================================== + +void _glfwPlatformSwapInterval(int interval) +{ + eglSwapInterval(_glfwLibrary.EGL.display, interval); +} + + +//======================================================================== +// Check if an OpenGL extension is available at runtime +//======================================================================== + +int _glfwPlatformExtensionSupported(const char* extension) +{ + const char* extensions; + + // Get list of GLX extensions + extensions = eglQueryString(_glfwLibrary.EGL.display, + EGL_EXTENSIONS); + if (extensions != NULL) + { + if (_glfwStringInExtensionString(extension, (unsigned char*)extensions)) + return GL_TRUE; + } + + return GL_FALSE; +} + + +//======================================================================== +// Get the function pointer to an OpenGL function +//======================================================================== + +void* _glfwPlatformGetProcAddress(const char* procname) +{ + return (void*) _glfw_eglGetProcAddress(procname); +} + + +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + // AFAIK, EGL doesn't have this +} + From 29b4ed4e9a6731a2ccda09020d65d84e1a5281a3 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 09:33:29 +0300 Subject: [PATCH 07/66] Don't build tests and examples when building with EGL --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd5c35aa..8680aec2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,10 @@ elseif (UNIX AND NOT APPLE) set(_GLFW_X11 1) if (GLFW_USE_EGL) set(_GLFW_X11_EGL 1) + set(GLFW_BUILD_EXAMPLES 0) + set(GLFW_BUILD_TESTS 0) message(STATUS "Building GLFW for X11 and EGL on a Unix-like system") + message(STATUS "NOTE: Examples and tests are disabled for EGL") else() set(_GLFW_X11_GLX 1) message(STATUS "Building GLFW for X11 and GLX on a Unix-like system") From d99e2385c12e41085cd9fc90c8be9c260f23e19a Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 09:34:00 +0300 Subject: [PATCH 08/66] Add temporary #ifdef in x11_fullscreen so EGL compiles --- src/x11_fullscreen.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/x11_fullscreen.c b/src/x11_fullscreen.c index 7ad11ec5..a17acde4 100644 --- a/src/x11_fullscreen.c +++ b/src/x11_fullscreen.c @@ -357,6 +357,8 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount) rgbarray = (int*) malloc(sizeof(int) * viscount); rgbcount = 0; + // Temporary solution +#if !defined(_GLFW_X11_EGL) // Build RGB array for (k = 0; k < viscount; k++) { @@ -386,6 +388,7 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount) } } } +#endif XFree(vislist); From 28db982d0ab3565bd1817b7bacf686140b6a8b47 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 09:34:42 +0300 Subject: [PATCH 09/66] Add x11_fullscreen.c to the source list --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a4fba68..3ba760f9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,7 +27,7 @@ elseif (_GLFW_X11_GLX) x11_keysym2unicode.c x11_opengl.c x11_time.c x11_window.c) elseif (_GLFW_X11_EGL) set(glfw_HEADERS ${common_HEADERS} x11_egl_platform.h) - set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c + set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c x11_joystick.c x11_keysym2unicode.c x11_egl_opengl.c x11_time.c x11_window.c) endif() From e06515eaa09f2baf73532cc678c0f51c0039d581 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 09:35:02 +0300 Subject: [PATCH 10/66] Improve OpenGL version parsing from string --- src/opengl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/opengl.c b/src/opengl.c index 67b5e728..957e4d24 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -32,6 +32,7 @@ #include #include +#include //======================================================================== @@ -42,13 +43,16 @@ static void parseGLVersion(int* major, int* minor, int* rev) { GLuint _major, _minor = 0, _rev = 0; const GLubyte* version; - const GLubyte* ptr; - const char* glesPrefix = "OpenGL ES "; version = glGetString(GL_VERSION); if (!version) return; +#if 0 + // Old version detection code. This doesn't work very well + const GLubyte* ptr; + const char* glesPrefix = "OpenGL ES "; + if (strncmp((const char*) version, glesPrefix, strlen(glesPrefix)) == 0) { // The version string on OpenGL ES has a prefix before the version @@ -76,6 +80,12 @@ static void parseGLVersion(int* major, int* minor, int* rev) _rev = 10 * _rev + (*ptr - '0'); } } +#endif + + // Find version from OpenGL string + for (; version && + !sscanf(version, "%d.%d.%d", &_major, &_minor, &_rev); + ++version); // Store result *major = _major; From 478eac2fe0a5101f42adb945badb52be6976fad1 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 09:35:47 +0300 Subject: [PATCH 11/66] Create window surface and add fallback for visual info retival --- src/x11_egl_opengl.c | 110 ++++++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 32 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index efbadc06..12bf71f5 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -40,7 +40,7 @@ // Returns the specified attribute of the specified EGLConfig //======================================================================== -static int getFBConfigAttrib(_GLFWwindow* window, EGLConfig fbconfig, int attrib) +static int getFBConfigAttrib(EGLConfig fbconfig, int attrib) { int value; eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, attrib, &value); @@ -80,37 +80,36 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) for (i = 0; i < count; i++) { - if (!getFBConfigAttrib(window, fbconfigs[i], EGL_NATIVE_VISUAL_ID)) + if (!getFBConfigAttrib(fbconfigs[i], EGL_NATIVE_VISUAL_ID)) { // Only consider EGLConfigs with associated visuals continue; } - if (!(getFBConfigAttrib(window, - fbconfigs[i], + if (!(getFBConfigAttrib(fbconfigs[i], EGL_COLOR_BUFFER_TYPE) & EGL_RGB_BUFFER)) { // Only consider RGB(A) EGLConfigs continue; } - if (!(getFBConfigAttrib(window, fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_WINDOW_BIT)) + if (!(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_WINDOW_BIT)) { // Only consider window EGLConfigs continue; } - result[*found].redBits = getFBConfigAttrib(window, fbconfigs[i], EGL_RED_SIZE); - result[*found].greenBits = getFBConfigAttrib(window, fbconfigs[i], EGL_GREEN_SIZE); - result[*found].blueBits = getFBConfigAttrib(window, fbconfigs[i], EGL_BLUE_SIZE); + result[*found].redBits = getFBConfigAttrib(fbconfigs[i], EGL_RED_SIZE); + result[*found].greenBits = getFBConfigAttrib(fbconfigs[i], EGL_GREEN_SIZE); + result[*found].blueBits = getFBConfigAttrib(fbconfigs[i], EGL_BLUE_SIZE); - result[*found].alphaBits = getFBConfigAttrib(window, fbconfigs[i], EGL_ALPHA_SIZE); - result[*found].depthBits = getFBConfigAttrib(window, fbconfigs[i], EGL_DEPTH_SIZE); - result[*found].stencilBits = getFBConfigAttrib(window, fbconfigs[i], EGL_STENCIL_SIZE); + result[*found].alphaBits = getFBConfigAttrib(fbconfigs[i], EGL_ALPHA_SIZE); + result[*found].depthBits = getFBConfigAttrib(fbconfigs[i], EGL_DEPTH_SIZE); + result[*found].stencilBits = getFBConfigAttrib(fbconfigs[i], EGL_STENCIL_SIZE); - result[*found].samples = getFBConfigAttrib(window, fbconfigs[i], EGL_SAMPLES); + result[*found].samples = getFBConfigAttrib(fbconfigs[i], EGL_SAMPLES); - result[*found].platformID = (GLFWintptr) getFBConfigAttrib(window, fbconfigs[i], EGL_CONFIG_ID); + result[*found].platformID = (GLFWintptr) getFBConfigAttrib(fbconfigs[i], EGL_CONFIG_ID); (*found)++; } @@ -148,16 +147,16 @@ static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) // true sounds better than false, so we hardcode true here window->accelerated = GL_TRUE; - window->redBits = getFBConfigAttrib(window, *fbconfig, EGL_RED_SIZE); - window->greenBits = getFBConfigAttrib(window, *fbconfig, EGL_GREEN_SIZE); - window->blueBits = getFBConfigAttrib(window, *fbconfig, EGL_BLUE_SIZE); + window->redBits = getFBConfigAttrib(*fbconfig, EGL_RED_SIZE); + window->greenBits = getFBConfigAttrib(*fbconfig, EGL_GREEN_SIZE); + window->blueBits = getFBConfigAttrib(*fbconfig, EGL_BLUE_SIZE); - window->alphaBits = getFBConfigAttrib(window, *fbconfig, EGL_ALPHA_SIZE); - window->depthBits = getFBConfigAttrib(window, *fbconfig, EGL_DEPTH_SIZE); - window->stencilBits = getFBConfigAttrib(window, *fbconfig, EGL_STENCIL_SIZE); + window->alphaBits = getFBConfigAttrib(*fbconfig, EGL_ALPHA_SIZE); + window->depthBits = getFBConfigAttrib(*fbconfig, EGL_DEPTH_SIZE); + window->stencilBits = getFBConfigAttrib(*fbconfig, EGL_STENCIL_SIZE); // Get FSAA buffer sample count - window->samples = getFBConfigAttrib(window, *fbconfig, EGL_SAMPLES); + window->samples = getFBConfigAttrib(*fbconfig, EGL_SAMPLES); } @@ -173,8 +172,9 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, EGLint fbconfigID) { - int attribs[40]; - EGLint dummy, index, vid; + int attribs[40], visMask; + EGLint dummy, index, vid = 0; + EGLint red_size, green_size, blue_size, alpha_size; EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN]; EGLContext share = NULL; XVisualInfo visTemplate; @@ -187,7 +187,7 @@ static int createContext(_GLFWwindow* window, index = 0; setEGLattrib(attribs, index, EGL_CONFIG_ID, fbconfigID); - setEGLattrib(attribs, index, None, None); + setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); eglChooseConfig(_glfwLibrary.EGL.display, attribs, @@ -204,21 +204,47 @@ static int createContext(_GLFWwindow* window, } // Retrieve the corresponding visual - if (!eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &vid)) { - _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to retrieve visual for EGLConfig"); - return GL_FALSE; + // NOTE: This is the only non-portable code in this file. + // Maybe it would not hurt too much to add #ifdefs for different platforms? + eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &vid); + + // Init visual template + visTemplate.screen = _glfwLibrary.X11.screen; + visMask = VisualScreenMask; + + if (vid != 0) + { + // The X window visual must match the EGL config + visTemplate.visualid = vid; + visMask |= VisualIDMask; + } + else + { + // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID + // attribute, so attempt to find the closest match. + + eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + EGL_RED_SIZE, &red_size); + eglGetConfigAttrib (_glfwLibrary.EGL.display, *fbconfig, + EGL_GREEN_SIZE, &green_size); + eglGetConfigAttrib (_glfwLibrary.EGL.display, *fbconfig, + EGL_BLUE_SIZE, &blue_size); + eglGetConfigAttrib (_glfwLibrary.EGL.display, *fbconfig, + EGL_ALPHA_SIZE, &alpha_size); + + visTemplate.depth = red_size + green_size + blue_size + alpha_size; + visMask |= VisualDepthMask; } - // The X window visual must match the EGL config - visTemplate.visualid = vid; - window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, VisualIDMask, &visTemplate, &dummy); + // Get X Visual + window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, visMask, &visTemplate, &dummy); if (window->EGL.visual == NULL) { _glfwSetError(GLFW_PLATFORM_ERROR, "X11/GLX: Failed to retrieve visual for EGLConfig"); return GL_FALSE; } + index = 0; if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) { setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, 2); @@ -242,6 +268,9 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } + // store configuraion + window->EGL.config = *fbconfig; + refreshContextParams(window, fbconfigID); return GL_TRUE; @@ -372,11 +401,18 @@ int _glfwCreateContext(_GLFWwindow* window, void _glfwDestroyContext(_GLFWwindow* window) { + if (window->EGL.surface) + { + // Release and destroy the surface + eglDestroySurface(_glfwLibrary.EGL.display, window->EGL.surface); + window->EGL.surface = EGL_NO_SURFACE; + } + if (window->EGL.context) { // Release and destroy the context - eglMakeCurrent(_glfwLibrary.EGL.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - window->EGL.context = NULL; + eglDestroyContext(_glfwLibrary.EGL.display, window->EGL.context); + window->EGL.context = EGL_NO_CONTEXT; } } @@ -389,6 +425,16 @@ void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) { if (window) { + if (window->EGL.surface == EGL_NO_SURFACE) + { + window->EGL.surface = eglCreateWindowSurface(_glfwLibrary.EGL.display, + window->EGL.config, (EGLNativeWindowType)window->X11.handle, NULL); + if (window->EGL.surface == EGL_NO_SURFACE) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: Failed to create window surface"); + } + } eglMakeCurrent(_glfwLibrary.EGL.display, window->EGL.surface, window->EGL.surface, From 819b09d479dc1eac5adad7718fb934117ea584a3 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Wed, 25 Apr 2012 09:36:38 +0300 Subject: [PATCH 12/66] Add member struct defines for window's context members so code can be shared --- src/x11_egl_platform.h | 1 + src/x11_platform.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index b1fb53cb..f2fe4092 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -76,6 +76,7 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL +#define _GLFW_CTX EGL // Clipboard format atom indices #define _GLFW_CLIPBOARD_FORMAT_UTF8 0 diff --git a/src/x11_platform.h b/src/x11_platform.h index 39593655..28e749fe 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -85,6 +85,7 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX +#define _GLFW_CTX GLX // Clipboard format atom indices #define _GLFW_CLIPBOARD_FORMAT_UTF8 0 From 2815630688ce777f9bd34408ee7365ef04e74b0e Mon Sep 17 00:00:00 2001 From: Cloudef Date: Thu, 26 Apr 2012 02:26:01 +0300 Subject: [PATCH 13/66] Reflect X visual changes to EGL code --- src/x11_egl_opengl.c | 14 ++++++++++++++ src/x11_egl_platform.h | 1 + 2 files changed, 15 insertions(+) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 12bf71f5..923e3e22 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -401,6 +401,12 @@ int _glfwCreateContext(_GLFWwindow* window, void _glfwDestroyContext(_GLFWwindow* window) { + if (window->EGL.visual) + { + XFree(window->EGL.visual); + window->EGL.visual = NULL; + } + if (window->EGL.surface) { // Release and destroy the surface @@ -416,6 +422,14 @@ void _glfwDestroyContext(_GLFWwindow* window) } } +//======================================================================== +// Return the X visual associated with the specified context +//======================================================================== + +XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window) +{ + return window->EGL.visual; +} //======================================================================== // Make the OpenGL context associated with the specified window current diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index f2fe4092..87ba39a0 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -262,6 +262,7 @@ int _glfwCreateContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig); void _glfwDestroyContext(_GLFWwindow* window); +XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window); // Fullscreen support int _glfwGetClosestVideoMode(int* width, int* height, int* rate); From 5cf8b8d3fa949e400a6b30b94630eb415a040177 Mon Sep 17 00:00:00 2001 From: Cloudef Date: Fri, 11 May 2012 23:02:38 +0300 Subject: [PATCH 14/66] Remove useless define --- src/x11_egl_platform.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index 87ba39a0..9e0e21b4 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -76,7 +76,6 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL -#define _GLFW_CTX EGL // Clipboard format atom indices #define _GLFW_CLIPBOARD_FORMAT_UTF8 0 From 2e7d91ea5a3c25f0cc8b7547461eb40f580f9219 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sat, 30 Jun 2012 22:25:26 +0300 Subject: [PATCH 15/66] Only consider OpenGL ES contexes EGL_WINDOW_BIT is compared agaist wrong attribute --- src/x11_egl_opengl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 923e3e22..7df15963 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -93,12 +93,19 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) continue; } - if (!(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_WINDOW_BIT)) + if (!(getFBConfigAttrib(fbconfigs[i], EGL_SURFACE_TYPE) & EGL_WINDOW_BIT)) { // Only consider window EGLConfigs continue; } + if (!(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT) && + !(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + { + // Only consider OpenGL ES context + continue; + } + result[*found].redBits = getFBConfigAttrib(fbconfigs[i], EGL_RED_SIZE); result[*found].greenBits = getFBConfigAttrib(fbconfigs[i], EGL_GREEN_SIZE); result[*found].blueBits = getFBConfigAttrib(fbconfigs[i], EGL_BLUE_SIZE); From 739be03373aea279e0bb6c7566e1af094fac247e Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sat, 30 Jun 2012 22:35:26 +0300 Subject: [PATCH 16/66] Obey the OPENGL_ES2_PROFILE hint --- src/x11_egl_opengl.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 7df15963..90507f86 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -52,7 +52,7 @@ static int getFBConfigAttrib(EGLConfig fbconfig, int attrib) // Return a list of available and usable framebuffer configs //======================================================================== -static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) +static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, unsigned int* found) { EGLConfig fbconfigs[_GLFW_EGL_CONFIG_IN]; _GLFWfbconfig* result; @@ -106,6 +106,13 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) continue; } + if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && + !(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + { + // User requested only OpenGL ES 2.0 context + continue; + } + result[*found].redBits = getFBConfigAttrib(fbconfigs[i], EGL_RED_SIZE); result[*found].greenBits = getFBConfigAttrib(fbconfigs[i], EGL_GREEN_SIZE); result[*found].blueBits = getFBConfigAttrib(fbconfigs[i], EGL_BLUE_SIZE); @@ -376,7 +383,7 @@ int _glfwCreateContext(_GLFWwindow* window, _GLFWfbconfig* fbconfigs; const _GLFWfbconfig* result; - fbconfigs = getFBConfigs(window, &fbcount); + fbconfigs = getFBConfigs(window, wndconfig, &fbcount); if (!fbconfigs) { _glfwSetError(GLFW_PLATFORM_ERROR, From db0a4b599d6275c832f2a2cfa540f2f7eaa071fa Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Tue, 17 Jul 2012 22:29:09 +0300 Subject: [PATCH 17/66] Fix GLubyte warning, by casting to (char*) --- src/opengl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl.c b/src/opengl.c index 957e4d24..59097e1e 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -84,7 +84,7 @@ static void parseGLVersion(int* major, int* minor, int* rev) // Find version from OpenGL string for (; version && - !sscanf(version, "%d.%d.%d", &_major, &_minor, &_rev); + !sscanf((char*)version, "%d.%d.%d", &_major, &_minor, &_rev); ++version); // Store result From 6b1344af3cb283f751edba3a036f6aeccb98b6a4 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Tue, 17 Jul 2012 23:06:30 +0300 Subject: [PATCH 18/66] Use GLFWglproc return type --- src/x11_egl_opengl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 90507f86..e1eed5cd 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -519,9 +519,9 @@ int _glfwPlatformExtensionSupported(const char* extension) // Get the function pointer to an OpenGL function //======================================================================== -void* _glfwPlatformGetProcAddress(const char* procname) +GLFWglproc _glfwPlatformGetProcAddress(const char* procname) { - return (void*) _glfw_eglGetProcAddress(procname); + return _glfw_eglGetProcAddress(procname); } From 311b9df1021b0327cb13be33e428e46bd89b6cf2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 19 Jul 2012 22:11:45 +0200 Subject: [PATCH 19/66] Added error for unsupported call. --- src/x11_egl_opengl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index e1eed5cd..52d00b97 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -531,6 +531,7 @@ GLFWglproc _glfwPlatformGetProcAddress(const char* procname) void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) { - // AFAIK, EGL doesn't have this + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: Context copying not supported by EGL"); } From f004aa0f8259c27dd92f51264268fa5ebfe73a9b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 19 Jul 2012 22:14:08 +0200 Subject: [PATCH 20/66] Formatting. --- CMake/modules/FindEGL.cmake | 13 +++++++------ CMakeLists.txt | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CMake/modules/FindEGL.cmake b/CMake/modules/FindEGL.cmake index 0d5765ed..0929c920 100644 --- a/CMake/modules/FindEGL.cmake +++ b/CMake/modules/FindEGL.cmake @@ -4,12 +4,13 @@ # EGL_LIBRARY # EGL_FOUND -FIND_PATH(EGL_INCLUDE_DIR NAMES EGL/egl.h) +find_path(EGL_INCLUDE_DIR NAMES EGL/egl.h) -SET(EGL_NAMES ${EGL_NAMES} egl EGL) -FIND_LIBRARY(EGL_LIBRARY NAMES ${EGL_NAMES}) +set(EGL_NAMES ${EGL_NAMES} egl EGL) +find_library(EGL_LIBRARY NAMES ${EGL_NAMES}) -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR) + +mark_as_advanced(EGL_INCLUDE_DIR EGL_LIBRARY) -MARK_AS_ADVANCED(EGL_INCLUDE_DIR EGL_LIBRARY) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8680aec2..bd3e944c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(GLFW_USE_EGL "Build for EGL and OpenGL ES platform (Currently only X11)" OFF) if (GLFW_USE_EGL) - SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/modules) + set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/modules) find_package(EGL REQUIRED) else() find_package(OpenGL REQUIRED) @@ -200,7 +200,7 @@ endif() if (_GLFW_X11_EGL) # Set up library and include paths - list(APPEND glfw_INCLUDE_DIRS${EGL_INCLUDE_DIR}) + list(APPEND glfw_INCLUDE_DIRS ${EGL_INCLUDE_DIR}) list(APPEND glfw_LIBRARIES ${EGL_LIBRARY}) set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl") From be12cbca152e211587ab53dcc1cbef6bec09f3b3 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 19 Jul 2012 23:01:51 +0200 Subject: [PATCH 21/66] Added separate platform headers for EGL and GLX. --- src/cocoa_platform.h | 4 + src/internal.h | 9 +- src/win32_platform.h | 5 + src/x11_egl_platform.h | 206 +---------------------------------------- src/x11_glx_platform.h | 125 +++++++++++++++++++++++++ src/x11_platform.h | 84 +---------------- 6 files changed, 143 insertions(+), 290 deletions(-) create mode 100644 src/x11_glx_platform.h diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 97e903d7..b3fe0491 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -41,6 +41,10 @@ typedef void* id; #endif +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of glext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/glext.h" #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL diff --git a/src/internal.h b/src/internal.h index 386d5858..37813c6f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -71,19 +71,12 @@ typedef struct _GLFWlibrary _GLFWlibrary; #include "../include/GL/glfw3.h" -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of glext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/glext.h" - #if defined(_GLFW_COCOA_NSGL) #include "cocoa_platform.h" #elif defined(_GLFW_WIN32_WGL) #include "win32_platform.h" -#elif defined(_GLFW_X11_GLX) +#elif defined(_GLFW_X11_GLX) || defined(_GLFW_X11_EGL) #include "x11_platform.h" -#elif defined(_GLFW_X11_EGL) - #include "x11_egl_platform.h" #else #error "No supported platform selected" #endif diff --git a/src/win32_platform.h b/src/win32_platform.h index eeadbf22..849dd337 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -63,6 +63,11 @@ #include #include +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of glext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/glext.h" + // This path may need to be changed if you build GLFW using your own setup // We ship and use our own copy of wglext.h since GLFW uses fairly new // extensions and not all operating systems come with an up-to-date version diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index 9e0e21b4..769323c4 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -28,39 +28,16 @@ // //======================================================================== -#ifndef _platform_h_ -#define _platform_h_ +#ifndef _x11_egl_platform_h_ +#define _x11_egl_platform_h_ -#include -#include -#include -#include -#include -#include -#include - -// Include EGL #include -// With XFree86, we can use the XF86VidMode extension -#if defined(_GLFW_HAS_XF86VIDMODE) - #include -#endif - -#if defined(_GLFW_HAS_XRANDR) - #include -#endif - // Do we have support for dlopen/dlsym? #if defined(_GLFW_HAS_DLOPEN) #include #endif -// The Xkb extension provides improved keyboard support -#if defined(_GLFW_HAS_XKB) - #include -#endif - // We support two different ways for getting addresses for EGL // extension functions: eglGetProcAddress and dlsym #if defined(_GLFW_HAS_EGLGETPROCADDRESS) @@ -72,33 +49,14 @@ #error "No OpenGL entry point retrieval mechanism was enabled" #endif -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL -#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL -// Clipboard format atom indices -#define _GLFW_CLIPBOARD_FORMAT_UTF8 0 -#define _GLFW_CLIPBOARD_FORMAT_COMPOUND 1 -#define _GLFW_CLIPBOARD_FORMAT_STRING 2 -#define _GLFW_CLIPBOARD_FORMAT_COUNT 3 - -// Clipboard conversion status tokens -#define _GLFW_CONVERSION_INACTIVE 0 -#define _GLFW_CONVERSION_SUCCEEDED 1 -#define _GLFW_CONVERSION_FAILED 2 - //======================================================================== // GLFW platform specific types //======================================================================== -//------------------------------------------------------------------------ -// Pointer length integer -//------------------------------------------------------------------------ -typedef intptr_t GLFWintptr; - - //------------------------------------------------------------------------ // Platform-specific OpenGL context structure //------------------------------------------------------------------------ @@ -111,116 +69,6 @@ typedef struct _GLFWcontextEGL } _GLFWcontextEGL; -//------------------------------------------------------------------------ -// Platform-specific window structure -//------------------------------------------------------------------------ -typedef struct _GLFWwindowX11 -{ - // Platform specific window resources - Colormap colormap; // Window colormap - Window handle; // Window handle - - // Various platform specific internal variables - GLboolean overrideRedirect; // True if window is OverrideRedirect - GLboolean keyboardGrabbed; // True if keyboard is currently grabbed - GLboolean cursorGrabbed; // True if cursor is currently grabbed - GLboolean cursorHidden; // True if cursor is currently hidden - GLboolean cursorCentered; // True if cursor was moved since last poll - int cursorPosX, cursorPosY; - -} _GLFWwindowX11; - -//------------------------------------------------------------------------ -// Platform-specific library global data for X11 -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryX11 -{ - Display* display; - int screen; - Window root; - Cursor cursor; // Invisible cursor for hidden cursor - - Atom wmDeleteWindow; // WM_DELETE_WINDOW atom - Atom wmName; // _NET_WM_NAME atom - Atom wmIconName; // _NET_WM_ICON_NAME atom - Atom wmPing; // _NET_WM_PING atom - Atom wmState; // _NET_WM_STATE atom - Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom - Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom - - // True if window manager supports EWMH - GLboolean hasEWMH; - - struct { - GLboolean available; - int eventBase; - int errorBase; - } VidMode; - - struct { - GLboolean available; - int eventBase; - int errorBase; - int majorVersion; - int minorVersion; - GLboolean gammaBroken; - } RandR; - - struct { - GLboolean available; - int majorOpcode; - int eventBase; - int errorBase; - int majorVersion; - int minorVersion; - } Xkb; - - // Key code LUT (mapping X11 key codes to GLFW key codes) - int keyCodeLUT[256]; - - // Screensaver data - struct { - GLboolean changed; - int timeout; - int interval; - int blanking; - int exposure; - } saver; - - // Fullscreen data - struct { - GLboolean modeChanged; -#if defined(_GLFW_HAS_XRANDR) - SizeID oldSizeID; - int oldWidth; - int oldHeight; - Rotation oldRotation; -#endif /*_GLFW_HAS_XRANDR*/ -#if defined(_GLFW_HAS_XF86VIDMODE) - XF86VidModeModeInfo oldMode; -#endif /*_GLFW_HAS_XF86VIDMODE*/ - } FS; - - // Timer data - struct { - GLboolean monotonic; - double resolution; - uint64_t base; - } timer; - - // Selection data - struct { - Atom atom; - Atom formats[_GLFW_CLIPBOARD_FORMAT_COUNT]; - char* string; - Atom target; - Atom targets; - Atom property; - int status; - } selection; - -} _GLFWlibraryX11; - //------------------------------------------------------------------------ // Platform-specific library global data for EGL //------------------------------------------------------------------------ @@ -234,53 +82,5 @@ typedef struct _GLFWlibraryEGL #endif } _GLFWlibraryEGL; -//------------------------------------------------------------------------ -// Joystick information & state -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - int Present; - int fd; - int NumAxes; - int NumButtons; - float* Axis; - unsigned char* Button; -} _glfwJoy[GLFW_JOYSTICK_LAST + 1]; - -//======================================================================== -// Prototypes for platform specific internal functions -//======================================================================== - -// Time -void _glfwInitTimer(void); - -// OpenGL(|ES) support -int _glfwInitOpenGL(void); -void _glfwTerminateOpenGL(void); -int _glfwCreateContext(_GLFWwindow* window, - const _GLFWwndconfig* wndconfig, - const _GLFWfbconfig* fbconfig); -void _glfwDestroyContext(_GLFWwindow* window); -XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window); - -// Fullscreen support -int _glfwGetClosestVideoMode(int* width, int* height, int* rate); -void _glfwSetVideoModeMODE(int mode, int rate); -void _glfwSetVideoMode(int* width, int* height, int* rate); -void _glfwRestoreVideoMode(void); - -// Joystick input -void _glfwInitJoysticks(void); -void _glfwTerminateJoysticks(void); - -// Unicode support -long _glfwKeySym2Unicode(KeySym keysym); - -// Clipboard handling -GLboolean _glfwReadSelection(XSelectionEvent* request); -Atom _glfwWriteSelection(XSelectionRequestEvent* request); - -// Event processing -void _glfwProcessPendingEvents(void); - -#endif // _platform_h_ +#endif // _x11_egl_platform_h_ diff --git a/src/x11_glx_platform.h b/src/x11_glx_platform.h new file mode 100644 index 00000000..b5397d06 --- /dev/null +++ b/src/x11_glx_platform.h @@ -0,0 +1,125 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: X11/GLX +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _x11_glx_platform_h_ +#define _x11_glx_platform_h_ + +#define GLX_GLXEXT_LEGACY +#include + +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of glext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/glext.h" + +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of glxext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/glxext.h" + +// Do we have support for dlopen/dlsym? +#if defined(_GLFW_HAS_DLOPEN) + #include +#endif + +// We support four different ways for getting addresses for GL/GLX +// extension functions: glXGetProcAddress, glXGetProcAddressARB, +// glXGetProcAddressEXT, and dlsym +#if defined(_GLFW_HAS_GLXGETPROCADDRESSARB) + #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) +#elif defined(_GLFW_HAS_GLXGETPROCADDRESS) + #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) +#elif defined(_GLFW_HAS_GLXGETPROCADDRESSEXT) + #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) +#elif defined(_GLFW_HAS_DLOPEN) + #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.GLX.libGL, x) + #define _GLFW_DLOPEN_LIBGL +#else + #error "No OpenGL entry point retrieval mechanism was enabled" +#endif + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX +#define _GLFW_CTX GLX + +#ifndef GLX_MESA_swap_control +typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); +#endif + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextGLX +{ + GLXContext context; // OpenGL rendering context + XVisualInfo* visual; // Visual for selected GLXFBConfig + +} _GLFWcontextGLX; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for GLX +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryGLX +{ + // Server-side GLX version + int majorVersion, minorVersion; + + // GLX extensions + PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; + PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA; + PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; + PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; + PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; + PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX; + PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + GLboolean SGIX_fbconfig; + GLboolean SGI_swap_control; + GLboolean EXT_swap_control; + GLboolean MESA_swap_control; + GLboolean ARB_multisample; + GLboolean ARB_create_context; + GLboolean ARB_create_context_profile; + GLboolean ARB_create_context_robustness; + GLboolean EXT_create_context_es2_profile; + +#if defined(_GLFW_DLOPEN_LIBGL) + void* libGL; // dlopen handle for libGL.so +#endif +} _GLFWlibraryGLX; + + +#endif // _x11_glx_platform_h_ diff --git a/src/x11_platform.h b/src/x11_platform.h index 28e749fe..6089f4cb 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -38,14 +38,6 @@ #include #include -#define GLX_GLXEXT_LEGACY -#include - -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of glxext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/glxext.h" - // With XFree86, we can use the XF86VidMode extension #if defined(_GLFW_HAS_XF86VIDMODE) #include @@ -55,37 +47,19 @@ #include #endif -// Do we have support for dlopen/dlsym? -#if defined(_GLFW_HAS_DLOPEN) - #include -#endif - // The Xkb extension provides improved keyboard support #if defined(_GLFW_HAS_XKB) #include #endif -// We support four different ways for getting addresses for GL/GLX -// extension functions: glXGetProcAddress, glXGetProcAddressARB, -// glXGetProcAddressEXT, and dlsym -#if defined(_GLFW_HAS_GLXGETPROCADDRESSARB) - #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) -#elif defined(_GLFW_HAS_GLXGETPROCADDRESS) - #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) -#elif defined(_GLFW_HAS_GLXGETPROCADDRESSEXT) - #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) -#elif defined(_GLFW_HAS_DLOPEN) - #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.GLX.libGL, x) - #define _GLFW_DLOPEN_LIBGL -#else - #error "No OpenGL entry point retrieval mechanism was enabled" +#if defined(_GLFW_X11_GLX) + #include "x11_glx_platform.h" +#elif defined(_GLFW_X11_EGL) + #include "x11_egl_platform.h" #endif #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 -#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX -#define _GLFW_CTX GLX // Clipboard format atom indices #define _GLFW_CLIPBOARD_FORMAT_UTF8 0 @@ -98,10 +72,6 @@ #define _GLFW_CONVERSION_SUCCEEDED 1 #define _GLFW_CONVERSION_FAILED 2 -#ifndef GLX_MESA_swap_control -typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); -#endif - //======================================================================== // GLFW platform specific types @@ -113,17 +83,6 @@ typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); typedef intptr_t GLFWintptr; -//------------------------------------------------------------------------ -// Platform-specific OpenGL context structure -//------------------------------------------------------------------------ -typedef struct _GLFWcontextGLX -{ - GLXContext context; // OpenGL rendering context - XVisualInfo* visual; // Visual for selected GLXFBConfig - -} _GLFWcontextGLX; - - //------------------------------------------------------------------------ // Platform-specific window structure //------------------------------------------------------------------------ @@ -236,39 +195,6 @@ typedef struct _GLFWlibraryX11 } _GLFWlibraryX11; -//------------------------------------------------------------------------ -// Platform-specific library global data for GLX -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryGLX -{ - // Server-side GLX version - int majorVersion, minorVersion; - - // GLX extensions - PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; - PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; - PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA; - PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; - PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; - PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; - PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX; - PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; - GLboolean SGIX_fbconfig; - GLboolean SGI_swap_control; - GLboolean EXT_swap_control; - GLboolean MESA_swap_control; - GLboolean ARB_multisample; - GLboolean ARB_create_context; - GLboolean ARB_create_context_profile; - GLboolean ARB_create_context_robustness; - GLboolean EXT_create_context_es2_profile; - -#if defined(_GLFW_DLOPEN_LIBGL) - void* libGL; // dlopen handle for libGL.so -#endif -} _GLFWlibraryGLX; - - //------------------------------------------------------------------------ // Joystick information & state //------------------------------------------------------------------------ From 3fd17741bc0de05feb9699250bacb1e75c88a4f3 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 19 Jul 2012 23:20:47 +0200 Subject: [PATCH 22/66] Added macro for including the GLES2 header. --- include/GL/glfw3.h | 2 ++ readme.html | 1 + 2 files changed, 3 insertions(+) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 28e38bd1..2ff67627 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -161,6 +161,8 @@ extern "C" { #else #if defined(GLFW_INCLUDE_GL3) #include + #elif defined(GLFW_INCLUDE_ES2) + #include #else #include #endif diff --git a/readme.html b/readme.html index b854a59c..cdbb9885 100644 --- a/readme.html +++ b/readme.html @@ -284,6 +284,7 @@ version of GLFW.

  • Added GLFW_OPENGL_ROBUSTNESS window hint and associated strategy tokens for GL_ARB_robustness support
  • Added GLFW_OPENGL_REVISION window parameter to make up for removal of glfwGetGLVersion
  • Added GLFW_INCLUDE_GL3 macro for telling the GLFW header to include gl3.h header instead of gl.h
  • +
  • Added GLFW_INCLUDE_ES2 macro for telling the GLFW header to include the OpenGL ES 2.0 header instead of gl.h
  • Added windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • Added modes video mode enumeration and setting test program
  • From 26a843043cca03d4a8e2bf4fd516dbea0274bdb4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 19 Jul 2012 23:51:51 +0200 Subject: [PATCH 23/66] Formatting, removed trivial comments. --- src/x11_egl_opengl.c | 76 +++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 52d00b97..3390dbd7 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -36,6 +36,7 @@ // Max number of EGL configuration we handle #define _GLFW_EGL_CONFIG_IN 15 + //======================================================================== // Returns the specified attribute of the specified EGLConfig //======================================================================== @@ -52,7 +53,9 @@ static int getFBConfigAttrib(EGLConfig fbconfig, int attrib) // Return a list of available and usable framebuffer configs //======================================================================== -static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, unsigned int* found) +static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + unsigned int* found) { EGLConfig fbconfigs[_GLFW_EGL_CONFIG_IN]; _GLFWfbconfig* result; @@ -60,9 +63,8 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, const _GLFWwndconfig* wn *found = 0; - eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs, - _GLFW_EGL_CONFIG_IN, &count); + _GLFW_EGL_CONFIG_IN, &count); if (!count) { _glfwSetError(GLFW_OPENGL_UNAVAILABLE, @@ -131,6 +133,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, const _GLFWwndconfig* wn return result; } + //======================================================================== // Read back framebuffer parameters from the context //======================================================================== @@ -143,10 +146,11 @@ static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) int attribs[] = { EGL_CONFIG_ID, fbconfigID, None }; eglChooseConfig(_glfwLibrary.EGL.display, - attribs, - fbconfig, - _GLFW_EGL_CONFIG_IN, - &dummy); + attribs, + fbconfig, + _GLFW_EGL_CONFIG_IN, + &dummy); + if (!dummy) { // This should never ever happen @@ -169,7 +173,6 @@ static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) window->depthBits = getFBConfigAttrib(*fbconfig, EGL_DEPTH_SIZE); window->stencilBits = getFBConfigAttrib(*fbconfig, EGL_STENCIL_SIZE); - // Get FSAA buffer sample count window->samples = getFBConfigAttrib(*fbconfig, EGL_SAMPLES); } @@ -204,10 +207,10 @@ static int createContext(_GLFWwindow* window, setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); eglChooseConfig(_glfwLibrary.EGL.display, - attribs, - fbconfig, - _GLFW_EGL_CONFIG_IN, - &dummy); + attribs, + fbconfig, + _GLFW_EGL_CONFIG_IN, + &dummy); if (!dummy) { @@ -238,21 +241,23 @@ static int createContext(_GLFWwindow* window, // attribute, so attempt to find the closest match. eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, - EGL_RED_SIZE, &red_size); - eglGetConfigAttrib (_glfwLibrary.EGL.display, *fbconfig, - EGL_GREEN_SIZE, &green_size); - eglGetConfigAttrib (_glfwLibrary.EGL.display, *fbconfig, - EGL_BLUE_SIZE, &blue_size); - eglGetConfigAttrib (_glfwLibrary.EGL.display, *fbconfig, - EGL_ALPHA_SIZE, &alpha_size); + EGL_RED_SIZE, &red_size); + eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + EGL_GREEN_SIZE, &green_size); + eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + EGL_BLUE_SIZE, &blue_size); + eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + EGL_ALPHA_SIZE, &alpha_size); visTemplate.depth = red_size + green_size + blue_size + alpha_size; visMask |= VisualDepthMask; } - // Get X Visual - window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, visMask, &visTemplate, &dummy); - if (window->EGL.visual == NULL) { + window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, + visMask, &visTemplate, &dummy); + + if (window->EGL.visual == NULL) + { _glfwSetError(GLFW_PLATFORM_ERROR, "X11/GLX: Failed to retrieve visual for EGLConfig"); return GL_FALSE; @@ -272,7 +277,9 @@ static int createContext(_GLFWwindow* window, eglBindAPI(EGL_OPENGL_ES_API); - window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, *fbconfig, share, attribs); + window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, + *fbconfig, share, attribs); + if (window->EGL.context == EGL_NO_CONTEXT) { // TODO: Handle all the various error codes here @@ -282,7 +289,6 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } - // store configuraion window->EGL.config = *fbconfig; refreshContextParams(window, fbconfigID); @@ -328,7 +334,7 @@ int _glfwInitOpenGL(void) } #endif - _glfwLibrary.EGL.display = eglGetDisplay((EGLNativeDisplayType)_glfwLibrary.X11.display); + _glfwLibrary.EGL.display = eglGetDisplay((EGLNativeDisplayType) _glfwLibrary.X11.display); if (_glfwLibrary.EGL.display == EGL_NO_DISPLAY) { _glfwSetError(GLFW_OPENGL_UNAVAILABLE, @@ -337,8 +343,8 @@ int _glfwInitOpenGL(void) } if (!eglInitialize(_glfwLibrary.EGL.display, - &_glfwLibrary.EGL.majorVersion, - &_glfwLibrary.EGL.minorVersion)) + &_glfwLibrary.EGL.majorVersion, + &_glfwLibrary.EGL.minorVersion)) { _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/EGL: Failed to initialize EGL"); @@ -423,19 +429,18 @@ void _glfwDestroyContext(_GLFWwindow* window) if (window->EGL.surface) { - // Release and destroy the surface eglDestroySurface(_glfwLibrary.EGL.display, window->EGL.surface); window->EGL.surface = EGL_NO_SURFACE; } if (window->EGL.context) { - // Release and destroy the context eglDestroyContext(_glfwLibrary.EGL.display, window->EGL.context); window->EGL.context = EGL_NO_CONTEXT; } } + //======================================================================== // Return the X visual associated with the specified context //======================================================================== @@ -445,6 +450,7 @@ XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window) return window->EGL.visual; } + //======================================================================== // Make the OpenGL context associated with the specified window current //======================================================================== @@ -456,20 +462,26 @@ void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) if (window->EGL.surface == EGL_NO_SURFACE) { window->EGL.surface = eglCreateWindowSurface(_glfwLibrary.EGL.display, - window->EGL.config, (EGLNativeWindowType)window->X11.handle, NULL); + window->EGL.config, + (EGLNativeWindowType) window->X11.handle, + NULL); if (window->EGL.surface == EGL_NO_SURFACE) { _glfwSetError(GLFW_PLATFORM_ERROR, "X11/EGL: Failed to create window surface"); } } + eglMakeCurrent(_glfwLibrary.EGL.display, window->EGL.surface, window->EGL.surface, window->EGL.context); } else - eglMakeCurrent(_glfwLibrary.EGL.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + { + eglMakeCurrent(_glfwLibrary.EGL.display, + EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } } @@ -507,7 +519,7 @@ int _glfwPlatformExtensionSupported(const char* extension) EGL_EXTENSIONS); if (extensions != NULL) { - if (_glfwStringInExtensionString(extension, (unsigned char*)extensions)) + if (_glfwStringInExtensionString(extension, (unsigned char*) extensions)) return GL_TRUE; } From 251964f84f7f81784426370fc5aa05dafab7578e Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 00:14:52 +0200 Subject: [PATCH 24/66] Began decoupling EGL code from X11. --- src/x11_egl_opengl.c | 4 ++-- src/x11_egl_platform.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 3390dbd7..eaefd640 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -334,7 +334,7 @@ int _glfwInitOpenGL(void) } #endif - _glfwLibrary.EGL.display = eglGetDisplay((EGLNativeDisplayType) _glfwLibrary.X11.display); + _glfwLibrary.EGL.display = eglGetDisplay(_GLFW_EGL_NATIVE_DISPLAY); if (_glfwLibrary.EGL.display == EGL_NO_DISPLAY) { _glfwSetError(GLFW_OPENGL_UNAVAILABLE, @@ -463,7 +463,7 @@ void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) { window->EGL.surface = eglCreateWindowSurface(_glfwLibrary.EGL.display, window->EGL.config, - (EGLNativeWindowType) window->X11.handle, + _GLFW_EGL_NATIVE_WINDOW, NULL); if (window->EGL.surface == EGL_NO_SURFACE) { diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index 769323c4..1ab83f89 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -52,6 +52,9 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL +#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->X11.handle) +#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfwLibrary.X11.display) + //======================================================================== // GLFW platform specific types From d3d972aa9ddf622a7a64b1eb0bd827add15a6752 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 00:15:36 +0200 Subject: [PATCH 25/66] Fixed typo in dlopen macro. --- src/x11_egl_opengl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index eaefd640..0367ef40 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -309,7 +309,7 @@ static int createContext(_GLFWwindow* window, int _glfwInitOpenGL(void) { -#ifdef _GLFW_DLOPEN_LIBGL +#ifdef _GLFW_DLOPEN_LIBEGL int i; char* libEGL_names[ ] = { @@ -362,7 +362,7 @@ int _glfwInitOpenGL(void) void _glfwTerminateOpenGL(void) { // Unload libEGL.so if necessary -#ifdef _GLFW_DLOPEN_LIBGL +#ifdef _GLFW_DLOPEN_LIBEGL if (_glfwLibrary.EGL.libEGL != NULL) { dlclose(_glfwLibrary.EGL.libEGL); From fd4967b01a373607ca8174bf6fd778edd41d3c93 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 00:17:58 +0200 Subject: [PATCH 26/66] Removed superfluous casts. --- src/x11_egl_platform.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index 1ab83f89..149bdf2f 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -52,8 +52,8 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL -#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->X11.handle) -#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfwLibrary.X11.display) +#define _GLFW_EGL_NATIVE_WINDOW window->X11.handle +#define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display //======================================================================== From fd688e033212bdb59181871ddfdf7e369b2e4c97 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 00:19:58 +0200 Subject: [PATCH 27/66] Formatting. --- src/x11_egl_opengl.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 0367ef40..a0479183 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -190,7 +190,7 @@ static int createContext(_GLFWwindow* window, EGLint fbconfigID) { int attribs[40], visMask; - EGLint dummy, index, vid = 0; + EGLint dummy, index, visualID = 0; EGLint red_size, green_size, blue_size, alpha_size; EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN]; EGLContext share = NULL; @@ -223,16 +223,16 @@ static int createContext(_GLFWwindow* window, // Retrieve the corresponding visual // NOTE: This is the only non-portable code in this file. // Maybe it would not hurt too much to add #ifdefs for different platforms? - eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &vid); + eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &visualID); // Init visual template visTemplate.screen = _glfwLibrary.X11.screen; visMask = VisualScreenMask; - if (vid != 0) + if (visualID) { // The X window visual must match the EGL config - visTemplate.visualid = vid; + visTemplate.visualid = visualID; visMask |= VisualIDMask; } else @@ -285,7 +285,7 @@ static int createContext(_GLFWwindow* window, // TODO: Handle all the various error codes here _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to create OpenGL(|ES) context"); + "X11/EGL: Failed to create OpenGL ES context"); return GL_FALSE; } @@ -361,7 +361,6 @@ int _glfwInitOpenGL(void) void _glfwTerminateOpenGL(void) { - // Unload libEGL.so if necessary #ifdef _GLFW_DLOPEN_LIBEGL if (_glfwLibrary.EGL.libEGL != NULL) { @@ -369,6 +368,7 @@ void _glfwTerminateOpenGL(void) _glfwLibrary.EGL.libEGL = NULL; } #endif + eglTerminate(_glfwLibrary.EGL.display); } @@ -468,7 +468,7 @@ void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) if (window->EGL.surface == EGL_NO_SURFACE) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to create window surface"); + "X11/EGL: Failed to create window surface"); } } From ddb497c5d5198498951da394fdebadd1cc6922c1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 02:02:20 +0200 Subject: [PATCH 28/66] Removed hard-coded EGL config limit. --- src/x11_egl_opengl.c | 81 ++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index a0479183..c82adabe 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -33,9 +33,6 @@ #include #include -// Max number of EGL configuration we handle -#define _GLFW_EGL_CONFIG_IN 15 - //======================================================================== // Returns the specified attribute of the specified EGLConfig @@ -57,16 +54,26 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, unsigned int* found) { - EGLConfig fbconfigs[_GLFW_EGL_CONFIG_IN]; + EGLConfig* fbconfigs; _GLFWfbconfig* result; int i, count = 0; *found = 0; - eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs, - _GLFW_EGL_CONFIG_IN, &count); + eglGetConfigs(_glfwLibrary.EGL.display, NULL, 0, &count); + + fbconfigs = (EGLConfig*) malloc(sizeof(EGLConfig) * count); + if (!fbconfigs) + { + _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); + return NULL; + } + + eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs, count, &count); if (!count) { + free(fbconfigs); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/EGL: No EGLConfigs returned"); return NULL; @@ -75,8 +82,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, result = (_GLFWfbconfig*) malloc(sizeof(_GLFWfbconfig) * count); if (!result) { - _glfwSetError(GLFW_OUT_OF_MEMORY, - "X11/EGL: Failed to allocate _GLFWfbconfig array"); + free(fbconfigs); + + _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); return NULL; } @@ -130,6 +138,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, (*found)++; } + free(fbconfigs); return result; } @@ -140,18 +149,13 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) { - EGLint dummy; - EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN]; + EGLint count; + EGLConfig fbconfig; int attribs[] = { EGL_CONFIG_ID, fbconfigID, None }; - eglChooseConfig(_glfwLibrary.EGL.display, - attribs, - fbconfig, - _GLFW_EGL_CONFIG_IN, - &dummy); - - if (!dummy) + eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count); + if (!count) { // This should never ever happen // TODO: Flag this as an error and propagate up @@ -165,15 +169,15 @@ static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) // true sounds better than false, so we hardcode true here window->accelerated = GL_TRUE; - window->redBits = getFBConfigAttrib(*fbconfig, EGL_RED_SIZE); - window->greenBits = getFBConfigAttrib(*fbconfig, EGL_GREEN_SIZE); - window->blueBits = getFBConfigAttrib(*fbconfig, EGL_BLUE_SIZE); + window->redBits = getFBConfigAttrib(fbconfig, EGL_RED_SIZE); + window->greenBits = getFBConfigAttrib(fbconfig, EGL_GREEN_SIZE); + window->blueBits = getFBConfigAttrib(fbconfig, EGL_BLUE_SIZE); - window->alphaBits = getFBConfigAttrib(*fbconfig, EGL_ALPHA_SIZE); - window->depthBits = getFBConfigAttrib(*fbconfig, EGL_DEPTH_SIZE); - window->stencilBits = getFBConfigAttrib(*fbconfig, EGL_STENCIL_SIZE); + window->alphaBits = getFBConfigAttrib(fbconfig, EGL_ALPHA_SIZE); + window->depthBits = getFBConfigAttrib(fbconfig, EGL_DEPTH_SIZE); + window->stencilBits = getFBConfigAttrib(fbconfig, EGL_STENCIL_SIZE); - window->samples = getFBConfigAttrib(*fbconfig, EGL_SAMPLES); + window->samples = getFBConfigAttrib(fbconfig, EGL_SAMPLES); } @@ -190,9 +194,9 @@ static int createContext(_GLFWwindow* window, EGLint fbconfigID) { int attribs[40], visMask; - EGLint dummy, index, visualID = 0; + EGLint count, index, visualID = 0; EGLint red_size, green_size, blue_size, alpha_size; - EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN]; + EGLConfig fbconfig; EGLContext share = NULL; XVisualInfo visTemplate; @@ -206,13 +210,8 @@ static int createContext(_GLFWwindow* window, setEGLattrib(attribs, index, EGL_CONFIG_ID, fbconfigID); setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); - eglChooseConfig(_glfwLibrary.EGL.display, - attribs, - fbconfig, - _GLFW_EGL_CONFIG_IN, - &dummy); - - if (!dummy) + eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count); + if (!count) { _glfwSetError(GLFW_PLATFORM_ERROR, "X11/EGL: Failed to retrieve the selected EGLConfig"); @@ -223,7 +222,7 @@ static int createContext(_GLFWwindow* window, // Retrieve the corresponding visual // NOTE: This is the only non-portable code in this file. // Maybe it would not hurt too much to add #ifdefs for different platforms? - eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &visualID); + eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_NATIVE_VISUAL_ID, &visualID); // Init visual template visTemplate.screen = _glfwLibrary.X11.screen; @@ -240,13 +239,13 @@ static int createContext(_GLFWwindow* window, // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID // attribute, so attempt to find the closest match. - eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_RED_SIZE, &red_size); - eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_GREEN_SIZE, &green_size); - eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_BLUE_SIZE, &blue_size); - eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_ALPHA_SIZE, &alpha_size); visTemplate.depth = red_size + green_size + blue_size + alpha_size; @@ -254,7 +253,7 @@ static int createContext(_GLFWwindow* window, } window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, - visMask, &visTemplate, &dummy); + visMask, &visTemplate, &count); if (window->EGL.visual == NULL) { @@ -278,7 +277,7 @@ static int createContext(_GLFWwindow* window, eglBindAPI(EGL_OPENGL_ES_API); window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, - *fbconfig, share, attribs); + fbconfig, share, attribs); if (window->EGL.context == EGL_NO_CONTEXT) { @@ -289,7 +288,7 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } - window->EGL.config = *fbconfig; + window->EGL.config = fbconfig; refreshContextParams(window, fbconfigID); From c9c94e44d217e9777cac199298502bc1d05ce3f1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 02:08:01 +0200 Subject: [PATCH 29/66] Formatting. --- src/x11_egl_opengl.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index c82adabe..a6582aa7 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -90,6 +90,8 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, for (i = 0; i < count; i++) { + _GLFWfbconfig* f = result + *found; + if (!getFBConfigAttrib(fbconfigs[i], EGL_NATIVE_VISUAL_ID)) { // Only consider EGLConfigs with associated visuals @@ -117,23 +119,23 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, } if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + !(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) { // User requested only OpenGL ES 2.0 context continue; } - result[*found].redBits = getFBConfigAttrib(fbconfigs[i], EGL_RED_SIZE); - result[*found].greenBits = getFBConfigAttrib(fbconfigs[i], EGL_GREEN_SIZE); - result[*found].blueBits = getFBConfigAttrib(fbconfigs[i], EGL_BLUE_SIZE); + f->redBits = getFBConfigAttrib(fbconfigs[i], EGL_RED_SIZE); + f->greenBits = getFBConfigAttrib(fbconfigs[i], EGL_GREEN_SIZE); + f->blueBits = getFBConfigAttrib(fbconfigs[i], EGL_BLUE_SIZE); - result[*found].alphaBits = getFBConfigAttrib(fbconfigs[i], EGL_ALPHA_SIZE); - result[*found].depthBits = getFBConfigAttrib(fbconfigs[i], EGL_DEPTH_SIZE); - result[*found].stencilBits = getFBConfigAttrib(fbconfigs[i], EGL_STENCIL_SIZE); + f->alphaBits = getFBConfigAttrib(fbconfigs[i], EGL_ALPHA_SIZE); + f->depthBits = getFBConfigAttrib(fbconfigs[i], EGL_DEPTH_SIZE); + f->stencilBits = getFBConfigAttrib(fbconfigs[i], EGL_STENCIL_SIZE); - result[*found].samples = getFBConfigAttrib(fbconfigs[i], EGL_SAMPLES); + f->samples = getFBConfigAttrib(fbconfigs[i], EGL_SAMPLES); - result[*found].platformID = (GLFWintptr) getFBConfigAttrib(fbconfigs[i], EGL_CONFIG_ID); + f->platformID = (GLFWintptr) getFBConfigAttrib(fbconfigs[i], EGL_CONFIG_ID); (*found)++; } From 1a05d6db70f3d6202c6affccac405be31eb7fa92 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 02:10:39 +0200 Subject: [PATCH 30/66] Renamed GLX implementation file. --- src/CMakeLists.txt | 8 +++++--- src/{x11_opengl.c => x11_glx_opengl.c} | 0 2 files changed, 5 insertions(+), 3 deletions(-) rename src/{x11_opengl.c => x11_glx_opengl.c} (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3ba760f9..680cb241 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,13 +23,15 @@ elseif (_GLFW_WIN32_WGL) elseif (_GLFW_X11_GLX) set(glfw_HEADERS ${common_HEADERS} x11_platform.h) set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c - x11_gamma.c x11_init.c x11_input.c x11_joystick.c - x11_keysym2unicode.c x11_opengl.c x11_time.c x11_window.c) + x11_gamma.c x11_glx_opengl.c x11_init.c x11_input.c + x11_joystick.c x11_keysym2unicode.c x11_time.c + x11_window.c) elseif (_GLFW_X11_EGL) set(glfw_HEADERS ${common_HEADERS} x11_egl_platform.h) set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c x11_joystick.c - x11_keysym2unicode.c x11_egl_opengl.c x11_time.c x11_window.c) + x11_keysym2unicode.c x11_egl_opengl.c x11_time.c + x11_window.c) endif() add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) diff --git a/src/x11_opengl.c b/src/x11_glx_opengl.c similarity index 100% rename from src/x11_opengl.c rename to src/x11_glx_opengl.c From 546124f1fb14e2f7ebb917015c5a406b24b6617f Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 02:10:59 +0200 Subject: [PATCH 31/66] Fixed invalid file mode. --- src/win32_window.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/win32_window.c diff --git a/src/win32_window.c b/src/win32_window.c old mode 100755 new mode 100644 From 5417130f96075650a1142f14b6507d3cef15651a Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 03:03:33 +0200 Subject: [PATCH 32/66] Added new options to version string. --- src/x11_init.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/x11_init.c b/src/x11_init.c index 372fc2dd..3ad323f4 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -690,6 +690,11 @@ int _glfwPlatformTerminate(void) const char* _glfwPlatformGetVersionString(void) { const char* version = _GLFW_VERSION_FULL +#if defined(_GLFW_X11_GLX) + " GLX" +#elif defined(_GLFW_X11_EGL) + " EGL" +#endif #if defined(_GLFW_HAS_XRANDR) " XRandR" #endif @@ -708,8 +713,12 @@ const char* _glfwPlatformGetVersionString(void) " glXGetProcAddressARB" #elif defined(_GLFW_HAS_GLXGETPROCADDRESSEXT) " glXGetProcAddressEXT" +#elif defined(_GLFW_HAS_EGLGETPROCADDRESS) + " eglGetProcAddress" #elif defined(_GLFW_DLOPEN_LIBGL) " dlsym(libGL)" +#elif defined(_GLFW_DLOPEN_LIBEGL) + " dlsym(libEGL)" #else " no-extension-support" #endif From 2796ecb5566a5a87f3a1479c1d746f0557062fb1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 03:28:03 +0200 Subject: [PATCH 33/66] Updated platform API tags. --- src/x11_clipboard.c | 4 ++-- src/x11_egl_opengl.c | 2 +- src/x11_fullscreen.c | 4 ++-- src/x11_gamma.c | 6 +++--- src/x11_init.c | 4 ++-- src/x11_input.c | 2 +- src/x11_joystick.c | 2 +- src/x11_keysym2unicode.c | 2 +- src/x11_time.c | 2 +- src/x11_window.c | 8 ++++---- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/x11_clipboard.c b/src/x11_clipboard.c index a833ed1f..5bc92d44 100644 --- a/src/x11_clipboard.c +++ b/src/x11_clipboard.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -182,7 +182,7 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) if (_glfwLibrary.X11.selection.status == _GLFW_CONVERSION_FAILED) { _glfwSetError(GLFW_FORMAT_UNAVAILABLE, - "X11/GLX: Failed to convert selection to string"); + "X11: Failed to convert selection to string"); return NULL; } diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index a6582aa7..82880c93 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/EGL/GLES +// Platform: X11/EGL // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ diff --git a/src/x11_fullscreen.c b/src/x11_fullscreen.c index a17acde4..e718951f 100644 --- a/src/x11_fullscreen.c +++ b/src/x11_fullscreen.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -350,7 +350,7 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount) if (vislist == NULL) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/GLX: Failed to retrieve the available visuals"); + "X11: Failed to retrieve the available visuals"); return 0; } diff --git a/src/x11_gamma.c b/src/x11_gamma.c index 44cd1139..148ae740 100644 --- a/src/x11_gamma.c +++ b/src/x11_gamma.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -115,7 +115,7 @@ void _glfwPlatformGetGammaRamp(GLFWgammaramp* ramp) if (_glfwLibrary.originalRampSize != GLFW_GAMMA_RAMP_SIZE) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/GLX: Failed to get gamma ramp due to size " + "X11: Failed to get gamma ramp due to size " "incompatibility"); return; } @@ -166,7 +166,7 @@ void _glfwPlatformSetGammaRamp(const GLFWgammaramp* ramp) if (_glfwLibrary.originalRampSize != GLFW_GAMMA_RAMP_SIZE) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/GLX: Failed to set gamma ramp due to size " + "X11: Failed to set gamma ramp due to size " "incompatibility"); return; } diff --git a/src/x11_init.c b/src/x11_init.c index 3ad323f4..75aa6c59 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -491,7 +491,7 @@ static GLboolean initDisplay(void) _glfwLibrary.X11.display = XOpenDisplay(NULL); if (!_glfwLibrary.X11.display) { - _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/GLX: Failed to open X display"); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11: Failed to open X display"); return GL_FALSE; } @@ -525,7 +525,7 @@ static GLboolean initDisplay(void) &_glfwLibrary.X11.RandR.minorVersion)) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/GLX: Failed to query RandR version"); + "X11: Failed to query RandR version"); return GL_FALSE; } } diff --git a/src/x11_input.c b/src/x11_input.c index 49961395..2ea8b8c4 100644 --- a/src/x11_input.c +++ b/src/x11_input.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11 (Unix) +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ diff --git a/src/x11_joystick.c b/src/x11_joystick.c index 444c479f..35dad02b 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ diff --git a/src/x11_keysym2unicode.c b/src/x11_keysym2unicode.c index 1f610fdd..c0d10c6e 100644 --- a/src/x11_keysym2unicode.c +++ b/src/x11_keysym2unicode.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ diff --git a/src/x11_time.c b/src/x11_time.c index f1445233..bf3335d3 100644 --- a/src/x11_time.c +++ b/src/x11_time.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ diff --git a/src/x11_window.c b/src/x11_window.c index 84b6f7d6..9eca8fd1 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -146,7 +146,7 @@ static GLboolean createWindow(_GLFWwindow* window, // TODO: Handle all the various error codes here _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/GLX: Failed to create window"); + "X11: Failed to create window"); return GL_FALSE; } } @@ -205,7 +205,7 @@ static GLboolean createWindow(_GLFWwindow* window, if (!hints) { _glfwSetError(GLFW_OUT_OF_MEMORY, - "X11/GLX: Failed to allocate WM hints"); + "X11: Failed to allocate WM hints"); return GL_FALSE; } @@ -222,7 +222,7 @@ static GLboolean createWindow(_GLFWwindow* window, if (!hints) { _glfwSetError(GLFW_OUT_OF_MEMORY, - "X11/GLX: Failed to allocate size hints"); + "X11: Failed to allocate size hints"); return GL_FALSE; } From 0f4cdd5194b75817941902104d565d7c353e4498 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 17:40:20 +0200 Subject: [PATCH 34/66] Fixed invalid attribute list terminator. --- src/x11_egl_opengl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 82880c93..06490e1a 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -154,7 +154,7 @@ static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) EGLint count; EGLConfig fbconfig; - int attribs[] = { EGL_CONFIG_ID, fbconfigID, None }; + int attribs[] = { EGL_CONFIG_ID, fbconfigID, EGL_NONE, EGL_NONE }; eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count); if (!count) From ea1506ba67a4023b159bcc6745403e8fd81e2bc1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 18:04:43 +0200 Subject: [PATCH 35/66] Fixed EGLConfig nomenclature, simplified refresh. --- src/x11_egl_opengl.c | 100 ++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 59 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 06490e1a..23271ac2 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -38,10 +38,10 @@ // Returns the specified attribute of the specified EGLConfig //======================================================================== -static int getFBConfigAttrib(EGLConfig fbconfig, int attrib) +static int getConfigAttrib(EGLConfig config, int attrib) { int value; - eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, attrib, &value); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, attrib, &value); return value; } @@ -54,7 +54,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, unsigned int* found) { - EGLConfig* fbconfigs; + EGLConfig* configs; _GLFWfbconfig* result; int i, count = 0; @@ -62,17 +62,17 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, eglGetConfigs(_glfwLibrary.EGL.display, NULL, 0, &count); - fbconfigs = (EGLConfig*) malloc(sizeof(EGLConfig) * count); - if (!fbconfigs) + configs = (EGLConfig*) malloc(sizeof(EGLConfig) * count); + if (!configs) { _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); return NULL; } - eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs, count, &count); + eglGetConfigs(_glfwLibrary.EGL.display, configs, count, &count); if (!count) { - free(fbconfigs); + free(configs); _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/EGL: No EGLConfigs returned"); @@ -82,7 +82,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, result = (_GLFWfbconfig*) malloc(sizeof(_GLFWfbconfig) * count); if (!result) { - free(fbconfigs); + free(configs); _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); return NULL; @@ -92,55 +92,54 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, { _GLFWfbconfig* f = result + *found; - if (!getFBConfigAttrib(fbconfigs[i], EGL_NATIVE_VISUAL_ID)) + if (!getConfigAttrib(configs[i], EGL_NATIVE_VISUAL_ID)) { // Only consider EGLConfigs with associated visuals continue; } - if (!(getFBConfigAttrib(fbconfigs[i], - EGL_COLOR_BUFFER_TYPE) & EGL_RGB_BUFFER)) + if (!(getConfigAttrib(configs[i], EGL_COLOR_BUFFER_TYPE) & EGL_RGB_BUFFER)) { // Only consider RGB(A) EGLConfigs continue; } - if (!(getFBConfigAttrib(fbconfigs[i], EGL_SURFACE_TYPE) & EGL_WINDOW_BIT)) + if (!(getConfigAttrib(configs[i], EGL_SURFACE_TYPE) & EGL_WINDOW_BIT)) { // Only consider window EGLConfigs continue; } - if (!(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT) && - !(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT) && + !(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) { // Only consider OpenGL ES context continue; } if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !(getFBConfigAttrib(fbconfigs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + !(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) { // User requested only OpenGL ES 2.0 context continue; } - f->redBits = getFBConfigAttrib(fbconfigs[i], EGL_RED_SIZE); - f->greenBits = getFBConfigAttrib(fbconfigs[i], EGL_GREEN_SIZE); - f->blueBits = getFBConfigAttrib(fbconfigs[i], EGL_BLUE_SIZE); + f->redBits = getConfigAttrib(configs[i], EGL_RED_SIZE); + f->greenBits = getConfigAttrib(configs[i], EGL_GREEN_SIZE); + f->blueBits = getConfigAttrib(configs[i], EGL_BLUE_SIZE); - f->alphaBits = getFBConfigAttrib(fbconfigs[i], EGL_ALPHA_SIZE); - f->depthBits = getFBConfigAttrib(fbconfigs[i], EGL_DEPTH_SIZE); - f->stencilBits = getFBConfigAttrib(fbconfigs[i], EGL_STENCIL_SIZE); + f->alphaBits = getConfigAttrib(configs[i], EGL_ALPHA_SIZE); + f->depthBits = getConfigAttrib(configs[i], EGL_DEPTH_SIZE); + f->stencilBits = getConfigAttrib(configs[i], EGL_STENCIL_SIZE); - f->samples = getFBConfigAttrib(fbconfigs[i], EGL_SAMPLES); + f->samples = getConfigAttrib(configs[i], EGL_SAMPLES); - f->platformID = (GLFWintptr) getFBConfigAttrib(fbconfigs[i], EGL_CONFIG_ID); + f->platformID = (GLFWintptr) getConfigAttrib(configs[i], EGL_CONFIG_ID); (*found)++; } - free(fbconfigs); + free(configs); return result; } @@ -149,37 +148,21 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, // Read back framebuffer parameters from the context //======================================================================== -static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID) +static void refreshContextParams(_GLFWwindow* window) { - EGLint count; - EGLConfig fbconfig; - - int attribs[] = { EGL_CONFIG_ID, fbconfigID, EGL_NONE, EGL_NONE }; - - eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count); - if (!count) - { - // This should never ever happen - // TODO: Flag this as an error and propagate up - _glfwSetError(GLFW_PLATFORM_ERROR, "X11/EGL: Cannot find known " - "EGLConfig by ID. This cannot " - "happen. Have a nice day.\n"); - abort(); - } - // There is no clear definition of an "accelerated" context on X11/EGL, and // true sounds better than false, so we hardcode true here window->accelerated = GL_TRUE; - window->redBits = getFBConfigAttrib(fbconfig, EGL_RED_SIZE); - window->greenBits = getFBConfigAttrib(fbconfig, EGL_GREEN_SIZE); - window->blueBits = getFBConfigAttrib(fbconfig, EGL_BLUE_SIZE); + window->redBits = getConfigAttrib(window->EGL.config, EGL_RED_SIZE); + window->greenBits = getConfigAttrib(window->EGL.config, EGL_GREEN_SIZE); + window->blueBits = getConfigAttrib(window->EGL.config, EGL_BLUE_SIZE); - window->alphaBits = getFBConfigAttrib(fbconfig, EGL_ALPHA_SIZE); - window->depthBits = getFBConfigAttrib(fbconfig, EGL_DEPTH_SIZE); - window->stencilBits = getFBConfigAttrib(fbconfig, EGL_STENCIL_SIZE); + window->alphaBits = getConfigAttrib(window->EGL.config, EGL_ALPHA_SIZE); + window->depthBits = getConfigAttrib(window->EGL.config, EGL_DEPTH_SIZE); + window->stencilBits = getConfigAttrib(window->EGL.config, EGL_STENCIL_SIZE); - window->samples = getFBConfigAttrib(fbconfig, EGL_SAMPLES); + window->samples = getConfigAttrib(window->EGL.config, EGL_SAMPLES); } @@ -198,7 +181,7 @@ static int createContext(_GLFWwindow* window, int attribs[40], visMask; EGLint count, index, visualID = 0; EGLint red_size, green_size, blue_size, alpha_size; - EGLConfig fbconfig; + EGLConfig config; EGLContext share = NULL; XVisualInfo visTemplate; @@ -212,7 +195,7 @@ static int createContext(_GLFWwindow* window, setEGLattrib(attribs, index, EGL_CONFIG_ID, fbconfigID); setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); - eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count); + eglChooseConfig(_glfwLibrary.EGL.display, attribs, &config, 1, &count); if (!count) { _glfwSetError(GLFW_PLATFORM_ERROR, @@ -224,7 +207,7 @@ static int createContext(_GLFWwindow* window, // Retrieve the corresponding visual // NOTE: This is the only non-portable code in this file. // Maybe it would not hurt too much to add #ifdefs for different platforms? - eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_NATIVE_VISUAL_ID, &visualID); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_NATIVE_VISUAL_ID, &visualID); // Init visual template visTemplate.screen = _glfwLibrary.X11.screen; @@ -241,13 +224,13 @@ static int createContext(_GLFWwindow* window, // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID // attribute, so attempt to find the closest match. - eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_RED_SIZE, &red_size); - eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_GREEN_SIZE, &green_size); - eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_BLUE_SIZE, &blue_size); - eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_ALPHA_SIZE, &alpha_size); visTemplate.depth = red_size + green_size + blue_size + alpha_size; @@ -279,7 +262,7 @@ static int createContext(_GLFWwindow* window, eglBindAPI(EGL_OPENGL_ES_API); window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, - fbconfig, share, attribs); + config, share, attribs); if (window->EGL.context == EGL_NO_CONTEXT) { @@ -290,9 +273,8 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } - window->EGL.config = fbconfig; - - refreshContextParams(window, fbconfigID); + window->EGL.config = config; + refreshContextParams(window); return GL_TRUE; } From bd179634dc6212f7df6ef5bce060e6dd0d217844 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 20 Jul 2012 18:11:26 +0200 Subject: [PATCH 36/66] Formatting. --- src/x11_egl_opengl.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 23271ac2..f52b962c 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -498,8 +498,7 @@ int _glfwPlatformExtensionSupported(const char* extension) const char* extensions; // Get list of GLX extensions - extensions = eglQueryString(_glfwLibrary.EGL.display, - EGL_EXTENSIONS); + extensions = eglQueryString(_glfwLibrary.EGL.display, EGL_EXTENSIONS); if (extensions != NULL) { if (_glfwStringInExtensionString(extension, (unsigned char*) extensions)) From b78fd85e116063312734e2b41d9cbdc24492ac50 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sat, 21 Jul 2012 23:51:08 +0200 Subject: [PATCH 37/66] Moved glext.h inclusion back. --- src/cocoa_platform.h | 5 ----- src/internal.h | 5 +++++ src/win32_platform.h | 5 ----- src/x11_glx_platform.h | 5 ----- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index b3fe0491..026d40ad 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -41,11 +41,6 @@ typedef void* id; #endif -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of glext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/glext.h" - #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS NS diff --git a/src/internal.h b/src/internal.h index 37813c6f..4f34bd21 100644 --- a/src/internal.h +++ b/src/internal.h @@ -71,6 +71,11 @@ typedef struct _GLFWlibrary _GLFWlibrary; #include "../include/GL/glfw3.h" +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of glext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/glext.h" + #if defined(_GLFW_COCOA_NSGL) #include "cocoa_platform.h" #elif defined(_GLFW_WIN32_WGL) diff --git a/src/win32_platform.h b/src/win32_platform.h index 849dd337..eeadbf22 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -63,11 +63,6 @@ #include #include -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of glext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/glext.h" - // This path may need to be changed if you build GLFW using your own setup // We ship and use our own copy of wglext.h since GLFW uses fairly new // extensions and not all operating systems come with an up-to-date version diff --git a/src/x11_glx_platform.h b/src/x11_glx_platform.h index b5397d06..2882a197 100644 --- a/src/x11_glx_platform.h +++ b/src/x11_glx_platform.h @@ -34,11 +34,6 @@ #define GLX_GLXEXT_LEGACY #include -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of glext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/glext.h" - // This path may need to be changed if you build GLFW using your own setup // We ship and use our own copy of glxext.h since GLFW uses fairly new // extensions and not all operating systems come with an up-to-date version From e9c82a82b2c63cbbf98d4de06902dbdcdea71105 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sat, 21 Jul 2012 23:51:44 +0200 Subject: [PATCH 38/66] Added eglext.h header. --- src/x11_egl_platform.h | 5 + support/GL/eglext.h | 444 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 449 insertions(+) create mode 100644 support/GL/eglext.h diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index 149bdf2f..f3974676 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -33,6 +33,11 @@ #include +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of eglext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/eglext.h" + // Do we have support for dlopen/dlsym? #if defined(_GLFW_HAS_DLOPEN) #include diff --git a/support/GL/eglext.h b/support/GL/eglext.h new file mode 100644 index 00000000..5516e7ad --- /dev/null +++ b/support/GL/eglext.h @@ -0,0 +1,444 @@ +#ifndef __eglext_h_ +#define __eglext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2007-2012 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#include + +/*************************************************************/ + +/* Header file version number */ +/* Current version at http://www.khronos.org/registry/egl/ */ +/* $Revision: 18175 $ on $Date: 2012-06-13 11:26:12 -0700 (Wed, 13 Jun 2012) $ */ +#define EGL_EGLEXT_VERSION 13 + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 /* EGLConfig attribute */ +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 /* EGL_SURFACE_TYPE bitfield */ +#endif + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_MATCH_FORMAT_KHR 0x3043 /* EGLConfig attribute */ +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGB_565_KHR 0x30C1 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 /* eglLockSurfaceKHR attribute */ +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 /* eglLockSurfaceKHR attribute */ +#define EGL_BITMAP_POINTER_KHR 0x30C6 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PITCH_KHR 0x30C7 /* eglQuerySurface attribute */ +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD /* eglQuerySurface attribute */ +#define EGL_LOWER_LEFT_KHR 0x30CE /* EGL_BITMAP_ORIGIN_KHR value */ +#define EGL_UPPER_LEFT_KHR 0x30CF /* EGL_BITMAP_ORIGIN_KHR value */ +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface); +#endif + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 /* eglCreateImageKHR target */ +typedef void *EGLImageKHR; +#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#endif + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 /* eglCreateImageKHR target */ +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLTimeKHR requires 64-bit uint support */ +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 + +typedef void* EGLSyncKHR; +typedef khronos_utime_nanoseconds_t EGLTimeKHR; + +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 /* eglClientWaitSyncKHR bitfield */ +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif +#endif + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +/* Most interfaces defined by EGL_KHR_image_pixmap above */ +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +/* Interfaces defined by EGL_KHR_image above */ +#endif + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 +#endif + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 +#endif + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 +#endif + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLTimeNV requires 64-bit uint support */ +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_NO_SYNC_NV ((EGLSyncNV)0) +typedef void* EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync); +EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif +#endif + +#if KHRONOS_SUPPORT_INT64 /* Dependent on EGL_KHR_reusable_sync which requires 64-bit uint support */ +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 +/* Reuses most tokens and entry points from EGL_KHR_reusable_sync */ +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 +#endif +#endif + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 + +/* Surface Attribute */ +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 +/* + * Structure representing a client pixmap + * (pixmap's data is in client-space memory). + */ +struct EGLClientPixmapHI +{ + void* pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; + +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI(EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI* pixmap); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI* pixmap); +#endif /* EGL_HI_clientpixmap */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 +/* Config Attribute */ +#define EGL_COLOR_FORMAT_HI 0x8F70 +/* Color Formats */ +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 +#endif /* EGL_HI_colorformats */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 /* CreateDRMImageMESA attribute */ +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 /* CreateDRMImageMESA attribute */ +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 /* EGL_IMAGE_FORMAT_MESA attribute value */ +#define EGL_DRM_BUFFER_MESA 0x31D3 /* eglCreateImageKHR target */ +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 /* EGL_DRM_BUFFER_USE_MESA bits */ +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 /* EGL_DRM_BUFFER_USE_MESA bits */ +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 +#endif + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLuint64NV requires 64-bit uint support */ +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 + +typedef khronos_utime_nanoseconds_t EGLuint64NV; + +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV(void); +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV(void); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void); +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void); +#endif +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLuint64KHR requires 64-bit uint support */ +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 +typedef void* EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +#define EGL_NO_STREAM_KHR ((EGLStreamKHR)0) +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC)(EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 +#define EGL_STREAM_BIT_KHR 0x0800 +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 +/* reuse EGLTimeKHR */ +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif +#endif + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF +#endif + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 +/* reuse EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE */ +#endif + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 +#define EGL_CONTEXT_MAJOR_VERSION_KHR EGL_CONTEXT_CLIENT_VERSION +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#endif + +#ifdef __cplusplus +} +#endif + +#endif From 3b6ec4e7758515c77f7d651ff31e540048a155fb Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 01:10:59 +0200 Subject: [PATCH 39/66] Added client API window hint. --- include/GL/glfw3.h | 18 +++-- readme.html | 2 +- src/cocoa_window.m | 7 ++ src/internal.h | 3 + src/opengl.c | 183 ++++++++++++++++++++++++++----------------- src/win32_window.c | 26 +++--- src/window.c | 9 ++- src/x11_egl_opengl.c | 35 +++++---- src/x11_glx_opengl.c | 27 ++++--- tests/glfwinfo.c | 127 +++++++++++++++++++----------- 10 files changed, 274 insertions(+), 163 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 2ff67627..4ff8e857 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -413,12 +413,17 @@ extern "C" { #define GLFW_STEREO 0x0002100C #define GLFW_WINDOW_RESIZABLE 0x0002100D #define GLFW_FSAA_SAMPLES 0x0002100E -#define GLFW_OPENGL_VERSION_MAJOR 0x0002100F -#define GLFW_OPENGL_VERSION_MINOR 0x00021010 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00021011 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00021012 -#define GLFW_OPENGL_PROFILE 0x00021013 -#define GLFW_OPENGL_ROBUSTNESS 0x00021014 +#define GLFW_CLIENT_API 0x0002100F +#define GLFW_OPENGL_VERSION_MAJOR 0x00021010 +#define GLFW_OPENGL_VERSION_MINOR 0x00021011 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00021012 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00021013 +#define GLFW_OPENGL_PROFILE 0x00021014 +#define GLFW_OPENGL_ROBUSTNESS 0x00021015 + +/* GLFW_OPENGL_API mode tokens */ +#define GLFW_OPENGL_API 0x00000001 +#define GLFW_OPENGL_ES_API 0x00000002 /* GLFW_OPENGL_ROBUSTNESS mode tokens */ #define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000 @@ -429,7 +434,6 @@ extern "C" { #define GLFW_OPENGL_NO_PROFILE 0x00000000 #define GLFW_OPENGL_CORE_PROFILE 0x00000001 #define GLFW_OPENGL_COMPAT_PROFILE 0x00000002 -#define GLFW_OPENGL_ES2_PROFILE 0x00000004 /* glfwGetInputMode/glfwSetInputMode tokens */ #define GLFW_CURSOR_MODE 0x00030001 diff --git a/readme.html b/readme.html index cdbb9885..9873da27 100644 --- a/readme.html +++ b/readme.html @@ -280,7 +280,7 @@ version of GLFW.

  • Added glfwGetClipboardString and glfwSetClipboardString functions for interacting with the system clipboard
  • Added glfwGetCurrentContext function for retrieving the window whose OpenGL context is current
  • Added glfwCopyContext function for copying OpenGL state categories between contexts
  • -
  • Added GLFW_OPENGL_ES2_PROFILE profile for creating OpenGL ES 2.0 contexts using the GLX_EXT_create_context_es2_profile and WGL_EXT_create_context_es2_profile extensions
  • +
  • Added GLFW_CLIENT_API window hint for creating contexts for APIs other than desktop OpenGL
  • Added GLFW_OPENGL_ROBUSTNESS window hint and associated strategy tokens for GL_ARB_robustness support
  • Added GLFW_OPENGL_REVISION window parameter to make up for removal of glfwGetGLVersion
  • Added GLFW_INCLUDE_GL3 macro for telling the GLFW header to include gl3.h header instead of gl.h
  • diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 3523806a..8093c3c6 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -717,6 +717,13 @@ static GLboolean createContext(_GLFWwindow* window, else if (colorBits < 15) colorBits = 15; + if (wndconfig->clientAPI != GLFW_OPENGL_ES_API) + { + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Cocoa/NSOpenGL: NSOpenGL does not support OpenGL ES"); + return GL_FALSE; + } + #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 // Fail if any OpenGL version above 2.1 other than 3.2 was requested if (wndconfig->glMajor > 3 || diff --git a/src/internal.h b/src/internal.h index 4f34bd21..bda462a8 100644 --- a/src/internal.h +++ b/src/internal.h @@ -110,6 +110,7 @@ struct _GLFWhints GLboolean stereo; GLboolean resizable; int samples; + int clientAPI; int glMajor; int glMinor; GLboolean glForward; @@ -131,6 +132,7 @@ struct _GLFWwndconfig const char* title; int refreshRate; GLboolean resizable; + int clientAPI; int glMajor; int glMinor; GLboolean glForward; @@ -212,6 +214,7 @@ struct _GLFWwindow // OpenGL extensions and context attributes GLboolean accelerated; // GL_TRUE if OpenGL context is "accelerated" + int clientAPI; int glMajor, glMinor, glRevision; GLboolean glForward, glDebug; int glProfile; diff --git a/src/opengl.c b/src/opengl.c index 59097e1e..ff623ed3 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -36,7 +36,7 @@ //======================================================================== -// Parses the OpenGL version string and extracts the version number +// Parses the client API version string and extracts the version number //======================================================================== static void parseGLVersion(int* major, int* minor, int* rev) @@ -256,89 +256,125 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, //======================================================================== -// Checks whether the OpenGL part of the window config is sane +// Checks whether the client API part of the window config is sane // It blames glfwOpenWindow because that's the only caller //======================================================================== GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) { - if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0) + if (wndconfig->clientAPI != GLFW_OPENGL_API && + wndconfig->clientAPI != GLFW_OPENGL_ES_API) { - // OpenGL 1.0 is the smallest valid version - _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Invalid OpenGL version requested"); + _glfwSetError(GLFW_INVALID_ENUM, + "glfwOpenWindow: Invalid client API requested"); return GL_FALSE; } - if (wndconfig->glMajor == 1 && wndconfig->glMinor > 5) - { - // OpenGL 1.x series ended with version 1.5 - _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Invalid OpenGL version requested"); - return GL_FALSE; - } - else if (wndconfig->glMajor == 2 && wndconfig->glMinor > 1) - { - // OpenGL 2.x series ended with version 2.1 - _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Invalid OpenGL version requested"); - return GL_FALSE; - } - else if (wndconfig->glMajor == 3 && wndconfig->glMinor > 3) - { - // OpenGL 3.x series ended with version 3.3 - _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Invalid OpenGL version requested"); - return GL_FALSE; - } - else - { - // For now, let everything else through - } - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) + if (wndconfig->clientAPI == GLFW_OPENGL_API) { - if (wndconfig->glMajor != 2 || wndconfig->glMinor < 0) + if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0) { - // The OpenGL ES 2.0 profile is currently only defined for version - // 2.0 (see {WGL|GLX}_EXT_create_context_es2_profile), but for - // compatibility with future updates to OpenGL ES, we allow - // everything 2.x and let the driver report invalid 2.x versions - + // OpenGL 1.0 is the smallest valid version _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Invalid OpenGL ES 2.x version requested"); + "glfwOpenWindow: Invalid OpenGL version requested"); return GL_FALSE; } - } - else if (wndconfig->glProfile) - { - if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE && - wndconfig->glProfile != GLFW_OPENGL_COMPAT_PROFILE) + if (wndconfig->glMajor == 1 && wndconfig->glMinor > 5) { - _glfwSetError(GLFW_INVALID_ENUM, - "glfwOpenWindow: Invalid OpenGL profile requested"); - return GL_FALSE; - } - - if (wndconfig->glMajor < 3 || - (wndconfig->glMajor == 3 && wndconfig->glMinor < 2)) - { - // Desktop OpenGL context profiles are only defined for version 3.2 - // and above - + // OpenGL 1.x series ended with version 1.5 _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Context profiles only exist for " - "OpenGL version 3.2 and above"); + "glfwOpenWindow: Invalid OpenGL version requested"); + return GL_FALSE; + } + else if (wndconfig->glMajor == 2 && wndconfig->glMinor > 1) + { + // OpenGL 2.x series ended with version 2.1 + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Invalid OpenGL version requested"); + return GL_FALSE; + } + else if (wndconfig->glMajor == 3 && wndconfig->glMinor > 3) + { + // OpenGL 3.x series ended with version 3.3 + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Invalid OpenGL version requested"); + return GL_FALSE; + } + else + { + // For now, let everything else through + } + + if (wndconfig->glProfile) + { + if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE && + wndconfig->glProfile != GLFW_OPENGL_COMPAT_PROFILE) + { + _glfwSetError(GLFW_INVALID_ENUM, + "glfwOpenWindow: Invalid OpenGL profile requested"); + return GL_FALSE; + } + + if (wndconfig->glMajor < 3 || + (wndconfig->glMajor == 3 && wndconfig->glMinor < 2)) + { + // Desktop OpenGL context profiles are only defined for version 3.2 + // and above + + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Context profiles only exist for " + "OpenGL version 3.2 and above"); + return GL_FALSE; + } + } + + if (wndconfig->glForward && wndconfig->glMajor < 3) + { + // Forward-compatible contexts are only defined for OpenGL version 3.0 and above + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Forward compatibility only exist for " + "OpenGL version 3.0 and above"); return GL_FALSE; } } - - if (wndconfig->glForward && wndconfig->glMajor < 3) + else if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { - // Forward-compatible contexts are only defined for OpenGL version 3.0 and above - _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Forward compatibility only exist for " - "OpenGL version 3.0 and above"); - return GL_FALSE; + if (wndconfig->glMajor < 1 || wndconfig->glMinor < 0) + { + // OpenGL ES 1.0 is the smallest valid version + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Invalid OpenGL ES version requested"); + return GL_FALSE; + } + if (wndconfig->glMajor == 1 && wndconfig->glMinor > 1) + { + // OpenGL ES 1.x series ended with version 1.1 + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Invalid OpenGL ES version requested"); + return GL_FALSE; + } + else + { + // For now, let everything else through + } + + if (wndconfig->glProfile) + { + // OpenGL ES does not support profiles + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Context profiles are not supported " + "by OpenGL ES"); + return GL_FALSE; + } + + if (wndconfig->glForward) + { + // OpenGL ES does not support Forward-compatibility + _glfwSetError(GLFW_INVALID_VALUE, + "glfwOpenWindow: Forward compatibility is not " + "supported by OpenGL ES"); + return GL_FALSE; + } } if (wndconfig->glRobustness) @@ -347,7 +383,8 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) wndconfig->glRobustness != GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) { _glfwSetError(GLFW_INVALID_VALUE, - "glfwOpenWindow: Invalid OpenGL robustness mode requested"); + "glfwOpenWindow: Invalid OpenGL robustness mode " + "requested"); return GL_FALSE; } } @@ -363,6 +400,8 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) GLboolean _glfwIsValidContext(_GLFWwindow* window, _GLFWwndconfig* wndconfig) { + window->clientAPI = wndconfig->clientAPI; + parseGLVersion(&window->glMajor, &window->glMinor, &window->glRevision); // Read back forward-compatibility flag @@ -433,7 +472,7 @@ GLboolean _glfwIsValidContext(_GLFWwindow* window, _GLFWwndconfig* wndconfig) //======================================================================== -// Check if a string can be found in an OpenGL extension string +// Check if a string can be found in a client API extension string //======================================================================== int _glfwStringInExtensionString(const char* string, @@ -472,7 +511,7 @@ int _glfwStringInExtensionString(const char* string, ////////////////////////////////////////////////////////////////////////// //======================================================================== -// Make the OpenGL context associated with the specified window current +// Make the context associated with the specified window current //======================================================================== GLFWAPI void glfwMakeContextCurrent(GLFWwindow handle) @@ -494,7 +533,7 @@ GLFWAPI void glfwMakeContextCurrent(GLFWwindow handle) //======================================================================== -// Returns the window whose OpenGL context is current +// Returns the window whose context is current //======================================================================== GLFWAPI GLFWwindow glfwGetCurrentContext(void) @@ -554,7 +593,7 @@ GLFWAPI void glfwSwapInterval(int interval) //======================================================================== -// Check if an OpenGL extension is available at runtime +// Check if a client API extension is available at runtime //======================================================================== GLFWAPI int glfwExtensionSupported(const char* extension) @@ -619,8 +658,8 @@ GLFWAPI int glfwExtensionSupported(const char* extension) //======================================================================== -// Get the function pointer to an OpenGL function. -// This function can be used to get access to extended OpenGL functions. +// Get the function pointer to a client API function +// This can be used to get access to client API extension functions //======================================================================== GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname) @@ -642,7 +681,7 @@ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname) //======================================================================== -// Copies the specified OpenGL state categories from src to dst +// Copies the specified context state categories from src to dst //======================================================================== GLFWAPI void glfwCopyContext(GLFWwindow hsrc, GLFWwindow hdst, unsigned long mask) diff --git a/src/win32_window.c b/src/win32_window.c index 935767ce..c2870c4e 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -336,6 +336,21 @@ static GLboolean createContext(_GLFWwindow* window, attribs[i++] = wndconfig->glMinor; } + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + { + if (!window->WGL.ARB_create_context_profile || + !window->WGL.EXT_create_context_es2_profile) + { + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: OpenGL ES 2.x requested but " + "WGL_EXT_create_context_es2_profile is unavailable"); + return GL_FALSE; + } + + attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB; + attribs[i++] = WGL_CONTEXT_ES2_PROFILE_BIT_EXT; + } + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) { int flags = 0; @@ -365,21 +380,10 @@ static GLboolean createContext(_GLFWwindow* window, return GL_FALSE; } - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !window->WGL.EXT_create_context_es2_profile) - { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, - "Win32/WGL: OpenGL ES 2.x profile requested but " - "WGL_EXT_create_context_es2_profile is unavailable"); - return GL_FALSE; - } - if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; - else if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) - flags = WGL_CONTEXT_ES2_PROFILE_BIT_EXT; attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB; attribs[i++] = flags; diff --git a/src/window.c b/src/window.c index f8939e37..41729a78 100644 --- a/src/window.c +++ b/src/window.c @@ -97,7 +97,8 @@ void _glfwSetDefaultWindowHints(void) { memset(&_glfwLibrary.hints, 0, sizeof(_glfwLibrary.hints)); - // The default minimum OpenGL version is 1.0 + // The default is OpenGL with minimum version 1.0 + _glfwLibrary.hints.clientAPI = GLFW_OPENGL_API; _glfwLibrary.hints.glMajor = 1; _glfwLibrary.hints.glMinor = 0; @@ -251,6 +252,7 @@ GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, wndconfig.title = title; wndconfig.refreshRate = Max(_glfwLibrary.hints.refreshRate, 0); wndconfig.resizable = _glfwLibrary.hints.resizable ? GL_TRUE : GL_FALSE; + wndconfig.clientAPI = _glfwLibrary.hints.clientAPI; wndconfig.glMajor = _glfwLibrary.hints.glMajor; wndconfig.glMinor = _glfwLibrary.hints.glMinor; wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; @@ -429,6 +431,9 @@ GLFWAPI void glfwOpenWindowHint(int target, int hint) case GLFW_FSAA_SAMPLES: _glfwLibrary.hints.samples = hint; break; + case GLFW_CLIENT_API: + _glfwLibrary.hints.clientAPI = hint; + break; case GLFW_OPENGL_VERSION_MAJOR: _glfwLibrary.hints.glMajor = hint; break; @@ -714,6 +719,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param) return window->resizable; case GLFW_FSAA_SAMPLES: return window->samples; + case GLFW_CLIENT_API: + return window->clientAPI; case GLFW_OPENGL_VERSION_MAJOR: return window->glMajor; case GLFW_OPENGL_VERSION_MINOR: diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index f52b962c..4db794ba 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -110,18 +110,23 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, continue; } - if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT) && - !(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { - // Only consider OpenGL ES context - continue; + if (wndconfig->glMajor == 1) + { + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT)) + continue; + } + else + { + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + continue; + } } - - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + else if (wndconfig->clientAPI == GLFW_OPENGL_API) { - // User requested only OpenGL ES 2.0 context - continue; + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_BIT)) + continue; } f->redBits = getConfigAttrib(configs[i], EGL_RED_SIZE); @@ -248,19 +253,17 @@ static int createContext(_GLFWwindow* window, } index = 0; - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) + + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { - setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, 2); + eglBindAPI(EGL_OPENGL_ES_API); + setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, wndconfig->glMajor); } else - { - setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, 1); - } + eglBindAPI(EGL_OPENGL_API); setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); - eglBindAPI(EGL_OPENGL_ES_API); - window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, config, share, attribs); diff --git a/src/x11_glx_opengl.c b/src/x11_glx_opengl.c index edcd69b6..da06d65f 100644 --- a/src/x11_glx_opengl.c +++ b/src/x11_glx_opengl.c @@ -346,6 +346,22 @@ static int createContext(_GLFWwindow* window, setGLXattrib(attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor); } + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + { + if (!_glfwLibrary.GLX.ARB_create_context_profile || + !_glfwLibrary.GLX.EXT_create_context_es2_profile) + { + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "X11/GLX: OpenGL ES 2.x requested but " + "GLX_EXT_create_context_es2_profile is unavailable"); + return GL_FALSE; + } + + setGLXattrib(attribs, index, + GLX_CONTEXT_PROFILE_MASK_ARB, + GLX_CONTEXT_ES2_PROFILE_BIT_EXT); + } + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) { int flags = 0; @@ -374,21 +390,10 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } - if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && - !_glfwLibrary.GLX.EXT_create_context_es2_profile) - { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, - "X11/GLX: OpenGL ES 2.x profile requested but " - "GLX_EXT_create_context_es2_profile is unavailable"); - return GL_FALSE; - } - if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB; else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; - else if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE) - flags = GLX_CONTEXT_ES2_PROFILE_BIT_EXT; setGLXattrib(attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags); } diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c index 45cb8616..28264179 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -42,17 +42,20 @@ #define strcasecmp(x, y) _stricmp(x, y) #endif +#define API_OPENGL "gl" +#define API_OPENGL_ES "es" + #define PROFILE_NAME_CORE "core" #define PROFILE_NAME_COMPAT "compat" -#define PROFILE_NAME_ES2 "es2" #define STRATEGY_NAME_NONE "none" #define STRATEGY_NAME_LOSE "lose" static void usage(void) { - printf("Usage: glfwinfo [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n"); - printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT " " PROFILE_NAME_ES2 "\n"); + printf("Usage: glfwinfo [-h] [-a API] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE] [-r STRATEGY]\n"); + printf("available APIs: " API_OPENGL " " API_OPENGL_ES "\n"); + printf("available profiles: " PROFILE_NAME_CORE " " PROFILE_NAME_COMPAT "\n"); printf("available strategies: " STRATEGY_NAME_NONE " " STRATEGY_NAME_LOSE "\n"); } @@ -61,14 +64,22 @@ static void error_callback(int error, const char* description) fprintf(stderr, "Error: %s in %s\n", glfwErrorString(error), description); } +static const char* get_client_api_name(int api) +{ + if (api == GLFW_OPENGL_API) + return "OpenGL"; + else if (api == GLFW_OPENGL_ES_API) + return "OpenGL ES"; + + return "Unknown API"; +} + static const char* get_glfw_profile_name(int profile) { if (profile == GLFW_OPENGL_COMPAT_PROFILE) - return PROFILE_NAME_COMPAT; + return "compatibility"; else if (profile == GLFW_OPENGL_CORE_PROFILE) - return PROFILE_NAME_CORE; - else if (profile == GLFW_OPENGL_ES2_PROFILE) - return PROFILE_NAME_ES2; + return "core"; return "unknown"; } @@ -76,22 +87,22 @@ static const char* get_glfw_profile_name(int profile) static const char* get_profile_name(GLint mask) { if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) - return PROFILE_NAME_COMPAT; + return "compatibility"; if (mask & GL_CONTEXT_CORE_PROFILE_BIT) - return PROFILE_NAME_CORE; + return "core"; return "unknown"; } -static void list_extensions(int major, int minor) +static void list_extensions(int api, int major, int minor) { int i; GLint count; const GLubyte* extensions; - printf("OpenGL context supported extensions:\n"); + printf("%s context supported extensions:\n", get_client_api_name(api)); - if (major > 2) + if (api == GLFW_OPENGL_API && major > 2) { PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress("glGetStringi"); if (!glGetStringi) @@ -121,15 +132,25 @@ static void list_extensions(int major, int minor) int main(int argc, char** argv) { - int ch, profile = 0, strategy = 0, major = 1, minor = 0, revision; + int ch, api = 0, profile = 0, strategy = 0, major = 1, minor = 0, revision; GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE; GLint flags, mask; GLFWwindow window; - while ((ch = getopt(argc, argv, "dfhlm:n:p:r:")) != -1) + while ((ch = getopt(argc, argv, "a:dfhlm:n:p:r:")) != -1) { switch (ch) { + case 'a': + if (strcasecmp(optarg, API_OPENGL) == 0) + api = GLFW_OPENGL_API; + else if (strcasecmp(optarg, API_OPENGL_ES) == 0) + api = GLFW_OPENGL_ES_API; + else + { + usage(); + exit(EXIT_FAILURE); + } case 'd': debug = GL_TRUE; break; @@ -153,8 +174,6 @@ int main(int argc, char** argv) profile = GLFW_OPENGL_CORE_PROFILE; else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0) profile = GLFW_OPENGL_COMPAT_PROFILE; - else if (strcasecmp(optarg, PROFILE_NAME_ES2) == 0) - profile = GLFW_OPENGL_ES2_PROFILE; else { usage(); @@ -195,6 +214,9 @@ int main(int argc, char** argv) glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, minor); } + if (api != 0) + glfwOpenWindowHint(GLFW_CLIENT_API, api); + if (debug) glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); @@ -234,53 +256,70 @@ int main(int argc, char** argv) printf("GLFW library version string: \"%s\"\n", glfwGetVersionString()); - // Report OpenGL version - - printf("OpenGL context version string: \"%s\"\n", glGetString(GL_VERSION)); + // Report client API version + api = glfwGetWindowParam(window, GLFW_CLIENT_API); major = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MAJOR); minor = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MINOR); revision = glfwGetWindowParam(window, GLFW_OPENGL_REVISION); - printf("OpenGL context version parsed by GLFW: %u.%u.%u\n", major, minor, revision); + printf("%s context version string: \"%s\"\n", + get_client_api_name(api), + glGetString(GL_VERSION)); - // Report OpenGL context properties + printf("%s context version parsed by GLFW: %u.%u.%u\n", + get_client_api_name(api), + major, minor, revision); - if (major >= 3) + // Report client API context properties + + if (api == GLFW_OPENGL_API) { - glGetIntegerv(GL_CONTEXT_FLAGS, &flags); - printf("OpenGL context flags:"); + if (major >= 3) + { + glGetIntegerv(GL_CONTEXT_FLAGS, &flags); + printf("%s context flags:", get_client_api_name(api)); - if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) - puts(" forward-compatible"); - else - puts(" none"); + if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) + puts(" forward-compatible"); + else + puts(" none"); - printf("OpenGL forward-compatible flag parsed by GLFW: %s\n", - glfwGetWindowParam(window, GLFW_OPENGL_FORWARD_COMPAT) ? "true" : "false"); + printf("%s forward-compatible flag parsed by GLFW: %s\n", + get_client_api_name(api), + glfwGetWindowParam(window, GLFW_OPENGL_FORWARD_COMPAT) ? "true" : "false"); + } + + if (major > 3 || (major == 3 && minor >= 2)) + { + glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); + printf("%s profile mask: %s (0x%08x)\n", + get_client_api_name(api), + get_profile_name(mask), mask); + + printf("%s profile parsed by GLFW: %s\n", + get_client_api_name(api), + get_glfw_profile_name(glfwGetWindowParam(window, GLFW_OPENGL_PROFILE))); + } } - if (major > 3 || (major == 3 && minor >= 2)) - { - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); - printf("OpenGL profile mask: %s (0x%08x)\n", get_profile_name(mask), mask); - - printf("OpenGL profile parsed by GLFW: %s\n", - get_glfw_profile_name(glfwGetWindowParam(window, GLFW_OPENGL_PROFILE))); - } - - printf("OpenGL context renderer string: \"%s\"\n", glGetString(GL_RENDERER)); - printf("OpenGL context vendor string: \"%s\"\n", glGetString(GL_VENDOR)); + printf("%s context renderer string: \"%s\"\n", + get_client_api_name(api), + glGetString(GL_RENDERER)); + printf("%s context vendor string: \"%s\"\n", + get_client_api_name(api), + glGetString(GL_VENDOR)); if (major > 1) { - printf("OpenGL context shading language version: \"%s\"\n", + printf("%s context shading language version: \"%s\"\n", + get_client_api_name(api), glGetString(GL_SHADING_LANGUAGE_VERSION)); } - // Report OpenGL extensions + // Report client API extensions if (list) - list_extensions(major, minor); + list_extensions(api, major, minor); glfwTerminate(); exit(EXIT_SUCCESS); From edd554c115b9359c4d6967f6f07ce4b6972c0d03 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 01:33:42 +0200 Subject: [PATCH 40/66] Added support for EGL_KHR_create_context. --- src/x11_egl_opengl.c | 51 ++++++++++++++++++++++++++++++++++++++++++ src/x11_egl_platform.h | 2 ++ 2 files changed, 53 insertions(+) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 4db794ba..da92fb41 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -260,8 +260,56 @@ static int createContext(_GLFWwindow* window, setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, wndconfig->glMajor); } else + { eglBindAPI(EGL_OPENGL_API); + if (_glfwLibrary.EGL.KHR_create_context) + { + setEGLattrib(attribs, index, EGL_CONTEXT_MAJOR_VERSION_KHR, wndconfig->glMajor); + setEGLattrib(attribs, index, EGL_CONTEXT_MINOR_VERSION_KHR, wndconfig->glMinor); + + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) + { + int flags = 0; + + if (wndconfig->glForward) + flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; + + if (wndconfig->glDebug) + flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; + + if (wndconfig->glRobustness) + flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_FLAGS_KHR, flags); + } + + if (wndconfig->glProfile) + { + int flags = 0; + + if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) + flags = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) + flags = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, flags); + } + + if (wndconfig->glRobustness) + { + int strategy; + + if (wndconfig->glRobustness == GLFW_OPENGL_NO_RESET_NOTIFICATION) + strategy = EGL_NO_RESET_NOTIFICATION_KHR; + else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) + strategy = EGL_LOSE_CONTEXT_ON_RESET_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR, strategy); + } + } + } + setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, @@ -337,6 +385,9 @@ int _glfwInitOpenGL(void) return GL_FALSE; } + if (_glfwPlatformExtensionSupported("EGL_KHR_create_context")) + _glfwLibrary.EGL.KHR_create_context = GL_TRUE; + return GL_TRUE; } diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index f3974676..d3e70055 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -85,6 +85,8 @@ typedef struct _GLFWlibraryEGL EGLDisplay display; EGLint majorVersion, minorVersion; + GLboolean KHR_create_context; + #if defined(_GLFW_DLOPEN_LIBEGL) void* libEGL; // dlopen handle for libEGL.so #endif From bddc95c0176676ea646c2dfcd381465536e1676c Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 01:38:15 +0200 Subject: [PATCH 41/66] Removed references to GLX in EGL port. --- src/x11_egl_opengl.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index da92fb41..84f50bd4 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -248,7 +248,7 @@ static int createContext(_GLFWwindow* window, if (window->EGL.visual == NULL) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/GLX: Failed to retrieve visual for EGLConfig"); + "X11/EGL: Failed to retrieve visual for EGLConfig"); return GL_FALSE; } @@ -551,7 +551,6 @@ int _glfwPlatformExtensionSupported(const char* extension) { const char* extensions; - // Get list of GLX extensions extensions = eglQueryString(_glfwLibrary.EGL.display, EGL_EXTENSIONS); if (extensions != NULL) { From ccca5d71fe8e17f8deb8f443878c4fce1013f8fe Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 02:00:00 +0200 Subject: [PATCH 42/66] Use EGL_KHR_create_context with GLES as well. --- src/x11_egl_opengl.c | 100 +++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 84f50bd4..2484841b 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -252,62 +252,62 @@ static int createContext(_GLFWwindow* window, return GL_FALSE; } + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + eglBindAPI(EGL_OPENGL_ES_API); + else + eglBindAPI(EGL_OPENGL_API); + index = 0; - if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + if (_glfwLibrary.EGL.KHR_create_context) { - eglBindAPI(EGL_OPENGL_ES_API); - setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, wndconfig->glMajor); + setEGLattrib(attribs, index, EGL_CONTEXT_MAJOR_VERSION_KHR, wndconfig->glMajor); + setEGLattrib(attribs, index, EGL_CONTEXT_MINOR_VERSION_KHR, wndconfig->glMinor); + + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) + { + int flags = 0; + + if (wndconfig->glForward) + flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; + + if (wndconfig->glDebug) + flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; + + if (wndconfig->glRobustness) + flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_FLAGS_KHR, flags); + } + + if (wndconfig->glProfile) + { + int flags = 0; + + if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) + flags = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) + flags = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, flags); + } + + if (wndconfig->glRobustness) + { + int strategy; + + if (wndconfig->glRobustness == GLFW_OPENGL_NO_RESET_NOTIFICATION) + strategy = EGL_NO_RESET_NOTIFICATION_KHR; + else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) + strategy = EGL_LOSE_CONTEXT_ON_RESET_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR, strategy); + } } else { - eglBindAPI(EGL_OPENGL_API); - - if (_glfwLibrary.EGL.KHR_create_context) - { - setEGLattrib(attribs, index, EGL_CONTEXT_MAJOR_VERSION_KHR, wndconfig->glMajor); - setEGLattrib(attribs, index, EGL_CONTEXT_MINOR_VERSION_KHR, wndconfig->glMinor); - - if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) - { - int flags = 0; - - if (wndconfig->glForward) - flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; - - if (wndconfig->glDebug) - flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; - - if (wndconfig->glRobustness) - flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; - - setEGLattrib(attribs, index, EGL_CONTEXT_FLAGS_KHR, flags); - } - - if (wndconfig->glProfile) - { - int flags = 0; - - if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) - flags = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; - else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) - flags = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; - - setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, flags); - } - - if (wndconfig->glRobustness) - { - int strategy; - - if (wndconfig->glRobustness == GLFW_OPENGL_NO_RESET_NOTIFICATION) - strategy = EGL_NO_RESET_NOTIFICATION_KHR; - else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) - strategy = EGL_LOSE_CONTEXT_ON_RESET_KHR; - - setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR, strategy); - } - } + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, wndconfig->glMajor); } setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); From b069391cc0834465ab0e3e0c2d2650fcc9e8e389 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 02:01:42 +0200 Subject: [PATCH 43/66] Formatting. --- src/x11_egl_opengl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 2484841b..c790b311 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -185,7 +185,7 @@ static int createContext(_GLFWwindow* window, { int attribs[40], visMask; EGLint count, index, visualID = 0; - EGLint red_size, green_size, blue_size, alpha_size; + EGLint redBits, greenBits, blueBits, alphaBits; EGLConfig config; EGLContext share = NULL; XVisualInfo visTemplate; @@ -230,15 +230,15 @@ static int createContext(_GLFWwindow* window, // attribute, so attempt to find the closest match. eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_RED_SIZE, &red_size); + EGL_RED_SIZE, &redBits); eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_GREEN_SIZE, &green_size); + EGL_GREEN_SIZE, &greenBits); eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_BLUE_SIZE, &blue_size); + EGL_BLUE_SIZE, &blueBits); eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_ALPHA_SIZE, &alpha_size); + EGL_ALPHA_SIZE, &alphaBits); - visTemplate.depth = red_size + green_size + blue_size + alpha_size; + visTemplate.depth = redBits + greenBits + blueBits + alphaBits; visMask |= VisualDepthMask; } From f457223bdf8d9b6f8c949e098ab9fd161ae2218b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 17:06:37 +0200 Subject: [PATCH 44/66] Minor context creation fixes. --- src/x11_egl_opengl.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index c790b311..ded3c612 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -176,8 +176,10 @@ static void refreshContextParams(_GLFWwindow* window) //======================================================================== #define setEGLattrib(attribs, index, attribName, attribValue) \ +{ \ attribs[index++] = attribName; \ - attribs[index++] = attribValue; + attribs[index++] = attribValue; \ +} static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, @@ -253,9 +255,23 @@ static int createContext(_GLFWwindow* window, } if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) - eglBindAPI(EGL_OPENGL_ES_API); + { + if (!eglBindAPI(EGL_OPENGL_ES_API)) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: OpenGL ES is not supported"); + return GL_FALSE; + } + } else - eglBindAPI(EGL_OPENGL_API); + { + if (!eglBindAPI(EGL_OPENGL_API)) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: OpenGL is not supported"); + return GL_FALSE; + } + } index = 0; @@ -320,7 +336,7 @@ static int createContext(_GLFWwindow* window, // TODO: Handle all the various error codes here _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to create OpenGL ES context"); + "X11/EGL: Failed to create context"); return GL_FALSE; } From 03d526097d399eb540c63aa160a1c1ef310ae142 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Mon, 23 Jul 2012 00:48:18 +0200 Subject: [PATCH 45/66] Comment fix. --- include/GL/glfw3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 4ff8e857..15bc9e5c 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -421,7 +421,7 @@ extern "C" { #define GLFW_OPENGL_PROFILE 0x00021014 #define GLFW_OPENGL_ROBUSTNESS 0x00021015 -/* GLFW_OPENGL_API mode tokens */ +/* GLFW_CLIENT_API tokens */ #define GLFW_OPENGL_API 0x00000001 #define GLFW_OPENGL_ES_API 0x00000002 From a3c4b96c91f30de1afd456586748d9342deed1b3 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Mon, 23 Jul 2012 18:40:31 +0200 Subject: [PATCH 46/66] Removed commented-out code, added error reporting. --- src/opengl.c | 58 ++++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/src/opengl.c b/src/opengl.c index ff623ed3..2195d3bd 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -39,58 +39,39 @@ // Parses the client API version string and extracts the version number //======================================================================== -static void parseGLVersion(int* major, int* minor, int* rev) +static GLboolean parseGLVersion(int* major, int* minor, int* rev) { GLuint _major, _minor = 0, _rev = 0; - const GLubyte* version; + const char* version; - version = glGetString(GL_VERSION); + version = (const char*) glGetString(GL_VERSION); if (!version) - return; - -#if 0 - // Old version detection code. This doesn't work very well - const GLubyte* ptr; - const char* glesPrefix = "OpenGL ES "; - - if (strncmp((const char*) version, glesPrefix, strlen(glesPrefix)) == 0) { - // The version string on OpenGL ES has a prefix before the version - // number, so we skip past it and then continue as normal - - version += strlen(glesPrefix); + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: No version string available"); + return GL_FALSE; } - // Parse version from string - - ptr = version; - for (_major = 0; *ptr >= '0' && *ptr <= '9'; ptr++) - _major = 10 * _major + (*ptr - '0'); - - if (*ptr == '.') + for (;;) { - ptr++; - for (_minor = 0; *ptr >= '0' && *ptr <= '9'; ptr++) - _minor = 10 * _minor + (*ptr - '0'); - - if (*ptr == '.') + if (*version != '\0') { - ptr++; - for (_rev = 0; *ptr >= '0' && *ptr <= '9'; ptr++) - _rev = 10 * _rev + (*ptr - '0'); + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: No version found in version string"); + return GL_FALSE; } + + if (sscanf(version, "%d.%d.%d", &_major, &_minor, &_rev)) + break; + + version++; } -#endif - // Find version from OpenGL string - for (; version && - !sscanf((char*)version, "%d.%d.%d", &_major, &_minor, &_rev); - ++version); - - // Store result *major = _major; *minor = _minor; *rev = _rev; + + return GL_TRUE; } @@ -402,7 +383,8 @@ GLboolean _glfwIsValidContext(_GLFWwindow* window, _GLFWwndconfig* wndconfig) { window->clientAPI = wndconfig->clientAPI; - parseGLVersion(&window->glMajor, &window->glMinor, &window->glRevision); + if (!parseGLVersion(&window->glMajor, &window->glMinor, &window->glRevision)) + return GL_FALSE; // Read back forward-compatibility flag { From b1de4d6fedd92bdf06e3e125489660b716cbfc23 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 31 Jul 2012 19:06:48 +0200 Subject: [PATCH 47/66] Fixed client API version parsing. --- src/opengl.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/opengl.c b/src/opengl.c index 2195d3bd..a4157e69 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -41,8 +41,15 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev) { - GLuint _major, _minor = 0, _rev = 0; + int i, _major, _minor = 0, _rev = 0; const char* version; + const char* prefixes[] = + { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + NULL + }; version = (const char*) glGetString(GL_VERSION); if (!version) @@ -52,19 +59,22 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev) return GL_FALSE; } - for (;;) + for (i = 0; prefixes[i]; i++) { - if (*version != '\0') - { - _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: No version found in version string"); - return GL_FALSE; - } + const size_t length = strlen(prefixes[i]); - if (sscanf(version, "%d.%d.%d", &_major, &_minor, &_rev)) - break; + if (strncmp(version, prefixes[i], length) == 0) + { + version += length; + break; + } + } - version++; + if (!sscanf(version, "%d.%d.%d", &_major, &_minor, &_rev)) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/EGL: No version found in version string"); + return GL_FALSE; } *major = _major; From 331aa26503f5fbd1b40fdcb2927596590ab04433 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 31 Jul 2012 19:13:27 +0200 Subject: [PATCH 48/66] Formatting. --- src/opengl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl.c b/src/opengl.c index a4157e69..01dddbfe 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -360,7 +360,7 @@ GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) if (wndconfig->glForward) { - // OpenGL ES does not support Forward-compatibility + // OpenGL ES does not support forward-compatibility _glfwSetError(GLFW_INVALID_VALUE, "glfwOpenWindow: Forward compatibility is not " "supported by OpenGL ES"); From 0f1ab5317f44b12469c8b9362bd8a8841adf2f1b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 1 Aug 2012 01:05:57 +0200 Subject: [PATCH 49/66] Formatting. --- src/opengl.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/opengl.c b/src/opengl.c index 608bc4b3..ec6912b1 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -45,10 +45,10 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev) const char* version; const char* prefixes[] = { - "OpenGL ES-CM ", - "OpenGL ES-CL ", - "OpenGL ES ", - NULL + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + NULL }; version = (const char*) glGetString(GL_VERSION); @@ -61,13 +61,13 @@ static GLboolean parseGLVersion(int* major, int* minor, int* rev) for (i = 0; prefixes[i]; i++) { - const size_t length = strlen(prefixes[i]); + const size_t length = strlen(prefixes[i]); - if (strncmp(version, prefixes[i], length) == 0) - { - version += length; - break; - } + if (strncmp(version, prefixes[i], length) == 0) + { + version += length; + break; + } } if (!sscanf(version, "%d.%d.%d", &_major, &_minor, &_rev)) From a182acd5855bdce144b9ddbd1ccf82d00df7ade4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 2 Aug 2012 03:01:31 +0200 Subject: [PATCH 50/66] Removed EGL-specific context param refresh. --- src/x11_egl_opengl.c | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index ded3c612..f8d317db 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -149,28 +149,6 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, } -//======================================================================== -// Read back framebuffer parameters from the context -//======================================================================== - -static void refreshContextParams(_GLFWwindow* window) -{ - // There is no clear definition of an "accelerated" context on X11/EGL, and - // true sounds better than false, so we hardcode true here - window->accelerated = GL_TRUE; - - window->redBits = getConfigAttrib(window->EGL.config, EGL_RED_SIZE); - window->greenBits = getConfigAttrib(window->EGL.config, EGL_GREEN_SIZE); - window->blueBits = getConfigAttrib(window->EGL.config, EGL_BLUE_SIZE); - - window->alphaBits = getConfigAttrib(window->EGL.config, EGL_ALPHA_SIZE); - window->depthBits = getConfigAttrib(window->EGL.config, EGL_DEPTH_SIZE); - window->stencilBits = getConfigAttrib(window->EGL.config, EGL_STENCIL_SIZE); - - window->samples = getConfigAttrib(window->EGL.config, EGL_SAMPLES); -} - - //======================================================================== // Create the actual OpenGL(|ES) context //======================================================================== @@ -341,7 +319,6 @@ static int createContext(_GLFWwindow* window, } window->EGL.config = config; - refreshContextParams(window); return GL_TRUE; } From dd69985649586a54068885e36f586b33d79ad422 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 19:01:48 +0200 Subject: [PATCH 51/66] Fixed API error tags. --- src/x11_egl_opengl.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 5e79a611..937c6d5e 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -75,7 +75,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, free(configs); _glfwSetError(GLFW_OPENGL_UNAVAILABLE, - "X11/EGL: No EGLConfigs returned"); + "EGL: No EGLConfigs returned"); return NULL; } @@ -184,7 +184,7 @@ static int createContext(_GLFWwindow* window, if (!count) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to retrieve the selected EGLConfig"); + "EGL: Failed to retrieve the selected EGLConfig"); return GL_FALSE; } } @@ -228,7 +228,7 @@ static int createContext(_GLFWwindow* window, if (window->EGL.visual == NULL) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to retrieve visual for EGLConfig"); + "EGL: Failed to retrieve visual for EGLConfig"); return GL_FALSE; } @@ -237,7 +237,7 @@ static int createContext(_GLFWwindow* window, if (!eglBindAPI(EGL_OPENGL_ES_API)) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: OpenGL ES is not supported"); + "EGL: OpenGL ES is not supported"); return GL_FALSE; } } @@ -246,7 +246,7 @@ static int createContext(_GLFWwindow* window, if (!eglBindAPI(EGL_OPENGL_API)) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: OpenGL is not supported"); + "EGL: OpenGL is not supported"); return GL_FALSE; } } @@ -314,7 +314,7 @@ static int createContext(_GLFWwindow* window, // TODO: Handle all the various error codes here _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to create context"); + "EGL: Failed to create context"); return GL_FALSE; } @@ -356,7 +356,7 @@ int _glfwInitOpenGL(void) if (!_glfwLibrary.EGL.libEGL) { - _glfwSetError(GLFW_PLATFORM_ERROR, "X11/EGL: Failed to find libEGL"); + _glfwSetError(GLFW_PLATFORM_ERROR, "EGL: Failed to find libEGL"); return GL_FALSE; } #endif @@ -365,7 +365,7 @@ int _glfwInitOpenGL(void) if (_glfwLibrary.EGL.display == EGL_NO_DISPLAY) { _glfwSetError(GLFW_OPENGL_UNAVAILABLE, - "X11/EGL: Failed to get EGL display"); + "EGL: Failed to get EGL display"); return GL_FALSE; } @@ -374,7 +374,7 @@ int _glfwInitOpenGL(void) &_glfwLibrary.EGL.minorVersion)) { _glfwSetError(GLFW_OPENGL_UNAVAILABLE, - "X11/EGL: Failed to initialize EGL"); + "EGL: Failed to initialize EGL"); return GL_FALSE; } @@ -423,7 +423,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!fbconfigs) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: No usable EGLFBConfigs found"); + "EGL: No usable EGLFBConfigs found"); return GL_FALSE; } @@ -431,7 +431,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!result) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: No EGLFBConfig matched the criteria"); + "EGL: No EGLFBConfig matched the criteria"); free(fbconfigs); return GL_FALSE; @@ -498,7 +498,7 @@ void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) if (window->EGL.surface == EGL_NO_SURFACE) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Failed to create window surface"); + "EGL: Failed to create window surface"); } } @@ -571,6 +571,6 @@ GLFWglproc _glfwPlatformGetProcAddress(const char* procname) void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) { _glfwSetError(GLFW_PLATFORM_ERROR, - "X11/EGL: Context copying not supported by EGL"); + "EGL: Context copying not supported by EGL"); } From 0ca1e67d7aa6389df1e49922b6b0f531f7991136 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 19:03:17 +0200 Subject: [PATCH 52/66] Moved X11-specific defines to X11 header. --- src/x11_egl_platform.h | 3 --- src/x11_platform.h | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index d3e70055..b0b2c810 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -57,9 +57,6 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL -#define _GLFW_EGL_NATIVE_WINDOW window->X11.handle -#define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display - //======================================================================== // GLFW platform specific types diff --git a/src/x11_platform.h b/src/x11_platform.h index 00ad40b8..ede4abc0 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -56,6 +56,8 @@ #if defined(_GLFW_X11_GLX) #include "x11_glx_platform.h" #elif defined(_GLFW_X11_EGL) + #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle + #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display #include "x11_egl_platform.h" #endif From 74488bec67c288462b6d3bae1fbd05b38e4f31e8 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 19:17:46 +0200 Subject: [PATCH 53/66] Further isolated X11-specific parts of EGL code. --- src/x11_egl_opengl.c | 98 ++++++++++++++++++++---------------------- src/x11_egl_platform.h | 3 ++ src/x11_glx_opengl.c | 10 ----- src/x11_platform.h | 3 +- src/x11_window.c | 2 +- 5 files changed, 53 insertions(+), 63 deletions(-) diff --git a/src/x11_egl_opengl.c b/src/x11_egl_opengl.c index 937c6d5e..0b0033e3 100644 --- a/src/x11_egl_opengl.c +++ b/src/x11_egl_opengl.c @@ -163,12 +163,10 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, EGLint fbconfigID) { - int attribs[40], visMask; - EGLint count, index, visualID = 0; - EGLint redBits, greenBits, blueBits, alphaBits; + int attribs[40]; + EGLint count, index; EGLConfig config; EGLContext share = NULL; - XVisualInfo visTemplate; if (wndconfig->share) share = wndconfig->share->EGL.context; @@ -192,45 +190,53 @@ static int createContext(_GLFWwindow* window, // Retrieve the corresponding visual // NOTE: This is the only non-portable code in this file. // Maybe it would not hurt too much to add #ifdefs for different platforms? - eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_NATIVE_VISUAL_ID, &visualID); - - // Init visual template - visTemplate.screen = _glfwLibrary.X11.screen; - visMask = VisualScreenMask; - - if (visualID) +#if defined(_GLFW_X11_EGL) { - // The X window visual must match the EGL config - visTemplate.visualid = visualID; - visMask |= VisualIDMask; - } - else - { - // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID - // attribute, so attempt to find the closest match. - - eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_RED_SIZE, &redBits); - eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_GREEN_SIZE, &greenBits); - eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_BLUE_SIZE, &blueBits); - eglGetConfigAttrib(_glfwLibrary.EGL.display, config, - EGL_ALPHA_SIZE, &alphaBits); - - visTemplate.depth = redBits + greenBits + blueBits + alphaBits; - visMask |= VisualDepthMask; - } - - window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, - visMask, &visTemplate, &count); - - if (window->EGL.visual == NULL) - { - _glfwSetError(GLFW_PLATFORM_ERROR, - "EGL: Failed to retrieve visual for EGLConfig"); - return GL_FALSE; + int mask; + EGLint redBits, greenBits, blueBits, alphaBits, visualID = 0; + XVisualInfo info; + + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_NATIVE_VISUAL_ID, &visualID); + + info.screen = _glfwLibrary.X11.screen; + mask = VisualScreenMask; + + if (visualID) + { + // The X window visual must match the EGL config + info.visualid = visualID; + mask |= VisualIDMask; + } + else + { + // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID + // attribute, so attempt to find the closest match. + + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_RED_SIZE, &redBits); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_GREEN_SIZE, &greenBits); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_BLUE_SIZE, &blueBits); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_ALPHA_SIZE, &alphaBits); + + info.depth = redBits + greenBits + blueBits + alphaBits; + mask |= VisualDepthMask; + } + + window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, + mask, &info, &count); + + if (window->EGL.visual == NULL) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: Failed to retrieve visual for EGLConfig"); + return GL_FALSE; + } } +#endif if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { @@ -471,16 +477,6 @@ void _glfwDestroyContext(_GLFWwindow* window) } -//======================================================================== -// Return the X visual associated with the specified context -//======================================================================== - -XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window) -{ - return window->EGL.visual; -} - - //======================================================================== // Make the OpenGL context associated with the specified window current //======================================================================== diff --git a/src/x11_egl_platform.h b/src/x11_egl_platform.h index b0b2c810..8fa4841e 100644 --- a/src/x11_egl_platform.h +++ b/src/x11_egl_platform.h @@ -70,7 +70,10 @@ typedef struct _GLFWcontextEGL EGLConfig config; EGLContext context; EGLSurface surface; + +#if defined(_GLFW_X11_EGL) XVisualInfo* visual; +#endif } _GLFWcontextEGL; diff --git a/src/x11_glx_opengl.c b/src/x11_glx_opengl.c index ac5dd12c..c13cac60 100644 --- a/src/x11_glx_opengl.c +++ b/src/x11_glx_opengl.c @@ -611,16 +611,6 @@ void _glfwDestroyContext(_GLFWwindow* window) } -//======================================================================== -// Return the X visual associated with the specified context -//======================================================================== - -XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window) -{ - return window->GLX.visual; -} - - //======================================================================== // Make the OpenGL context associated with the specified window current //======================================================================== diff --git a/src/x11_platform.h b/src/x11_platform.h index ede4abc0..edb58315 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -54,8 +54,10 @@ #endif #if defined(_GLFW_X11_GLX) + #define _GLFW_X11_CONTEXT_VISUAL window->GLX.visual #include "x11_glx_platform.h" #elif defined(_GLFW_X11_EGL) + #define _GLFW_X11_CONTEXT_VISUAL window->EGL.visual #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display #include "x11_egl_platform.h" @@ -225,7 +227,6 @@ int _glfwCreateContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig); void _glfwDestroyContext(_GLFWwindow* window); -XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window); // Fullscreen support int _glfwGetClosestVideoMode(int* width, int* height, int* rate); diff --git a/src/x11_window.c b/src/x11_window.c index 3c8d39e9..f5573084 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -83,7 +83,7 @@ static GLboolean createWindow(_GLFWwindow* window, { unsigned long wamask; XSetWindowAttributes wa; - XVisualInfo* visual = _glfwGetContextVisual(window); + XVisualInfo* visual = _GLFW_X11_CONTEXT_VISUAL; // Every window needs a colormap // Create one based on the visual used by the current context From 7493bbe0c81df30c8126b3e6abe3163fbad703b4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 19:33:40 +0200 Subject: [PATCH 54/66] Removed X11 prefix from EGL and GLX files. --- src/CMakeLists.txt | 14 +++++++------- src/{x11_egl_opengl.c => egl_opengl.c} | 0 src/{x11_egl_platform.h => egl_platform.h} | 0 src/{x11_glx_opengl.c => glx_opengl.c} | 0 src/{x11_glx_platform.h => glx_platform.h} | 0 src/x11_platform.h | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) rename src/{x11_egl_opengl.c => egl_opengl.c} (100%) rename src/{x11_egl_platform.h => egl_platform.h} (100%) rename src/{x11_glx_opengl.c => glx_opengl.c} (100%) rename src/{x11_glx_platform.h => glx_platform.h} (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4c31f39e..044ebbd3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,16 +21,16 @@ elseif (_GLFW_WIN32_WGL) win32_native.c win32_opengl.c win32_time.c win32_window.c win32_dllmain.c) elseif (_GLFW_X11_GLX) - set(glfw_HEADERS ${common_HEADERS} x11_platform.h) - set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c - x11_gamma.c x11_glx_opengl.c x11_init.c x11_input.c + set(glfw_HEADERS ${common_HEADERS} x11_platform.h glx_platform.h) + set(glfw_SOURCES ${common_SOURCES} glx_opengl.c x11_clipboard.c + x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c x11_joystick.c x11_keysym2unicode.c x11_native.c x11_time.c x11_window.c) elseif (_GLFW_X11_EGL) - set(glfw_HEADERS ${common_HEADERS} x11_egl_platform.h) - set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c - x11_gamma.c x11_init.c x11_input.c x11_joystick.c - x11_keysym2unicode.c x11_egl_opengl.c x11_time.c + set(glfw_HEADERS ${common_HEADERS} x11_platform.h egl_platform.h) + set(glfw_SOURCES ${common_SOURCES} egl_opengl.c x11_clipboard.c + x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c + x11_joystick.c x11_keysym2unicode.c x11_time.c x11_window.c) endif() diff --git a/src/x11_egl_opengl.c b/src/egl_opengl.c similarity index 100% rename from src/x11_egl_opengl.c rename to src/egl_opengl.c diff --git a/src/x11_egl_platform.h b/src/egl_platform.h similarity index 100% rename from src/x11_egl_platform.h rename to src/egl_platform.h diff --git a/src/x11_glx_opengl.c b/src/glx_opengl.c similarity index 100% rename from src/x11_glx_opengl.c rename to src/glx_opengl.c diff --git a/src/x11_glx_platform.h b/src/glx_platform.h similarity index 100% rename from src/x11_glx_platform.h rename to src/glx_platform.h diff --git a/src/x11_platform.h b/src/x11_platform.h index edb58315..ff21eaf5 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -55,12 +55,12 @@ #if defined(_GLFW_X11_GLX) #define _GLFW_X11_CONTEXT_VISUAL window->GLX.visual - #include "x11_glx_platform.h" + #include "glx_platform.h" #elif defined(_GLFW_X11_EGL) #define _GLFW_X11_CONTEXT_VISUAL window->EGL.visual #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display - #include "x11_egl_platform.h" + #include "egl_platform.h" #endif #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 From 38c4a8ef2df466097286293fbb0f294239788e1f Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sat, 10 Nov 2012 00:08:44 +0200 Subject: [PATCH 55/66] Make it possible to use GLESv1 --- include/GL/glfw3.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 31d76761..5b7fbfbb 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -153,6 +153,8 @@ extern "C" { #else #if defined(GLFW_INCLUDE_GL3) #include + #elif defined(GLFW_INCLUDE_ES1) + #include #elif defined(GLFW_INCLUDE_ES2) #include #else From b934cdf5739337f036767f40565e2caa0f5e5b10 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 12:58:59 +0100 Subject: [PATCH 56/66] Begun preparations for Win32 EGL support. --- src/CMakeLists.txt | 6 +- src/egl_opengl.c | 2 +- src/egl_platform.h | 8 +-- src/glx_platform.h | 1 - src/{win32_opengl.c => wgl_opengl.c} | 0 src/wgl_platform.h | 83 ++++++++++++++++++++++++++++ src/win32_platform.h | 58 ++++--------------- 7 files changed, 103 insertions(+), 55 deletions(-) rename src/{win32_opengl.c => wgl_opengl.c} (100%) create mode 100644 src/wgl_platform.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5e1fcc39..485f5c13 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,9 +24,9 @@ if (_GLFW_COCOA_NSGL) set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) elseif (_GLFW_WIN32_WGL) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) - set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c - win32_gamma.c win32_init.c win32_joystick.c - win32_opengl.c win32_time.c win32_window.c) + set(glfw_SOURCES ${common_SOURCES} wgl_opengl.c win32_clipboard.c + win32_fullscreen.c win32_gamma.c win32_init.c + win32_joystick.c win32_time.c win32_window.c) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES win32_native.c) diff --git a/src/egl_opengl.c b/src/egl_opengl.c index b3247873..054e01f1 100644 --- a/src/egl_opengl.c +++ b/src/egl_opengl.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/EGL +// Platform: EGL // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ diff --git a/src/egl_platform.h b/src/egl_platform.h index 8fa4841e..fcc4420a 100644 --- a/src/egl_platform.h +++ b/src/egl_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/EGL +// Platform: EGL // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -28,8 +28,8 @@ // //======================================================================== -#ifndef _x11_egl_platform_h_ -#define _x11_egl_platform_h_ +#ifndef _egl_platform_h_ +#define _egl_platform_h_ #include @@ -93,4 +93,4 @@ typedef struct _GLFWlibraryEGL } _GLFWlibraryEGL; -#endif // _x11_egl_platform_h_ +#endif // _egl_platform_h_ diff --git a/src/glx_platform.h b/src/glx_platform.h index 2882a197..a04d6f2e 100644 --- a/src/glx_platform.h +++ b/src/glx_platform.h @@ -62,7 +62,6 @@ #define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX -#define _GLFW_CTX GLX #ifndef GLX_MESA_swap_control typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); diff --git a/src/win32_opengl.c b/src/wgl_opengl.c similarity index 100% rename from src/win32_opengl.c rename to src/wgl_opengl.c diff --git a/src/wgl_platform.h b/src/wgl_platform.h new file mode 100644 index 00000000..1bbd8e23 --- /dev/null +++ b/src/wgl_platform.h @@ -0,0 +1,83 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: WGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _wgl_platform_h_ +#define _wgl_platform_h_ + +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of wglext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/wglext.h" + + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL WGL +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryWGL WGL + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextWGL +{ + // Platform specific window resources + HDC DC; // Private GDI device context + HGLRC context; // Permanent rendering context + + // Platform specific extensions (context specific) + PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; + PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; + PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; + PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + GLboolean EXT_swap_control; + GLboolean ARB_multisample; + GLboolean ARB_pixel_format; + GLboolean ARB_create_context; + GLboolean ARB_create_context_profile; + GLboolean EXT_create_context_es2_profile; + GLboolean ARB_create_context_robustness; +} _GLFWcontextWGL; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for WGL +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryWGL +{ + int dummy; + +} _GLFWlibraryWGL; + + +#endif // _wgl_platform_h_ diff --git a/src/win32_platform.h b/src/win32_platform.h index 217fc2cf..142a7eae 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: Win32/WGL +// Platform: Win32 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -28,8 +28,8 @@ // //======================================================================== -#ifndef _platform_h_ -#define _platform_h_ +#ifndef _win32_platform_h_ +#define _win32_platform_h_ // We don't need all the fancy stuff @@ -63,11 +63,6 @@ #include #include -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of wglext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/wglext.h" - //======================================================================== // Hack: Define things that some windows.h variants don't @@ -110,10 +105,16 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); #define _GLFW_WNDCLASSNAME L"GLFW30" +#if defined(_GLFW_WIN32_WGL) + #include "wgl_platform.h" +#elif defined(_GLFW_WIN32_EGL) + #define _GLFW_EGL_NATIVE_WINDOW window->Win32.handle + #define _GLFW_EGL_NATIVE_DISPLAY NULL + #include "egl_platform.h" +#endif + #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32 -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL WGL #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 Win32 -#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryWGL WGL //======================================================================== @@ -126,31 +127,6 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); typedef INT_PTR GLFWintptr; -//------------------------------------------------------------------------ -// Platform-specific OpenGL context structure -//------------------------------------------------------------------------ -typedef struct _GLFWcontextWGL -{ - // Platform specific window resources - HDC DC; // Private GDI device context - HGLRC context; // Permanent rendering context - - // Platform specific extensions (context specific) - PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; - PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; - PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; - PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; - PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; - GLboolean EXT_swap_control; - GLboolean ARB_multisample; - GLboolean ARB_pixel_format; - GLboolean ARB_create_context; - GLboolean ARB_create_context_profile; - GLboolean EXT_create_context_es2_profile; - GLboolean ARB_create_context_robustness; -} _GLFWcontextWGL; - - //------------------------------------------------------------------------ // Platform-specific window structure //------------------------------------------------------------------------ @@ -210,16 +186,6 @@ typedef struct _GLFWlibraryWin32 } _GLFWlibraryWin32; -//------------------------------------------------------------------------ -// Platform-specific library global data for WGL -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryWGL -{ - int dummy; - -} _GLFWlibraryWGL; - - //======================================================================== // Prototypes for platform specific internal functions //======================================================================== @@ -244,4 +210,4 @@ void _glfwSetVideoMode(int* width, int* height, void _glfwRestoreVideoMode(void); -#endif // _platform_h_ +#endif // _win32_platform_h_ From 7e9286c1fa15a5a1d94d8e41013e7e855a2cc46c Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 13:10:14 +0100 Subject: [PATCH 57/66] Removed unused stub. --- src/egl_opengl.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/egl_opengl.c b/src/egl_opengl.c index 054e01f1..0f10745d 100644 --- a/src/egl_opengl.c +++ b/src/egl_opengl.c @@ -589,14 +589,3 @@ GLFWglproc _glfwPlatformGetProcAddress(const char* procname) return _glfw_eglGetProcAddress(procname); } - -//======================================================================== -// Copies the specified OpenGL state categories from src to dst -//======================================================================== - -void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) -{ - _glfwSetError(GLFW_PLATFORM_ERROR, - "EGL: Context copying not supported by EGL"); -} - From 10cc85343a5c131861b9c20b96505e4a093ac300 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 13:38:21 +0100 Subject: [PATCH 58/66] Formatting. --- include/GL/glfw3.h | 2 +- src/cocoa_platform.h | 5 +++-- src/egl_platform.h | 2 +- src/glx_platform.h | 2 +- src/wgl_platform.h | 2 +- src/win32_platform.h | 2 +- src/x11_platform.h | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index d37ee178..ecc8c28f 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -526,7 +526,7 @@ extern "C" { /*! @brief The @link clients client API @endlink to create a context for. */ #define GLFW_CLIENT_API 0x00022000 -#define GLFW_OPENGL_VERSION_MAJOR 0x00022001 +#define GLFW_CLIENT_VERSION_MAJOR 0x00022001 #define GLFW_OPENGL_VERSION_MINOR 0x00022002 #define GLFW_OPENGL_FORWARD_COMPAT 0x00022003 #define GLFW_OPENGL_DEBUG_CONTEXT 0x00022004 diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 06055a25..46957e53 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -41,9 +41,10 @@ typedef void* id; #endif -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS NS + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryNSGL NSGL diff --git a/src/egl_platform.h b/src/egl_platform.h index fcc4420a..cb9114dd 100644 --- a/src/egl_platform.h +++ b/src/egl_platform.h @@ -54,7 +54,7 @@ #error "No OpenGL entry point retrieval mechanism was enabled" #endif -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL diff --git a/src/glx_platform.h b/src/glx_platform.h index a04d6f2e..92a5ec65 100644 --- a/src/glx_platform.h +++ b/src/glx_platform.h @@ -60,7 +60,7 @@ #error "No OpenGL entry point retrieval mechanism was enabled" #endif -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX #ifndef GLX_MESA_swap_control diff --git a/src/wgl_platform.h b/src/wgl_platform.h index 1bbd8e23..346176a3 100644 --- a/src/wgl_platform.h +++ b/src/wgl_platform.h @@ -37,7 +37,7 @@ #include "../support/GL/wglext.h" -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL WGL +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL WGL #define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryWGL WGL diff --git a/src/win32_platform.h b/src/win32_platform.h index 142a7eae..20126177 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -113,7 +113,7 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); #include "egl_platform.h" #endif -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32 +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 Win32 diff --git a/src/x11_platform.h b/src/x11_platform.h index e2acc6e6..7c4ad4ce 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -63,7 +63,7 @@ #include "egl_platform.h" #endif -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 // Clipboard format atom indices From b49c78ed963e34679d56c5a068c25f792cba44d8 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 14:02:48 +0100 Subject: [PATCH 59/66] Added missing whitespace. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40c16ff9..b920fa30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,7 +172,7 @@ endif() if (_GLFW_X11_GLX) # Set up library and include paths - list(APPEND glfw_INCLUDE_DIRS${OPENGL_INCLUDE_DIR}) + list(APPEND glfw_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) list(APPEND glfw_LIBRARIES ${OPENGL_gl_LIBRARY}) set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} gl") From 4ce92262f714a16036ef104ff4c0607201a07187 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 14:31:10 +0100 Subject: [PATCH 60/66] Reverted bad edit. --- include/GL/glfw3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index ecc8c28f..d37ee178 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -526,7 +526,7 @@ extern "C" { /*! @brief The @link clients client API @endlink to create a context for. */ #define GLFW_CLIENT_API 0x00022000 -#define GLFW_CLIENT_VERSION_MAJOR 0x00022001 +#define GLFW_OPENGL_VERSION_MAJOR 0x00022001 #define GLFW_OPENGL_VERSION_MINOR 0x00022002 #define GLFW_OPENGL_FORWARD_COMPAT 0x00022003 #define GLFW_OPENGL_DEBUG_CONTEXT 0x00022004 From 34d383399c222af661c6d408f3c583e455c2d2f1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 15:02:26 +0100 Subject: [PATCH 61/66] Finished initial window/context backend split. --- CMakeLists.txt | 108 +++++++++++++++----------- src/CMakeLists.txt | 46 ++++++----- src/cocoa_platform.h | 36 ++------- src/config.h.in | 23 ++++-- src/egl_opengl.c | 2 +- src/egl_platform.h | 2 +- src/internal.h | 6 +- src/{cocoa_opengl.m => nsgl_opengl.m} | 0 src/nsgl_platform.h | 62 +++++++++++++++ src/win32_init.c | 5 ++ src/win32_platform.h | 4 +- src/x11_fullscreen.c | 2 +- src/x11_init.c | 4 +- src/x11_platform.h | 4 +- 14 files changed, 191 insertions(+), 113 deletions(-) rename src/{cocoa_opengl.m => nsgl_opengl.m} (100%) create mode 100644 src/nsgl_platform.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b920fa30..5797c99f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,10 @@ option(GLFW_USE_EGL "Build for EGL and OpenGL ES platform (Currently only X11)" if (GLFW_USE_EGL) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/modules) find_package(EGL REQUIRED) + + set(GLFW_BUILD_EXAMPLES OFF) + set(GLFW_BUILD_TESTS OFF) + message(STATUS "NOTE: Examples and tests are disabled for EGL") else() find_package(OpenGL REQUIRED) endif() @@ -47,25 +51,39 @@ if (BUILD_SHARED_LIBS) endif() #-------------------------------------------------------------------- -# Detect and select target platform +# Detect and select target APIs #-------------------------------------------------------------------- if (WIN32) - set(_GLFW_WIN32_WGL 1) - message(STATUS "Building GLFW for WGL on a Win32 system") -elseif (UNIX AND APPLE) - set(_GLFW_COCOA_NSGL 1) - message(STATUS "Building GLFW for Cocoa and NSOpenGL on Mac OS X") -elseif (UNIX AND NOT APPLE) - set(_GLFW_X11 1) + set(_GLFW_WIN32 1) + message(STATUS "Using Win32 for window creation") + if (GLFW_USE_EGL) - set(_GLFW_X11_EGL 1) - set(GLFW_BUILD_EXAMPLES 0) - set(GLFW_BUILD_TESTS 0) - message(STATUS "Building GLFW for X11 and EGL on a Unix-like system") - message(STATUS "NOTE: Examples and tests are disabled for EGL") + set(_GLFW_EGL 1) + message(STATUS "Using EGL for context creation") else() - set(_GLFW_X11_GLX 1) - message(STATUS "Building GLFW for X11 and GLX on a Unix-like system") + set(_GLFW_WGL 1) + message(STATUS "Using WGL for context creation") + endif() +elseif (APPLE) + set(_GLFW_COCOA 1) + message(STATUS "Using Cocoa for window creation") + + if (GLFW_USE_EGL) + message(FATAL_ERROR "EGL not supported on Mac OS X") + else() + set(_GLFW_NSGL 1) + message(STATUS "Using NSGL for context creation") + endif() +elseif (UNIX) + set(_GLFW_X11 1) + message(STATUS "Using X11 for window creation") + + if (GLFW_USE_EGL) + set(_GLFW_EGL 1) + message(STATUS "Using EGL for context creation") + else() + set(_GLFW_GLX 1) + message(STATUS "Using GLX for context creation") endif() else() message(FATAL_ERROR "No supported platform was detected") @@ -74,7 +92,7 @@ endif() #-------------------------------------------------------------------- # Set up GLFW for Win32 and WGL on Windows #-------------------------------------------------------------------- -if (_GLFW_WIN32_WGL) +if (_GLFW_WIN32) # Set up library and include paths list(APPEND glfw_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) @@ -160,16 +178,12 @@ if (_GLFW_X11) set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -lm") endif() - if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(_GLFW_USE_LINUX_JOYSTICKS 1) - endif() - endif() #-------------------------------------------------------------------- # GLX Context #-------------------------------------------------------------------- -if (_GLFW_X11_GLX) +if (_GLFW_GLX) # Set up library and include paths list(APPEND glfw_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) @@ -223,42 +237,44 @@ endif() #-------------------------------------------------------------------- # EGL Context #-------------------------------------------------------------------- -if (_GLFW_X11_EGL) +if (_GLFW_EGL) # Set up library and include paths list(APPEND glfw_INCLUDE_DIRS ${EGL_INCLUDE_DIR}) list(APPEND glfw_LIBRARIES ${EGL_LIBRARY}) - set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl") - - include(CheckFunctionExists) - set(CMAKE_REQUIRED_LIBRARIES ${EGL_LIBRARY}) - check_function_exists(eglGetProcAddress _GLFW_HAS_EGLGETPROCADDRESS) + if (_GLFW_X11) + set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl") - if (NOT _GLFW_HAS_EGLGETPROCADDRESS) - message(WARNING "No eglGetProcAddress found") + include(CheckFunctionExists) - # Check for dlopen support as a fallback + check_function_exists(eglGetProcAddress _GLFW_HAS_EGLGETPROCADDRESS) - find_library(DL_LIBRARY dl) - mark_as_advanced(DL_LIBRARY) - if (DL_LIBRARY) - set(CMAKE_REQUIRED_LIBRARIES ${DL_LIBRARY}) - else() - set(CMAKE_REQUIRED_LIBRARIES "") - endif() + if (NOT _GLFW_HAS_EGLGETPROCADDRESS) + message(WARNING "No eglGetProcAddress found") - check_function_exists(dlopen _GLFW_HAS_DLOPEN) + # Check for dlopen support as a fallback - if (NOT _GLFW_HAS_DLOPEN) - message(FATAL_ERROR "No entry point retrieval mechanism found") - endif() + find_library(DL_LIBRARY dl) + mark_as_advanced(DL_LIBRARY) + if (DL_LIBRARY) + set(CMAKE_REQUIRED_LIBRARIES ${DL_LIBRARY}) + else() + set(CMAKE_REQUIRED_LIBRARIES "") + endif() - if (DL_LIBRARY) - list(APPEND glfw_LIBRARIES ${DL_LIBRARY}) - set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") + check_function_exists(dlopen _GLFW_HAS_DLOPEN) + + if (NOT _GLFW_HAS_DLOPEN) + message(FATAL_ERROR "No entry point retrieval mechanism found") + endif() + + if (DL_LIBRARY) + list(APPEND glfw_LIBRARIES ${DL_LIBRARY}) + set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") + endif() endif() endif() @@ -267,7 +283,7 @@ endif() #-------------------------------------------------------------------- # Set up GLFW for Cocoa and NSOpenGL on Mac OS X #-------------------------------------------------------------------- -if (_GLFW_COCOA_NSGL) +if (_GLFW_COCOA AND _GLFW_NSGL) option(GLFW_BUILD_UNIVERSAL "Build GLFW as a Universal Binary" OFF) @@ -349,7 +365,7 @@ install(FILES COPYING.txt readme.html #-------------------------------------------------------------------- # Create and install pkg-config file on supported platforms #-------------------------------------------------------------------- -if (_GLFW_X11_GLX OR _GLFW_COCOA_NSGL) +if (UNIX) configure_file(${GLFW_SOURCE_DIR}/src/glfw3.pc.in ${GLFW_BINARY_DIR}/src/glfw3.pc @ONLY) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 485f5c13..08602a9d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,11 +10,11 @@ set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GL/glfw3.h internal.h) set(common_SOURCES clipboard.c fullscreen.c gamma.c init.c input.c joystick.c opengl.c time.c window.c) -if (_GLFW_COCOA_NSGL) +if (_GLFW_COCOA) set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h) set(glfw_SOURCES ${common_SOURCES} cocoa_clipboard.m cocoa_fullscreen.m - cocoa_gamma.c cocoa_init.m cocoa_joystick.m - cocoa_opengl.m cocoa_time.c cocoa_window.m) + cocoa_gamma.c cocoa_init.m cocoa_joystick.m cocoa_time.c + cocoa_window.m) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES cocoa_native.m) @@ -22,30 +22,38 @@ if (_GLFW_COCOA_NSGL) # For some reason, CMake doesn't know about .m set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) -elseif (_GLFW_WIN32_WGL) +elseif (_GLFW_WIN32) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) - set(glfw_SOURCES ${common_SOURCES} wgl_opengl.c win32_clipboard.c - win32_fullscreen.c win32_gamma.c win32_init.c - win32_joystick.c win32_time.c win32_window.c) + set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c + win32_gamma.c win32_init.c win32_joystick.c win32_time.c + win32_window.c) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES win32_native.c) endif() -elseif (_GLFW_X11_GLX) +elseif (_GLFW_X11) set(glfw_HEADERS ${common_HEADERS} x11_platform.h) - set(glfw_SOURCES ${common_SOURCES} glx_opengl.c x11_clipboard.c - x11_fullscreen.c x11_gamma.c x11_init.c x11_joystick.c - x11_keysym2unicode.c x11_time.c x11_window.c) + set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c + x11_gamma.c x11_init.c x11_joystick.c x11_keysym2unicode.c + x11_time.c x11_window.c) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES x11_native.c) endif() -elseif (_GLFW_X11_EGL) - set(glfw_HEADERS ${common_HEADERS} x11_platform.h egl_platform.h) - set(glfw_SOURCES ${common_SOURCES} egl_opengl.c x11_clipboard.c - x11_fullscreen.c x11_gamma.c x11_init.c - x11_joystick.c x11_keysym2unicode.c x11_time.c - x11_window.c) +endif() + +if (_GLFW_EGL) + list(APPEND glfw_HEADERS ${common_HEADERS} egl_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} egl_opengl.c) +elseif (_GLFW_NSGL) + list(APPEND glfw_HEADERS ${common_HEADERS} nsgl_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} nsgl_opengl.c) +elseif (_GLFW_WGL) + list(APPEND glfw_HEADERS ${common_HEADERS} wgl_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} wgl_opengl.c) +elseif (_GLFW_X11) + list(APPEND glfw_HEADERS ${common_HEADERS} glx_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} glx_opengl.c) endif() add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) @@ -58,7 +66,7 @@ if (BUILD_SHARED_LIBS) set_target_properties(glfw PROPERTIES SOVERSION ${GLFW_VERSION_MAJOR}) endif() - if (_GLFW_WIN32_WGL) + if (_GLFW_WIN32) # The GLFW DLL needs a special compile-time macro and import library name set_target_properties(glfw PROPERTIES PREFIX "" IMPORT_PREFIX "") @@ -67,7 +75,7 @@ if (BUILD_SHARED_LIBS) else() set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib") endif() - elseif (_GLFW_COCOA_NSGL) + elseif (_GLFW_COCOA) # Append -fno-common to the compile flags to work around a bug in the Apple GCC get_target_property(glfw_CFLAGS glfw COMPILE_FLAGS) if (NOT glfw_CFLAGS) diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 46957e53..57a27487 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: Cocoa/NSOpenGL +// Platform: Cocoa // API Version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -27,13 +27,12 @@ // //======================================================================== -#ifndef _platform_h_ -#define _platform_h_ +#ifndef _cocoa_platform_h_ +#define _cocoa_platform_h_ #include - #if defined(__OBJC__) #import #else @@ -41,12 +40,13 @@ typedef void* id; #endif +#if defined(_GLFW_NSGL) + #include "nsgl_platform.h" +#endif + #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS NS -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL -#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryNSGL NSGL - //======================================================================== // GLFW platform specific types @@ -58,16 +58,6 @@ typedef void* id; typedef intptr_t GLFWintptr; -//------------------------------------------------------------------------ -// Platform-specific OpenGL context structure -//------------------------------------------------------------------------ -typedef struct _GLFWcontextNSGL -{ - id pixelFormat; - id context; -} _GLFWcontextNSGL; - - //------------------------------------------------------------------------ // Platform-specific window structure //------------------------------------------------------------------------ @@ -99,16 +89,6 @@ typedef struct _GLFWlibraryNS } _GLFWlibraryNS; -//------------------------------------------------------------------------ -// Platform-specific library global data for NSGL -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryNSGL -{ - // dlopen handle for dynamically loading OpenGL extension entry points - void* framework; -} _GLFWlibraryNSGL; - - //======================================================================== // Prototypes for platform specific internal functions //======================================================================== @@ -128,4 +108,4 @@ void _glfwRestoreVideoMode(void); int _glfwInitOpenGL(void); void _glfwTerminateOpenGL(void); -#endif // _platform_h_ +#endif // _cocoa_platform_h_ diff --git a/src/config.h.in b/src/config.h.in index f725f89f..d391fcdf 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -35,14 +35,21 @@ // it. Instead, you should modify the config.h.in file. //======================================================================== -// Define this to 1 if building GLFW for X11/GLX -#cmakedefine _GLFW_X11_GLX -// Define this to 1 if building GLFW for X11/EGL -#cmakedefine _GLFW_X11_EGL -// Define this to 1 if building GLFW for Win32/WGL -#cmakedefine _GLFW_WIN32_WGL -// Define this to 1 if building GLFW for Cocoa/NSOpenGL -#cmakedefine _GLFW_COCOA_NSGL +// Define this to 1 if building GLFW for X11 +#cmakedefine _GLFW_X11 +// Define this to 1 if building GLFW for Win32 +#cmakedefine _GLFW_WIN32 +// Define this to 1 if building GLFW for Cocoa +#cmakedefine _GLFW_COCOA + +// Define this to 1 if building GLFW for EGL +#cmakedefine _GLFW_EGL +// Define this to 1 if building GLFW for GLX +#cmakedefine _GLFW_GLX +// Define this to 1 if building GLFW for WGL +#cmakedefine _GLFW_WGL +// Define this to 1 if building GLFW for NSGL +#cmakedefine _GLFW_NSGL // Define this to 1 if building as a shared library / dynamic library / DLL #cmakedefine _GLFW_BUILD_DLL diff --git a/src/egl_opengl.c b/src/egl_opengl.c index 0f10745d..cf8ad77a 100644 --- a/src/egl_opengl.c +++ b/src/egl_opengl.c @@ -208,7 +208,7 @@ static int createContext(_GLFWwindow* window, // Retrieve the corresponding visual // NOTE: This is the only non-portable code in this file. // Maybe it would not hurt too much to add #ifdefs for different platforms? -#if defined(_GLFW_X11_EGL) +#if defined(_GLFW_X11) { int mask; EGLint redBits, greenBits, blueBits, alphaBits, visualID = 0; diff --git a/src/egl_platform.h b/src/egl_platform.h index cb9114dd..e416871c 100644 --- a/src/egl_platform.h +++ b/src/egl_platform.h @@ -71,7 +71,7 @@ typedef struct _GLFWcontextEGL EGLContext context; EGLSurface surface; -#if defined(_GLFW_X11_EGL) +#if defined(_GLFW_X11) XVisualInfo* visual; #endif } _GLFWcontextEGL; diff --git a/src/internal.h b/src/internal.h index 436a63ad..36b586da 100644 --- a/src/internal.h +++ b/src/internal.h @@ -65,11 +65,11 @@ typedef struct _GLFWlibrary _GLFWlibrary; // extensions and not all operating systems come with an up-to-date version #include "../support/GL/glext.h" -#if defined(_GLFW_COCOA_NSGL) +#if defined(_GLFW_COCOA) #include "cocoa_platform.h" -#elif defined(_GLFW_WIN32_WGL) +#elif defined(_GLFW_WIN32) #include "win32_platform.h" -#elif defined(_GLFW_X11_GLX) || defined(_GLFW_X11_EGL) +#elif defined(_GLFW_X11) #include "x11_platform.h" #else #error "No supported platform selected" diff --git a/src/cocoa_opengl.m b/src/nsgl_opengl.m similarity index 100% rename from src/cocoa_opengl.m rename to src/nsgl_opengl.m diff --git a/src/nsgl_platform.h b/src/nsgl_platform.h new file mode 100644 index 00000000..34ea0fb6 --- /dev/null +++ b/src/nsgl_platform.h @@ -0,0 +1,62 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: NSOpenGL +// API Version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _nsgl_platform_h_ +#define _nsgl_platform_h_ + + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryNSGL NSGL + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextNSGL +{ + id pixelFormat; + id context; +} _GLFWcontextNSGL; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for NSGL +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryNSGL +{ + // dlopen handle for dynamically loading OpenGL extension entry points + void* framework; +} _GLFWlibraryNSGL; + + +#endif // _nsgl_platform_h_ diff --git a/src/win32_init.c b/src/win32_init.c index 21de415b..62d6c94b 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -232,6 +232,11 @@ int _glfwPlatformTerminate(void) const char* _glfwPlatformGetVersionString(void) { const char* version = _GLFW_VERSION_FULL +#if defined(_GLFW_WGL) + " WGL" +#elif defined(_GLFW_EGL) + " EGL" +#endif #if defined(__MINGW32__) " MinGW" #elif defined(_MSC_VER) diff --git a/src/win32_platform.h b/src/win32_platform.h index 20126177..758ada2c 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -105,9 +105,9 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); #define _GLFW_WNDCLASSNAME L"GLFW30" -#if defined(_GLFW_WIN32_WGL) +#if defined(_GLFW_WGL) #include "wgl_platform.h" -#elif defined(_GLFW_WIN32_EGL) +#elif defined(_GLFW_EGL) #define _GLFW_EGL_NATIVE_WINDOW window->Win32.handle #define _GLFW_EGL_NATIVE_DISPLAY NULL #include "egl_platform.h" diff --git a/src/x11_fullscreen.c b/src/x11_fullscreen.c index 06b161e4..9b1121fc 100644 --- a/src/x11_fullscreen.c +++ b/src/x11_fullscreen.c @@ -449,7 +449,7 @@ GLFWvidmode* _glfwPlatformGetVideoModes(int* found) rgbs = (int*) malloc(sizeof(int) * visualCount); rgbCount = 0; -#if !defined(_GLFW_X11_EGL) +#if defined(_GLFW_GLX) for (i = 0; i < visualCount; i++) { int gl, rgba, rgb, r, g, b; diff --git a/src/x11_init.c b/src/x11_init.c index b76d307e..b5631fba 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -693,9 +693,9 @@ int _glfwPlatformTerminate(void) const char* _glfwPlatformGetVersionString(void) { const char* version = _GLFW_VERSION_FULL -#if defined(_GLFW_X11_GLX) +#if defined(_GLFW_GLX) " GLX" -#elif defined(_GLFW_X11_EGL) +#elif defined(_GLFW_EGL) " EGL" #endif #if defined(_GLFW_HAS_XRANDR) diff --git a/src/x11_platform.h b/src/x11_platform.h index 7c4ad4ce..8c4740a0 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -53,10 +53,10 @@ #include #endif -#if defined(_GLFW_X11_GLX) +#if defined(_GLFW_GLX) #define _GLFW_X11_CONTEXT_VISUAL window->GLX.visual #include "glx_platform.h" -#elif defined(_GLFW_X11_EGL) +#elif defined(_GLFW_EGL) #define _GLFW_X11_CONTEXT_VISUAL window->EGL.visual #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display From 5ea359158650f61332373c088b4b424a29a2232b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 15:17:24 +0100 Subject: [PATCH 62/66] Cocoa NSGL fixes. --- src/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08602a9d..08ee9dad 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,9 +19,6 @@ if (_GLFW_COCOA) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES cocoa_native.m) endif() - - # For some reason, CMake doesn't know about .m - set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) elseif (_GLFW_WIN32) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c @@ -47,7 +44,7 @@ if (_GLFW_EGL) list(APPEND glfw_SOURCES ${common_SOURCES} egl_opengl.c) elseif (_GLFW_NSGL) list(APPEND glfw_HEADERS ${common_HEADERS} nsgl_platform.h) - list(APPEND glfw_SOURCES ${common_SOURCES} nsgl_opengl.c) + list(APPEND glfw_SOURCES ${common_SOURCES} nsgl_opengl.m) elseif (_GLFW_WGL) list(APPEND glfw_HEADERS ${common_HEADERS} wgl_platform.h) list(APPEND glfw_SOURCES ${common_SOURCES} wgl_opengl.c) @@ -56,6 +53,11 @@ elseif (_GLFW_X11) list(APPEND glfw_SOURCES ${common_SOURCES} glx_opengl.c) endif() +if (_GLFW_NSGL) + # For some reason, CMake doesn't know about .m + set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) +endif() + add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) set_target_properties(glfw PROPERTIES OUTPUT_NAME "${GLFW_LIB_NAME}") From 1eef0f08691134a37f239686a6916d21d2913e9a Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 27 Nov 2012 15:21:49 +0100 Subject: [PATCH 63/66] Renamed context module files. --- src/CMakeLists.txt | 12 ++++++------ src/{opengl.c => context.c} | 0 src/{egl_opengl.c => egl_context.c} | 0 src/{glx_opengl.c => glx_context.c} | 0 src/{nsgl_opengl.m => nsgl_context.m} | 0 src/{wgl_opengl.c => wgl_context.c} | 0 6 files changed, 6 insertions(+), 6 deletions(-) rename src/{opengl.c => context.c} (100%) rename src/{egl_opengl.c => egl_context.c} (100%) rename src/{glx_opengl.c => glx_context.c} (100%) rename src/{nsgl_opengl.m => nsgl_context.m} (100%) rename src/{wgl_opengl.c => wgl_context.c} (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08ee9dad..7f5be33b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,8 +7,8 @@ if (MSVC) endif() set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GL/glfw3.h internal.h) -set(common_SOURCES clipboard.c fullscreen.c gamma.c init.c input.c - joystick.c opengl.c time.c window.c) +set(common_SOURCES clipboard.c context.c fullscreen.c gamma.c init.c input.c + joystick.c time.c window.c) if (_GLFW_COCOA) set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h) @@ -41,16 +41,16 @@ endif() if (_GLFW_EGL) list(APPEND glfw_HEADERS ${common_HEADERS} egl_platform.h) - list(APPEND glfw_SOURCES ${common_SOURCES} egl_opengl.c) + list(APPEND glfw_SOURCES ${common_SOURCES} egl_context.c) elseif (_GLFW_NSGL) list(APPEND glfw_HEADERS ${common_HEADERS} nsgl_platform.h) - list(APPEND glfw_SOURCES ${common_SOURCES} nsgl_opengl.m) + list(APPEND glfw_SOURCES ${common_SOURCES} nsgl_context.m) elseif (_GLFW_WGL) list(APPEND glfw_HEADERS ${common_HEADERS} wgl_platform.h) - list(APPEND glfw_SOURCES ${common_SOURCES} wgl_opengl.c) + list(APPEND glfw_SOURCES ${common_SOURCES} wgl_context.c) elseif (_GLFW_X11) list(APPEND glfw_HEADERS ${common_HEADERS} glx_platform.h) - list(APPEND glfw_SOURCES ${common_SOURCES} glx_opengl.c) + list(APPEND glfw_SOURCES ${common_SOURCES} glx_context.c) endif() if (_GLFW_NSGL) diff --git a/src/opengl.c b/src/context.c similarity index 100% rename from src/opengl.c rename to src/context.c diff --git a/src/egl_opengl.c b/src/egl_context.c similarity index 100% rename from src/egl_opengl.c rename to src/egl_context.c diff --git a/src/glx_opengl.c b/src/glx_context.c similarity index 100% rename from src/glx_opengl.c rename to src/glx_context.c diff --git a/src/nsgl_opengl.m b/src/nsgl_context.m similarity index 100% rename from src/nsgl_opengl.m rename to src/nsgl_context.m diff --git a/src/wgl_opengl.c b/src/wgl_context.c similarity index 100% rename from src/wgl_opengl.c rename to src/wgl_context.c From 280782a2a5d66cccb2597e407015ec753afa71f2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 2 Dec 2012 16:29:56 +0100 Subject: [PATCH 64/66] Added explicit non-support for sRGB on EGL. --- src/egl_context.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/egl_context.c b/src/egl_context.c index cf8ad77a..3c164520 100644 --- a/src/egl_context.c +++ b/src/egl_context.c @@ -157,6 +157,10 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, f->samples = getConfigAttrib(configs[i], EGL_SAMPLES); + // NOTE: There does not appear to be any way to request sRGB + // framebuffers for OpenGL or GLES contexts; only for OpenVG ones + f->sRGB = GL_FALSE; + f->platformID = (GLFWintptr) getConfigAttrib(configs[i], EGL_CONFIG_ID); (*found)++; From 5da8ed250a12875cb0483e0958a84c955f8e723b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 2 Dec 2012 19:01:20 +0100 Subject: [PATCH 65/66] Cleanup of backend option strings. --- CMakeLists.txt | 5 ++++- src/cocoa_platform.h | 2 ++ src/internal.h | 2 +- src/win32_platform.h | 2 ++ src/x11_platform.h | 2 ++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5797c99f..08542a60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,10 @@ option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON) option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON) option(GLFW_NATIVE_API "Build the GLFW native API" OFF) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) -option(GLFW_USE_EGL "Build for EGL and OpenGL ES platform (Currently only X11)" OFF) + +if (NOT APPLE) + option(GLFW_USE_EGL "Use EGL for context creation" OFF) +endif() if (GLFW_USE_EGL) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/modules) diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 57a27487..21589a69 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -42,6 +42,8 @@ typedef void* id; #if defined(_GLFW_NSGL) #include "nsgl_platform.h" +#else + #error "No supported context creation API selected" #endif #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS diff --git a/src/internal.h b/src/internal.h index fa87e699..d2619e2e 100644 --- a/src/internal.h +++ b/src/internal.h @@ -72,7 +72,7 @@ typedef struct _GLFWlibrary _GLFWlibrary; #elif defined(_GLFW_X11) #include "x11_platform.h" #else - #error "No supported platform selected" + #error "No supported window creation API selected" #endif diff --git a/src/win32_platform.h b/src/win32_platform.h index f5e94bb5..30d55347 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -111,6 +111,8 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); #define _GLFW_EGL_NATIVE_WINDOW window->Win32.handle #define _GLFW_EGL_NATIVE_DISPLAY NULL #include "egl_platform.h" +#else + #error "No supported context creation API selected" #endif #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32 diff --git a/src/x11_platform.h b/src/x11_platform.h index 990487fc..87c46d85 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -61,6 +61,8 @@ #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display #include "egl_platform.h" +#else + #error "No supported context creation API selected" #endif #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 From 47c11b4ea665786993859720896fb33a5676adb1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 2 Dec 2012 19:02:32 +0100 Subject: [PATCH 66/66] Tweaked comment. --- src/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7f5be33b..94fe11e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -78,7 +78,8 @@ if (BUILD_SHARED_LIBS) set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib") endif() elseif (_GLFW_COCOA) - # Append -fno-common to the compile flags to work around a bug in the Apple GCC + # Append -fno-common to the compile flags to work around a bug in + # Apple's GCC get_target_property(glfw_CFLAGS glfw COMPILE_FLAGS) if (NOT glfw_CFLAGS) set(glfw_CFLAGS "")