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.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.