Added EGL support into build system for GLES1 + GLES2.

Added EGL support into GraphicsWindowX11.
This commit is contained in:
Robert Osfield 2009-10-30 15:17:38 +00:00
parent 0ca4c82e3a
commit 93d83010f8
14 changed files with 301 additions and 99 deletions

View File

@ -287,6 +287,8 @@ OPTION(OSG_GL3_AVAILABLE "Set to OFF to disable use of OpenGL 3.x functions libr
OPTION(OSG_GLES1_AVAILABLE "Set to OFF to disable use of OpenGL ES 1.x functions library." OFF) OPTION(OSG_GLES1_AVAILABLE "Set to OFF to disable use of OpenGL ES 1.x functions library." OFF)
OPTION(OSG_GLES2_AVAILABLE "Set to OFF to disable use of OpenGL ES 2.x functions library." OFF) OPTION(OSG_GLES2_AVAILABLE "Set to OFF to disable use of OpenGL ES 2.x functions library." OFF)
SET(OPENGL_egl_LIBRARY CACHE STRING "Set the OpenGL egl library.")
# SET(OSG_GL_DISPLAYLISTS_AVAILABLE ${OSG_GL1_AVAILABLE}) # SET(OSG_GL_DISPLAYLISTS_AVAILABLE ${OSG_GL1_AVAILABLE})
# SET(OSG_GL_MATRICES_AVAILABLE ${OSG_GL1_AVAILABLE}) # SET(OSG_GL_MATRICES_AVAILABLE ${OSG_GL1_AVAILABLE})
# SET(OSG_GL_VERTEX_FUNCS_AVAILABLE ${OSG_GL1_AVAILABLE}) # SET(OSG_GL_VERTEX_FUNCS_AVAILABLE ${OSG_GL1_AVAILABLE})

View File

@ -51,7 +51,12 @@ ENDMACRO(LINK_EXTERNAL TRGTNAME)
####################################################################################################### #######################################################################################################
MACRO(LINK_CORELIB_DEFAULT CORELIB_NAME) MACRO(LINK_CORELIB_DEFAULT CORELIB_NAME)
LINK_EXTERNAL(${CORELIB_NAME} ${OPENGL_LIBRARIES}) SET(ALL_GL_LIBRARIES ${OPENGL_LIBRARIES})
IF (OSG_GLES1_AVAILABLE OR OSG_GLES2_AVAILABLE)
SET(ALL_GL_LIBRARIES ${ALL_GL_LIBRARIES} ${OPENGL_egl_LIBRARY})
ENDIF()
LINK_EXTERNAL(${CORELIB_NAME} ${ALL_GL_LIBRARIES})
LINK_WITH_VARIABLES(${CORELIB_NAME} OPENTHREADS_LIBRARY) LINK_WITH_VARIABLES(${CORELIB_NAME} OPENTHREADS_LIBRARY)
IF(OPENSCENEGRAPH_SONAMES) IF(OPENSCENEGRAPH_SONAMES)
SET_TARGET_PROPERTIES(${CORELIB_NAME} PROPERTIES VERSION ${OPENSCENEGRAPH_VERSION} SOVERSION ${OPENSCENEGRAPH_SOVERSION}) SET_TARGET_PROPERTIES(${CORELIB_NAME} PROPERTIES VERSION ${OPENSCENEGRAPH_VERSION} SOVERSION ${OPENSCENEGRAPH_SOVERSION})
@ -95,6 +100,11 @@ MACRO(SETUP_LINK_LIBRARIES)
ENDIF(TO_INSERT) ENDIF(TO_INSERT)
ENDFOREACH(LINKLIB) ENDFOREACH(LINKLIB)
SET(ALL_GL_LIBRARIES ${OPENGL_LIBRARIES})
IF (OSG_GLES1_AVAILABLE OR OSG_GLES2_AVAILABLE)
SET(ALL_GL_LIBRARIES ${ALL_GL_LIBRARIES} ${OPENGL_egl_LIBRARY})
ENDIF()
# FOREACH(LINKLIB ${TARGET_LIBRARIES}) # FOREACH(LINKLIB ${TARGET_LIBRARIES})
# TARGET_LINK_LIBRARIES(${TARGET_TARGETNAME} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}") # TARGET_LINK_LIBRARIES(${TARGET_TARGETNAME} optimized ${LINKLIB} debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
# ENDFOREACH(LINKLIB) # ENDFOREACH(LINKLIB)
@ -107,7 +117,7 @@ MACRO(SETUP_LINK_LIBRARIES)
ENDIF(TARGET_LIBRARIES_VARS) ENDIF(TARGET_LIBRARIES_VARS)
IF(MSVC AND OSG_MSVC_VERSIONED_DLL) IF(MSVC AND OSG_MSVC_VERSIONED_DLL)
#when using full path name to specify linkage, it seems that already linked libs must be specified #when using full path name to specify linkage, it seems that already linked libs must be specified
LINK_EXTERNAL(${TARGET_TARGETNAME} ${OPENGL_LIBRARIES}) LINK_EXTERNAL(${TARGET_TARGETNAME} ${ALL_GL_LIBRARIES})
ENDIF(MSVC AND OSG_MSVC_VERSIONED_DLL) ENDIF(MSVC AND OSG_MSVC_VERSIONED_DLL)
ENDMACRO(SETUP_LINK_LIBRARIES) ENDMACRO(SETUP_LINK_LIBRARIES)

View File

@ -20,6 +20,11 @@
#ifndef GL_CLIP_PLANE0 #ifndef GL_CLIP_PLANE0
#define GL_CLIP_PLANE0 0x3000 #define GL_CLIP_PLANE0 0x3000
#define GL_CLIP_PLANE1 0x3001
#define GL_CLIP_PLANE2 0x3002
#define GL_CLIP_PLANE3 0x3003
#define GL_CLIP_PLANE4 0x3004
#define GL_CLIP_PLANE5 0x3005
#endif #endif
namespace osg { namespace osg {

View File

@ -36,6 +36,11 @@
typedef char GLchar; typedef char GLchar;
#endif #endif
#if !defined(GL_VERSION_2_0)
#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
#endif
#if !defined(GL_VERSION_2_0) && !defined(GL_ES_VERSION_2_0) #if !defined(GL_VERSION_2_0) && !defined(GL_ES_VERSION_2_0)
#define GL_VERSION_2_0 1 #define GL_VERSION_2_0 1
#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION #define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION
@ -44,8 +49,6 @@ typedef char GLchar;
#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
#define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_CURRENT_VERTEX_ATTRIB 0x8626
#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
#define GL_STENCIL_BACK_FUNC 0x8800 #define GL_STENCIL_BACK_FUNC 0x8800
#define GL_STENCIL_BACK_FAIL 0x8801 #define GL_STENCIL_BACK_FAIL 0x8801

View File

@ -20,6 +20,13 @@
#ifndef GL_LIGHT0 #ifndef GL_LIGHT0
#define GL_LIGHT0 0x4000 #define GL_LIGHT0 0x4000
#define GL_LIGHT1 0x4001
#define GL_LIGHT2 0x4002
#define GL_LIGHT3 0x4003
#define GL_LIGHT4 0x4004
#define GL_LIGHT5 0x4005
#define GL_LIGHT6 0x4006
#define GL_LIGHT7 0x4007
#endif #endif
#ifndef GL_LIGHTING #ifndef GL_LIGHTING

View File

@ -18,7 +18,11 @@
#include <osg/Matrix> #include <osg/Matrix>
#ifndef GL_RESCALE_NORMAL #ifndef GL_RESCALE_NORMAL
#define GL_RESCALE_NORMAL 0x803A #define GL_RESCALE_NORMAL 0x803A
#endif
#ifndef GL_NORMALIZE
#define GL_NORMALIZE 0x0BA1
#endif #endif
namespace osg { namespace osg {

View File

@ -24,7 +24,17 @@
#define GLX_GLXEXT_PROTOTYPES 1 #define GLX_GLXEXT_PROTOTYPES 1
#include <X11/X.h> #include <X11/X.h>
#include <GL/glx.h> #include <X11/Xlib.h>
#include <X11/Xutil.h>
#if defined(OSG_GLES1_AVAILABLE) || defined(OSG_GLES2_AVAILABLE)
#define OSG_USE_EGL
#include <EGL/egl.h>
#else
#include <GL/glx.h>
#endif
#include <string.h> #include <string.h>
namespace osgViewer namespace osgViewer
@ -41,7 +51,10 @@ class OSGVIEWER_EXPORT GraphicsWindowX11 : public osgViewer::GraphicsWindow
_parent(0), _parent(0),
_window(0), _window(0),
_visualInfo(0), _visualInfo(0),
_glxContext(0), _context(0),
#ifdef OSG_USE_EGL
_surface(0),
#endif
_currentCursor(0), _currentCursor(0),
_initialized(false), _initialized(false),
_realized(false), _realized(false),
@ -144,7 +157,15 @@ class OSGVIEWER_EXPORT GraphicsWindowX11 : public osgViewer::GraphicsWindow
Window& getParent() { return _parent; } Window& getParent() { return _parent; }
Window& getWindow() { return _window; } Window& getWindow() { return _window; }
GLXContext& getGLXContext() { return _glxContext; }
#ifdef OSG_USE_EGL
typedef EGLContext Context;
#else
typedef GLXContext Context;
#endif
Context& getContext() { return _context; }
Cursor getCurrentCursor() { return _currentCursor; } Cursor getCurrentCursor() { return _currentCursor; }
@ -180,7 +201,11 @@ class OSGVIEWER_EXPORT GraphicsWindowX11 : public osgViewer::GraphicsWindow
Window _parent; Window _parent;
Window _window; Window _window;
XVisualInfo* _visualInfo; XVisualInfo* _visualInfo;
GLXContext _glxContext; Context _context;
#ifdef OSG_USE_EGL
EGLSurface _surface;
#endif
Cursor _currentCursor; Cursor _currentCursor;

View File

@ -19,19 +19,14 @@
#ifndef OSGVIEWER_PIXELBUFFERX11 #ifndef OSGVIEWER_PIXELBUFFERX11
#define OSGVIEWER_PIXELBUFFERX11 1 #define OSGVIEWER_PIXELBUFFERX11 1
#include <osg/GraphicsContext> #include <osgViewer/api/X11/GraphicsWindowX11>
#include <osgViewer/Export>
#define GLX_GLXEXT_PROTOTYPES 1 #ifndef OSG_USE_EGL
#ifndef GLX_VERSION_1_3
#include <X11/X.h> typedef XID GLXPbuffer;
#include <GL/glx.h> #endif
#ifndef GLX_VERSION_1_3
typedef XID GLXPbuffer;
#endif #endif
namespace osgViewer namespace osgViewer
{ {
@ -77,8 +72,16 @@ class OSGVIEWER_EXPORT PixelBufferX11 : public osg::GraphicsContext
Display* getDisplay() const { return _display; } Display* getDisplay() const { return _display; }
GLXPbuffer& getPbuffer() { return _pbuffer; } #ifdef OSG_USE_EGL
GLXContext& getGLXContext() { return _glxContext; } typedef EGLContext Context;
typedef EGLSurface Pbuffer;
#else
typedef GLXContext Context;
typedef GLXPbuffer Pbuffer;
#endif
Pbuffer& getPbuffer() { return _pbuffer; }
Context& getContext() { return _context; }
protected: protected:
@ -90,9 +93,9 @@ class OSGVIEWER_EXPORT PixelBufferX11 : public osg::GraphicsContext
bool _valid; bool _valid;
Display* _display; Display* _display;
GLXPbuffer _pbuffer; Pbuffer _pbuffer;
XVisualInfo* _visualInfo; XVisualInfo* _visualInfo;
GLXContext _glxContext; Context _context;
bool _initialized; bool _initialized;
bool _realized; bool _realized;

View File

@ -6,6 +6,13 @@
#include <osg/TexGen> #include <osg/TexGen>
#include <osg/PolygonOffset> #include <osg/PolygonOffset>
#include <osg/LineStipple> #include <osg/LineStipple>
#include <osg/Light>
#include <osg/ClipPlane>
#include <osg/AlphaFunc>
#include <osg/Point>
#include <osg/Material>
#include <osg/Fog>
#include <osg/GL2Extensions>
#include <osgDB/Registry> #include <osgDB/Registry>
#include <osgDB/Input> #include <osgDB/Input>

View File

@ -165,9 +165,11 @@ public:
xform->setMatrix( osg::Matrix::scale( sx, sy, sz ) ); xform->setMatrix( osg::Matrix::scale( sx, sy, sz ) );
xform->addChild( node ); xform->addChild( node );
// turn on GL_NORMALIZE to prevent problems with scaled normals #ifndef OSG_GLES2_AVAILABLE
osg::StateSet* ss = xform->getOrCreateStateSet(); // turn on GL_NORMALIZE to prevent problems with scaled normals
ss->setMode( GL_NORMALIZE, osg::StateAttribute::ON ); osg::StateSet* ss = xform->getOrCreateStateSet();
ss->setMode( GL_NORMALIZE, osg::StateAttribute::ON );
#endif
return xform; return xform;
} }

View File

@ -108,18 +108,15 @@ ELSE()
SET(OSGVIEWER_USE_XRANDR OFF) SET(OSGVIEWER_USE_XRANDR OFF)
ENDIF() ENDIF()
IF(OSG_GLES1_AVAILABLE OR OSG_GLES2_AVAILABLE) SET(LIB_PUBLIC_HEADERS ${LIB_PUBLIC_HEADERS}
ELSE() ${HEADER_PATH}/api/X11/GraphicsWindowX11
SET(LIB_PUBLIC_HEADERS ${LIB_PUBLIC_HEADERS} ${HEADER_PATH}/api/X11/PixelBufferX11
${HEADER_PATH}/api/X11/GraphicsWindowX11 )
${HEADER_PATH}/api/X11/PixelBufferX11
)
SET(LIB_COMMON_FILES ${LIB_COMMON_FILES} SET(LIB_COMMON_FILES ${LIB_COMMON_FILES}
GraphicsWindowX11.cpp GraphicsWindowX11.cpp
PixelBufferX11.cpp PixelBufferX11.cpp
) )
ENDIF()
IF(OSGVIEWER_USE_XRANDR) IF(OSGVIEWER_USE_XRANDR)
ADD_DEFINITIONS(-DOSGVIEWER_USE_XRANDR) ADD_DEFINITIONS(-DOSGVIEWER_USE_XRANDR)

View File

@ -276,6 +276,17 @@ bool GraphicsWindowX11::createVisualInfo()
} }
else else
{ {
#ifdef OSG_USE_EGL
_visualInfo = new XVisualInfo;
int depth = DefaultDepth( _display, _traits->screenNum );
if (XMatchVisualInfo( _display, _traits->screenNum, depth, TrueColor, _visualInfo )==0)
{
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::createVisualInfo() failed."<<std::endl;
return false;
}
#else
typedef std::vector<int> Attributes; typedef std::vector<int> Attributes;
Attributes attributes; Attributes attributes;
@ -297,12 +308,12 @@ bool GraphicsWindowX11::createVisualInfo()
if (_traits->stencil) { attributes.push_back(GLX_STENCIL_SIZE); attributes.push_back(_traits->stencil); } if (_traits->stencil) { attributes.push_back(GLX_STENCIL_SIZE); attributes.push_back(_traits->stencil); }
#if defined(GLX_SAMPLE_BUFFERS) && defined (GLX_SAMPLES) #if defined(GLX_SAMPLE_BUFFERS) && defined (GLX_SAMPLES)
if (_traits->sampleBuffers) { attributes.push_back(GLX_SAMPLE_BUFFERS); attributes.push_back(_traits->sampleBuffers); } if (_traits->sampleBuffers) { attributes.push_back(GLX_SAMPLE_BUFFERS); attributes.push_back(_traits->sampleBuffers); }
if (_traits->sampleBuffers) { attributes.push_back(GLX_SAMPLES); attributes.push_back(_traits->samples); } if (_traits->sampleBuffers) { attributes.push_back(GLX_SAMPLES); attributes.push_back(_traits->samples); }
#endif #endif
// TODO // TODO
// GLX_AUX_BUFFERS // GLX_AUX_BUFFERS
// GLX_ACCUM_RED_SIZE // GLX_ACCUM_RED_SIZE
@ -313,6 +324,7 @@ bool GraphicsWindowX11::createVisualInfo()
attributes.push_back(None); attributes.push_back(None);
_visualInfo = glXChooseVisual( _display, _traits->screenNum, &(attributes.front()) ); _visualInfo = glXChooseVisual( _display, _traits->screenNum, &(attributes.front()) );
#endif
} }
return _visualInfo != 0; return _visualInfo != 0;
@ -602,8 +614,6 @@ void GraphicsWindowX11::init()
_ownsWindow = windowHandle == 0; _ownsWindow = windowHandle == 0;
_display = XOpenDisplay(_traits->displayName().c_str()); _display = XOpenDisplay(_traits->displayName().c_str());
if (!_display) if (!_display)
@ -613,17 +623,36 @@ void GraphicsWindowX11::init()
return; return;
} }
// Query for GLX extension #ifdef OSG_USE_EGL
int errorBase, eventBase;
if( glXQueryExtension( _display, &errorBase, &eventBase) == False )
{
osg::notify(osg::NOTICE)<<"Error: " << XDisplayName(_traits->displayName().c_str()) <<" has no GLX extension." << std::endl;
XCloseDisplay( _display ); EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)_display);
_display = 0;
_valid = false; EGLint eglMajorVersion, eglMinorVersion;
return; if (!eglInitialize(eglDisplay, &eglMajorVersion, &eglMinorVersion))
} {
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::init() - eglInitialize() failed."<<std::endl;
XCloseDisplay( _display );
_display = 0;
_valid = false;
return;
}
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::init() - eglInitialize() succeded eglMajorVersion="<<eglMajorVersion<<" iMinorVersion="<<eglMinorVersion<<std::endl;
#else
// Query for GLX extension
int errorBase, eventBase;
if( glXQueryExtension( _display, &errorBase, &eventBase) == False )
{
osg::notify(osg::NOTICE)<<"Error: " << XDisplayName(_traits->displayName().c_str()) <<" has no GLX extension." << std::endl;
XCloseDisplay( _display );
_display = 0;
_valid = false;
return;
}
#endif
// osg::notify(osg::NOTICE)<<"GLX extension, errorBase="<<errorBase<<" eventBase="<<eventBase<<std::endl; // osg::notify(osg::NOTICE)<<"GLX extension, errorBase="<<errorBase<<" eventBase="<<eventBase<<std::endl;
@ -647,36 +676,110 @@ void GraphicsWindowX11::init()
} }
} }
GLXContext sharedContextGLX = NULL; Context sharedContextGLX = NULL;
// get any shared GLX contexts // get any shared GLX contexts
GraphicsWindowX11* graphicsWindowX11 = dynamic_cast<GraphicsWindowX11*>(_traits->sharedContext); GraphicsWindowX11* graphicsWindowX11 = dynamic_cast<GraphicsWindowX11*>(_traits->sharedContext);
if (graphicsWindowX11) if (graphicsWindowX11)
{ {
sharedContextGLX = graphicsWindowX11->getGLXContext(); sharedContextGLX = graphicsWindowX11->getContext();
} }
else else
{ {
PixelBufferX11* pixelBufferX11 = dynamic_cast<PixelBufferX11*>(_traits->sharedContext); PixelBufferX11* pixelBufferX11 = dynamic_cast<PixelBufferX11*>(_traits->sharedContext);
if (pixelBufferX11 && pixelBufferX11->valid()) if (pixelBufferX11 && pixelBufferX11->valid())
{ {
sharedContextGLX = pixelBufferX11->getGLXContext(); sharedContextGLX = pixelBufferX11->getContext();
} }
} }
_glxContext = glXCreateContext( _display, _visualInfo, sharedContextGLX, True ); #ifdef OSG_USE_EGL
if (!_glxContext) _valid = _ownsWindow ? createWindow() : setWindow(windowHandle);
{
osg::notify(osg::NOTICE)<<"Error: Unable to create OpenGL graphics context."<<std::endl;
XCloseDisplay( _display );
_display = 0;
_valid = false;
return;
}
_initialized = _ownsWindow ? createWindow() : setWindow(windowHandle); if (!_valid)
_valid = _initialized; {
XCloseDisplay( _display );
_display = 0;
return;
}
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::init() - window created ="<<_valid<<std::endl;
EGLConfig eglConfig = 0;
#if defined(OSG_GLES1_AVAILABLE)
EGLint configAttribs[3];
configAttribs[0] = EGL_SURFACE_TYPE;
configAttribs[1] = EGL_WINDOW_BIT;
configAttribs[2] = EGL_NONE;
#else
EGLint configAttribs[5];
configAttribs[0] = EGL_SURFACE_TYPE;
configAttribs[1] = EGL_WINDOW_BIT;
configAttribs[2] = EGL_RENDERABLE_TYPE;
configAttribs[3] = EGL_OPENGL_ES2_BIT;
configAttribs[4] = EGL_NONE;
#endif
int numConfigs;
if (!eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &numConfigs) || (numConfigs != 1))
{
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::init() - eglChooseConfig() failed."<<std::endl;
XCloseDisplay( _display );
_valid = false;
_display = 0;
return;
}
_surface = eglCreateWindowSurface(eglDisplay, eglConfig, (EGLNativeWindowType)_window, NULL);
if (_surface == EGL_NO_SURFACE)
{
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::init() - eglCreateWindowSurface(..) failed."<<std::endl;
XCloseDisplay( _display );
_valid = false;
_display = 0;
return;
}
#if defined(OSG_GLES1_AVAILABLE)
EGLint* contextAttribs = 0;
#else
EGLint contextAttribs[3];
pi32ContextAttribs[0] = EGL_CONTEXT_CLIENT_VERSION;
pi32ContextAttribs[1] = 2;
pi32ContextAttribs[2] = EGL_NONE;
#endif
_context = eglCreateContext(eglDisplay, eglConfig, NULL, contextAttribs);
if (_context == EGL_NO_CONTEXT)
{
osg::notify(osg::NOTICE)<<"GraphicsWindowX11::init() - eglCreateContext(..) failed."<<std::endl;
XCloseDisplay( _display );
_valid = false;
_display = 0;
return;
}
_initialized = true;
#else
_context = glXCreateContext( _display, _visualInfo, sharedContextGLX, True );
if (!_context)
{
osg::notify(osg::NOTICE)<<"Error: Unable to create OpenGL graphics context."<<std::endl;
XCloseDisplay( _display );
_display = 0;
_valid = false;
return;
}
_initialized = _ownsWindow ? createWindow() : setWindow(windowHandle);
_valid = _initialized;
#endif
if (_valid == false) if (_valid == false)
{ {
@ -723,7 +826,7 @@ bool GraphicsWindowX11::createWindow()
if (!_window) if (!_window)
{ {
osg::notify(osg::NOTICE)<<"Error: Unable to create Window."<<std::endl; osg::notify(osg::NOTICE)<<"Error: Unable to create Window."<<std::endl;
_glxContext = 0; _context = 0;
return false; return false;
} }
@ -849,10 +952,16 @@ bool GraphicsWindowX11::makeCurrentImplementation()
return false; return false;
} }
// osg::notify(osg::NOTICE)<<"GraphicsWindowX11::makeCurrentImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl; #ifdef OSG_USE_EGL
// osg::notify(osg::NOTICE)<<" glXMakeCurrent ("<<_display<<","<<_window<<","<<_glxContext<<std::endl; EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)_display);
bool result = eglMakeCurrent(eglDisplay, _surface, _surface, _context)==EGL_TRUE;
return glXMakeCurrent( _display, _window, _glxContext )==True; osg::notify(osg::NOTICE)<<"GraphicsWindowX11::makeCurrentImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<" _surface="<<_surface<<" _context="<<_context<<" result="<<result<<std::endl;
return result;
#else
return glXMakeCurrent( _display, _window, _context )==True;
#endif
} }
bool GraphicsWindowX11::releaseContextImplementation() bool GraphicsWindowX11::releaseContextImplementation()
@ -863,10 +972,14 @@ bool GraphicsWindowX11::releaseContextImplementation()
return false; return false;
} }
// osg::notify(osg::NOTICE)<<"GraphicsWindowX11::releaseContextImplementation() "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl; osg::notify(osg::NOTICE)<<"GraphicsWindowX11::releaseContextImplementation() "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl;
// osg::notify(osg::NOTICE)<<" glXMakeCurrent ("<<_display<<std::endl;
return glXMakeCurrent( _display, None, NULL )==True; #ifdef OSG_USE_EGL
EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)_display);
return eglMakeCurrent( eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT )==EGL_TRUE;
#else
return glXMakeCurrent( _display, None, NULL )==True;
#endif
} }
@ -882,9 +995,14 @@ void GraphicsWindowX11::closeImplementation()
if (_display) if (_display)
{ {
if (_glxContext) if (_context)
{ {
glXDestroyContext(_display, _glxContext ); #ifdef OSG_USE_EGL
EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)_display);
eglDestroyContext( eglDisplay, _context );
#else
glXDestroyContext( _display, _context );
#endif
} }
if (_window && _ownsWindow) if (_window && _ownsWindow)
@ -898,11 +1016,15 @@ void GraphicsWindowX11::closeImplementation()
_window = 0; _window = 0;
_parent = 0; _parent = 0;
_glxContext = 0; _context = 0;
if (_visualInfo) if (_visualInfo)
{ {
XFree(_visualInfo); #ifdef OSG_USE_EGL
delete _visualInfo;
#else
XFree(_visualInfo);
#endif
_visualInfo = 0; _visualInfo = 0;
} }
@ -924,7 +1046,12 @@ void GraphicsWindowX11::swapBuffersImplementation()
// osg::notify(osg::NOTICE)<<"swapBuffersImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl; // osg::notify(osg::NOTICE)<<"swapBuffersImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl;
glXSwapBuffers(_display, _window); #ifdef OSG_USE_EGL
EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)_display);
eglSwapBuffers( eglDisplay, _surface );
#else
glXSwapBuffers( _display, _window );
#endif
while( XPending(_display) ) while( XPending(_display) )
{ {

View File

@ -31,7 +31,7 @@ PixelBufferX11::PixelBufferX11(osg::GraphicsContext::Traits* traits)
_display(0), _display(0),
_pbuffer(0), _pbuffer(0),
_visualInfo(0), _visualInfo(0),
_glxContext(0), _context(0),
_initialized(false), _initialized(false),
_realized(false), _realized(false),
_useGLX1_3(false) _useGLX1_3(false)
@ -234,9 +234,9 @@ void PixelBufferX11::init()
} }
} }
_glxContext = glXCreateContext( _display, _visualInfo, sharedContextGLX, True ); _context = glXCreateContext( _display, _visualInfo, sharedContextGLX, True );
if (!_glxContext) if (!_context)
{ {
osg::notify(osg::NOTICE)<<"Error: Unable to create OpenGL graphics context."<<std::endl; osg::notify(osg::NOTICE)<<"Error: Unable to create OpenGL graphics context."<<std::endl;
XCloseDisplay( _display ); XCloseDisplay( _display );
@ -294,7 +294,7 @@ void PixelBufferX11::init()
osg::notify(osg::NOTICE)<<"Error: Unable to create pbuffer."<<std::endl; osg::notify(osg::NOTICE)<<"Error: Unable to create pbuffer."<<std::endl;
XCloseDisplay( _display ); XCloseDisplay( _display );
_display = 0; _display = 0;
_glxContext = 0; _context = 0;
_valid = false; _valid = false;
return; return;
} }
@ -312,9 +312,9 @@ void PixelBufferX11::closeImplementation()
// osg::notify(osg::NOTICE)<<"Closing PixelBufferX11"<<std::endl; // osg::notify(osg::NOTICE)<<"Closing PixelBufferX11"<<std::endl;
if (_display) if (_display)
{ {
if (_glxContext) if (_context)
{ {
glXDestroyContext(_display, _glxContext ); glXDestroyContext(_display, _context );
} }
if (_pbuffer) if (_pbuffer)
@ -338,7 +338,7 @@ void PixelBufferX11::closeImplementation()
} }
_pbuffer = 0; _pbuffer = 0;
_glxContext = 0; _context = 0;
if (_visualInfo) if (_visualInfo)
{ {
@ -374,7 +374,7 @@ void PixelBufferX11::closeImplementation()
{ {
// osg::notify(osg::NOTICE)<<"Closing PixelBufferX11"<<std::endl; // osg::notify(osg::NOTICE)<<"Closing PixelBufferX11"<<std::endl;
_pbuffer = 0; _pbuffer = 0;
_glxContext = 0; _context = 0;
_initialized = false; _initialized = false;
_realized = false; _realized = false;
_valid = false; _valid = false;
@ -408,9 +408,12 @@ bool PixelBufferX11::makeCurrentImplementation()
} }
// osg::notify(osg::NOTICE)<<"PixelBufferX11::makeCurrentImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl; // osg::notify(osg::NOTICE)<<"PixelBufferX11::makeCurrentImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl;
// osg::notify(osg::NOTICE)<<" glXMakeCurrent ("<<_display<<","<<_pbuffer<<","<<_glxContext<<std::endl;
return glXMakeCurrent( _display, _pbuffer, _glxContext )==True; #ifdef OSG_USE_EGL
return eglMakeCurrent(_display, _pbuffer, _pbuffer, _context)==EGL_TRUE;
#else
return glXMakeCurrent( _display, _pbuffer, _context )==True;
#endif
} }
bool PixelBufferX11::makeContextCurrentImplementation(osg::GraphicsContext* readContext) bool PixelBufferX11::makeContextCurrentImplementation(osg::GraphicsContext* readContext)
@ -429,9 +432,12 @@ bool PixelBufferX11::releaseContextImplementation()
} }
// osg::notify(osg::NOTICE)<<"PixelBufferX11::releaseContextImplementation() "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl; // osg::notify(osg::NOTICE)<<"PixelBufferX11::releaseContextImplementation() "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl;
// osg::notify(osg::NOTICE)<<" glXMakeCurrent ("<<_display<<std::endl;
return glXMakeCurrent( _display, None, NULL )==True; #ifdef OSG_USE_EGL
return eglMakeCurrent( _display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT )==EGL_TRUE;
#else
return glXMakeCurrent( _display, None, NULL )==True;
#endif
} }
@ -446,5 +452,9 @@ void PixelBufferX11::swapBuffersImplementation()
// osg::notify(osg::NOTICE)<<"PixelBufferX11::swapBuffersImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl; // osg::notify(osg::NOTICE)<<"PixelBufferX11::swapBuffersImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl;
glXSwapBuffers(_display, _pbuffer); #ifdef OSG_USE_EGL
eglSwapBuffers( _display, _pbuffer );
#else
glXSwapBuffers( _display, _pbuffer );
#endif
} }