Короче,
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()
{
}