[osg-users] Custom GraphicsContext Segmentation Fault when using Multithreading
Sebastian Messerschmidt
sebastian.messerschmidt at gmx.de
Fri Apr 22 01:46:03 PDT 2016
Hi Robert,
He edited the original post.
I've attached it for you.
Cheers
Sebastian
> Hi Phillipp,
>
> The source didn't make it through the osg-users mailing list so can't
> comment about the implementation side.
>
> From the error description in the first post it's clear that the
> graphics context is not current when the graphics thread starts
> running. osgViewer specifically calls makeCurrent() to ensure that
> the context is current, if this fails then you'd see issues like you
> are seeing. Whether this is the issue or not I can not say.
>
> I could see being able to create an OSG application without X11 would
> be useful. Any chance that you could open source the implementation
> and submit for inclusion with the core osgViewer? This route would
> help others help refine the implementation. The first step would
> follow would be to make an small example program with all the required
> classes in it then get this working, and then once it's refined enough
> move the GraphicsContext implementation into osgViewer to sit
> alongside the rest of the implementation.
>
> Cheers,
> Robert.
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20160422/0c5bc5eb/attachment-0003.htm>
-------------- next part --------------
/*
* EGLGraphicsWindow.cpp
*
* Created on: Apr 12, 2016
* Author: ubuntu
*/
#include "EGLGraphicsContext.h"
#include <iostream>
using namespace std;
EGLGraphicsContext::EGLGraphicsContext(osg::GraphicsContext::Traits* traits) :
osg::GraphicsContext(), _initialized(false), eglSurface(nullptr), eglContext(
nullptr) {
_traits = traits;
realizeImplementation();
if (valid()) {
setState(new osg::State);
getState()->setGraphicsContext(this);
if (_traits.valid() && _traits->sharedContext.valid()) {
getState()->setContextID(
_traits->sharedContext->getState()->getContextID());
incrementContextIDUsageCount(getState()->getContextID());
} else {
getState()->setContextID(
osg::GraphicsContext::createNewContextID());
}
}
}
EGLGraphicsContext::~EGLGraphicsContext() {
// TODO Auto-generated destructor stub
}
/** Return whether a valid and usable GraphicsContext has been created.*/
bool EGLGraphicsContext::valid() const {
return _initialized;
}
/** Realize the GraphicsContext implementation,
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
bool EGLGraphicsContext::realizeImplementation() {
if (_initialized) {
return true;
}
GetEglExtensionFunctionPointers();
eglDevice = GetEglDevice();
drmFd = GetDrmFd(eglDevice);
SetMode(drmFd, &planeID, &width, &height);
eglDpy = GetEglDisplay(eglDevice, drmFd);
SetUpEgl(eglDpy, planeID, _traits->width, _traits->height, &eglSurface,
&eglContext);
//disable vsync
if (eglSwapInterval(eglDpy, 0) == EGL_TRUE) {
cout << "swap interval changed successfully." << endl;
} else {
cout << "error while changing swap interval" << endl;
}
_initialized = true;
return true;
}
/** Return true if the graphics context has been realized, and is ready to use, implementation.
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
bool EGLGraphicsContext::isRealizedImplementation() const {
return _initialized;
}
/** Close the graphics context implementation.
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
void EGLGraphicsContext::closeImplementation() {
_initialized = false;
}
/** Make this graphics context current implementation.
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
bool EGLGraphicsContext::makeCurrentImplementation() {
// cout << "egl context make current" << endl;
// cout << "is initialized?: " << _initialized << endl;
return eglMakeCurrent(eglDpy, eglSurface, eglSurface, eglContext)
== EGL_TRUE;
}
/** Make this graphics context current with specified read context implementation.
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
bool EGLGraphicsContext::makeContextCurrentImplementation(
GraphicsContext* readContext) {
return makeCurrentImplementation();
}
/** Release the graphics context implementation.*/
bool EGLGraphicsContext::releaseContextImplementation() {
// cout << "egl context release" << endl;
return eglMakeCurrent(eglDpy, EGL_NO_SURFACE, EGL_NO_SURFACE,
EGL_NO_CONTEXT) == EGL_TRUE;
}
/** Pure virtual, Bind the graphics context to associated texture implementation.
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
void EGLGraphicsContext::bindPBufferToTextureImplementation(GLenum buffer) {
cout << "bindPBuffer not impl for egl context!!" << endl;
}
/** Swap the front and back buffers implementation.
* Pure virtual - must be implemented by concrete implementations of GraphicsContext. */
void EGLGraphicsContext::swapBuffersImplementation() {
if (!_initialized) {
return;
}
eglSwapBuffers(eglDpy, eglSurface);
}
More information about the osg-users
mailing list