LINUX.ORG.RU

QOpenGLFunctions created with non-current context

 , , qopengl


0

0

Пробовал сделать OpenGL-окно в Qt-5.3 по этому руководству, потом, когда ничего не получилось, стал искать, в чём разница с этим вариантом, который работает. Но особой разницы не нашёл - пробовал делать почти пустой format, как там, и наследовать окно от QOpenGLFunctions, также создавал QOpenGLPaintDevice перед тем, как начать что-либо делать с контекстом, и ресайзил его, но всё без толку. Остаётся только бездумный копипаст с удалением ненужных мне методов и проверкой, будет ли всё работать, после каждой операции. Но мне не нравится такой шаманский подход. Может, кто-нибудь увидит здесь, что не сделано перед началом инициализации функций?

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWindow>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
#include "shadermanager.h"

class MainWindow : public QWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWindow *parent = 0);
    ~MainWindow();

private:
    QOpenGLContext *_context;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"

MainWindow::MainWindow(QWindow *parent) :
    QWindow(parent)
{
    resize(1024,768);
    setSurfaceType(OpenGLSurface);

    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
    format.setMajorVersion(4);
    format.setMinorVersion(3);
    format.setSamples(16);
    format.setProfile(QSurfaceFormat::CoreProfile);
    setFormat(format);

    _context = new QOpenGLContext(this);
    _context->setFormat(format);
    _context->create();
    _context->makeCurrent(this);
    _context->functions()->initializeOpenGLFunctions(); //segmentation fault
}

★★★★
Ответ на: комментарий от Rubbiroid

да. Почему-то, правда, только в Core Profile, а Compactibility - 4.4. Может, проблема ещё в оптимусе, но QtCreator запускаю на дискретной видюхе. Выводится, правда, ещё такой warning:

the debug information found in "/usr/lib/x86_64-linux-gnu/dri/r200_dri.so" does not match "/usr/lib/x86_64-linux-gnu/dri/i965_dri.so" (CRC mismatch).

wingear ★★★★
() автор топика
Ответ на: комментарий от Rubbiroid

На Create нормально, как оказалось, false возвращается на MakeCurrent:

if(!_context->create())
    {
        QMessageBox::information(0, "error", "no context created");
    }
if(!_context->makeCurrent(this))
        QMessageBox::information(0, "error", "functions initialization error");

wingear ★★★★
() автор топика
Ответ на: комментарий от wingear

разобрался. Ты создаешь контекст до того, как было создано окно. Ясень пень оно работать не будет. После setSurfaceType(OpenGLSurface); добавь create();

Rubbiroid
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.