void VideoShader::compile(QOpenGLShaderProgram *shaderProgram) { Q_ASSERT_X(!shaderProgram->isLinked(), "VideoShader::compile()", "Compile called multiple times!"); shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader()); shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader()); int maxVertexAttribs = 0; glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs); char const *const *attr = attributeNames(); for (int i = 0; attr[i]; ++i) { if (i >= maxVertexAttribs) { qFatal("List of attribute names is either too long or not null-terminated.\n" "Maximum number of attributes on this hardware is %i.\n" "Vertex shader:\n%s\n" "Fragment shader:\n%s\n", maxVertexAttribs, vertexShader(), fragmentShader()); } // why must min location == 0? if (*attr[i]) shaderProgram->bindAttributeLocation(attr[i], i); } if (!shaderProgram->link()) { qWarning("QSGMaterialShader: Shader compilation failed:"); qWarning() << shaderProgram->log(); } }
void QSGMaterialShader::compile() { Q_ASSERT_X(!m_program.isLinked(), "QSGSMaterialShader::compile()", "Compile called multiple times!"); program()->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader()); program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader()); char const *const *attr = attributeNames(); #ifndef QT_NO_DEBUG int maxVertexAttribs = 0; QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); funcs->glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs); for (int i = 0; attr[i]; ++i) { if (i >= maxVertexAttribs) { qFatal("List of attribute names is either too long or not null-terminated.\n" "Maximum number of attributes on this hardware is %i.\n" "Vertex shader:\n%s\n" "Fragment shader:\n%s\n", maxVertexAttribs, vertexShader(), fragmentShader()); } if (*attr[i]) program()->bindAttributeLocation(attr[i], i); } #else for (int i = 0; attr[i]; ++i) { if (*attr[i]) program()->bindAttributeLocation(attr[i], i); } #endif if (!program()->link()) { qWarning("QSGMaterialShader: Shader compilation failed:"); qWarning() << program()->log(); } }