LINUX.ORG.RU

невидия сегфолтится(потому что у неё есть кэш шейдеров)

 


0

1

Короче,

Qt5.5,

OpenGL version string: 3.3.0 NVIDIA 340.102

OpenGL shading language version string: 3.30 NVIDIA via Cg compiler

проект с нуля с содержимым mainwindow.cpp ниже, крэшит компилятор шейдеров(шейдер просто затычка).

Вопрос, что делать то? Ведь десктоп работает

$ sauerbraten 
Using home directory: /home/user/.sauerbraten/
Adding package directory: /usr/share/games/sauerbraten/
init: sdl
Library: SDL 1.2.15
init: net
init: game
init: video: mode
init: video: misc
init: gl
Renderer: GeForce 210/PCIe/SSE2 (NVIDIA Corporation)
Driver: 3.3.0 NVIDIA 340.102
Rendering using the OpenGL GLSL shader path.

Upd: эта скотина насрала чем-то нехорошим в ~/.nv/blablabla однократно показаный фак-ю починил кэш для конкретного процесса, и далее он стал работать даже после возврата к крэшащимся шейдерам.

стектрейс:

(gdb) bt
#0  0xb4078280 in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#1  0xb4078323 in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#2  0xb40cb9b7 in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#3  0xb4005ab5 in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#4  0xb400a30d in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#5  0xb4ca54eb in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#6  0xb4ca7706 in ?? () from /usr/lib/nvidia-340/libnvidia-glcore.so.340.102
#7  0xb767206f in ?? () from /usr/lib/i386-linux-gnu/sse2/libQt5Gui.so.5
#8  0xb7672e25 in QOpenGLShader::compileSourceCode(char const*) () from /usr/lib/i386-linux-gnu/sse2/libQt5Gui.so.5
#9  0x0804a883 in MainWindow::MainWindow (this=0xbfffeff4, parent=0x0) at ../nvtest/mainwindow.cpp:43
#10 0x0804a380 in main (argc=1, argv=0xbffff0d4) at ../nvtest/main.cpp:7

#include "mainwindow.h"
#include <QOffscreenSurface>
#include <QOpenGLContext>
#include <QOpenGLShaderProgram>
#include <QDebug>
#include <stdexcept>
#include <QOpenGLFunctions_3_3_Core>

typedef QOpenGLFunctions_3_3_Core GLFuncs;

static const char * __shader_vertex =
        "#version 150\n"
        "void main{}";
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto mOffscreen = new QOffscreenSurface();
    auto fmt = mOffscreen->format();
    fmt.setVersion(2,1);
    fmt.setRenderableType(QSurfaceFormat::OpenGL);
    fmt.setProfile(QSurfaceFormat::CoreProfile);
    mOffscreen->setFormat(fmt);
    mOffscreen->create();
    if (!mOffscreen->isValid())
        throw std::runtime_error("failed to create offscreen surface");
    auto mContext = new QOpenGLContext();
    mContext->setFormat(mOffscreen->format());
    if (!mContext->create())
        throw std::runtime_error("failed to create opengl context");
    qDebug()<<mContext->format();
    if (!mContext->makeCurrent(mOffscreen))
        throw std::runtime_error("failed to make opengl context current");
    qDebug()<<"A!";
    QOpenGLShaderProgram * p = new QOpenGLShaderProgram();
    qDebug()<<"B!";
    p->addShaderFromSourceCode(QOpenGLShader::Vertex,
                               "#version 150\n"
                               "void main() {\n"
                               "}\n");
    qDebug()<<"C!";

    QOpenGLShader xxx(QOpenGLShader::Vertex);
    xxx.compileSourceCode("void main{}");
    qDebug()<<"D!";

    auto f = mContext->versionFunctions<GLFuncs>();
    if (!f->initializeOpenGLFunctions())
        throw std::runtime_error("failed to make initialize GL functions");
    //mContext->doneCurrent();
    qDebug()<<"E!";

    qDebug()<<__FILE__<<":"<<__LINE__<<"!";
    GLuint s = f->glCreateShader(GL_VERTEX_SHADER);
    qDebug()<<__FILE__<<":"<<__LINE__<<"source";
    const GLchar * ps = (const GLchar*)__shader_vertex;
    GLint          psi = strlen(__shader_vertex)-3;
    f->glShaderSource(s, 1, &ps, &psi);
    qDebug()<<__FILE__<<":"<<__LINE__<<"compile";
    f->glCompileShader(s);
    qDebug()<<__FILE__<<":"<<__LINE__<<"?";
}

MainWindow::~MainWindow()
{
}

Что делать, говоришь? Смотреть знаменитое видео про палец Торвальдса, до просветления.

anonymous ()

Qt сам собирал, или дистрибутивный? Если сам, используй системный XCB. Qt, собранный с параметром -qt-xcb, у меня работает нестабильно с рядом программ.

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

а ни при чем. у меня еще и гдб из исходников ругался на питон пока писал, взял гдб системный.

ckotinko ☆☆☆ ()

на «сайтовом» последнем qt тоже падает ?
этот код у меня не падает 5.10.0

x905 ★★★★★ ()
Последнее исправление: x905 (всего исправлений: 1)
void main{}

Краш компилятора это, конечно же, баг. Но всё-таки, ты уверен, что это корректный код? Может, стоило void main(){} писать?

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

ты щас удивишься, но!!!!!!

написал туда fuck you nvidia и оно заработало. вот реально,

QSurfaceFormat(version 3.3, options QFlags(), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 0, stencilBufferSize 0, samples -1, swapBehavior 0, swapInterval 1, profile  1)
QSurfaceFormat(version 3.3, options QFlags(), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 0, stencilBufferSize 0, samples -1, swapBehavior 0, swapInterval 1, profile  1)
A!
B!
C!
QOpenGLShader::compile(Vertex): 0(2) : error C0000: syntax error, unexpected '!', expecting "::" at token "!"

*** Problematic Vertex shader source code ***
#define lowp
#define mediump
#define highp
#line 1
fuck you nvidia!
***
D!
E!
../nvtest/mainwindow.cpp : 54 !
../nvtest/mainwindow.cpp : 56 source
../nvtest/mainwindow.cpp : 60 compile
../nvtest/mainwindow.cpp : 62 ?

Работает же

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

но настоящая прога по прежнему крэшится. я хз в чем дело.

реально. может письмо в нвидию написать с факом? или какие-то особые ругательства надо подавать на вход для инициализации - ну там по казахски наюх послать.

ckotinko ☆☆☆ ()
Ответ на: комментарий от ckotinko

ты щас удивишься

Ты оказался прав, я удивлён. Но немного не по тому поводу.

Ты поменял входные данные, и баг больше не вопроизводится. Удивительно, что для тебя это удивительно. Ты точно программированием занимаешься?

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

короче, я обновил пост. у невидии есть оказывается кэш шейдеров и она падла просто туда гадит чем-то а потом падает.

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