2 QOpenGLWidget shared context
-
Hi,
I would like to solve problem that I still deal with.. thats render 2 QOpenGLWidgets at same time in different top level windows with shared shader programs etc.
My first attempt was to use one context, wasnt working.
The question: Is it even possible currently with QOpenGLWidget? Or I have to go to older QGLWidget? Or use something else?
testAttribute for Qt::AA_ShareOpenGLContexts returns true so there is not problem with sharing
even QOpenGLContext::areSharing returns true. So there is something I missing or I dont know. Not using threads.If you need anything more to debug this problem tell me.
Debug output:
@MapExplorer true true
true
QOpenGLShaderProgram::bind: program is not valid in the current context.
MapExlorer paintGL ends
MapExplorer true true
true
QOpenGLShaderProgram::bind: program is not valid in the current context.
MapExlorer paintGL ends
QOpenGLFramebufferObject::bind() called from incompatible context
QOpenGLShaderProgram::bind: program is not valid in the current context.
QOpenGLShaderProgram::bind: program is not valid in the current context.
QOpenGLShaderProgram::bind: program is not valid in the current context.
QOpenGLFramebufferObject::bind() called from incompatible context
QOpenGLFramebufferObject::bind() called from incompatible context@MapView initializeGL:
@void MapView::initializeGL()
{
this->makeCurrent();initializeOpenGLFunctions(); // Initialize World world->initialize(this->context(), size(), worldCoords); // Initialize camera shader camera->initialize(); // Enable depth testing glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDepthFunc(GL_LEQUAL); // just testing new depth func glClearColor(0.65f, 0.77f, 1.0f, 1.0f);
}@
MapView paintGL:
@void MapView::paintGL()
{
this->makeCurrent();glDrawBuffer(GL_FRONT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); world->draw(...);
}@
MapExplorer initializeGL:
@void MapExplorer::initializeGL()
{
this->makeCurrent();QOpenGLContext* _context = _mapView->context(); _context->setShareContext(this->context()); _context->create(); this->context()->create(); this->makeCurrent(); initializeOpenGLFunctions(); // Enable depth testing glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDepthFunc(GL_LEQUAL); // just testing new depth func glClearColor(0.65f, 0.77f, 1.0f, 1.0f);
}@
MapExplorer paintGL:
@void MapExplorer::paintGL()
{
this->makeCurrent();qDebug() << "MapExplorer" << QOpenGLContext::areSharing(this->context(), _mapView->context()) << (QOpenGLContext::currentContext() == this->context()); QOpenGLShaderProgram* shader = world->getTerrainShader(); qDebug() << shader->create(); shader->bind(); // debug error "QOpenGLShaderProgram::bind: program is not valid in the current context." // We need the viewport size to calculate tessellation levels and the geometry shader also needs the viewport matrix shader->setUniformValue("viewportSize", viewportSize); shader->setUniformValue("viewportMatrix", viewportMatrix); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); qDebug() << "MapExlorer paintGL ends"; //world->drawExplorerView(...);
}@
Thanks.
Regards, glararan.