Enable shader disk cache in Qt Quick

Change-Id: I14ee97ee75664c5dfcd229a5be2be6294c936b2c
Task-number: QTBUG-55496
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Laszlo Agocs 2016-10-03 14:17:03 +02:00
parent af4516ac86
commit e8801e7c09
10 changed files with 34 additions and 44 deletions

View File

@ -263,8 +263,8 @@ static const char *fragmentShaderSource =
void FbItemRenderer::initProgram() void FbItemRenderer::initProgram()
{ {
m_program.reset(new QOpenGLShaderProgram); m_program.reset(new QOpenGLShaderProgram);
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
m_program->bindAttributeLocation("vertex", 0); m_program->bindAttributeLocation("vertex", 0);
m_program->bindAttributeLocation("normal", 1); m_program->bindAttributeLocation("normal", 1);
m_program->link(); m_program->link();

View File

@ -101,8 +101,8 @@ void CubeRenderer::init(QWindow *w, QOpenGLContext *share)
" gl_FragColor = vec4(texture2D(sampler, v_coord).rgb, 1.0);\n" " gl_FragColor = vec4(texture2D(sampler, v_coord).rgb, 1.0);\n"
"}\n"; "}\n";
m_program = new QOpenGLShaderProgram; m_program = new QOpenGLShaderProgram;
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
m_program->bindAttributeLocation("vertex", 0); m_program->bindAttributeLocation("vertex", 0);
m_program->bindAttributeLocation("coord", 1); m_program->bindAttributeLocation("coord", 1);
m_program->link(); m_program->link();

View File

@ -125,14 +125,14 @@ void SquircleRenderer::paint()
initializeOpenGLFunctions(); initializeOpenGLFunctions();
m_program = new QOpenGLShaderProgram(); m_program = new QOpenGLShaderProgram();
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute highp vec4 vertices;" "attribute highp vec4 vertices;"
"varying highp vec2 coords;" "varying highp vec2 coords;"
"void main() {" "void main() {"
" gl_Position = vertices;" " gl_Position = vertices;"
" coords = vertices.xy;" " coords = vertices.xy;"
"}"); "}");
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment,
"uniform lowp float t;" "uniform lowp float t;"
"varying highp vec2 coords;" "varying highp vec2 coords;"
"void main() {" "void main() {"

View File

@ -86,8 +86,8 @@ void OpenGLRenderNode::init()
" gl_FragColor = col * opacity;\n" " gl_FragColor = col * opacity;\n"
"}\n"; "}\n";
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
m_program->bindAttributeLocation("posAttr", 0); m_program->bindAttributeLocation("posAttr", 0);
m_program->bindAttributeLocation("colAttr", 1); m_program->bindAttributeLocation("colAttr", 1);
m_program->link(); m_program->link();

View File

@ -70,7 +70,6 @@ void LogoRenderer::initialize()
glClearColor(0.1f, 0.1f, 0.2f, 1.0f); glClearColor(0.1f, 0.1f, 0.2f, 1.0f);
QOpenGLShader *vshader1 = new QOpenGLShader(QOpenGLShader::Vertex, &program1);
const char *vsrc1 = const char *vsrc1 =
"attribute highp vec4 vertex;\n" "attribute highp vec4 vertex;\n"
"attribute mediump vec3 normal;\n" "attribute mediump vec3 normal;\n"
@ -85,19 +84,16 @@ void LogoRenderer::initialize()
" color = clamp(color, 0.0, 1.0);\n" " color = clamp(color, 0.0, 1.0);\n"
" gl_Position = matrix * vertex;\n" " gl_Position = matrix * vertex;\n"
"}\n"; "}\n";
vshader1->compileSourceCode(vsrc1);
QOpenGLShader *fshader1 = new QOpenGLShader(QOpenGLShader::Fragment, &program1);
const char *fsrc1 = const char *fsrc1 =
"varying mediump vec4 color;\n" "varying mediump vec4 color;\n"
"void main(void)\n" "void main(void)\n"
"{\n" "{\n"
" gl_FragColor = color;\n" " gl_FragColor = color;\n"
"}\n"; "}\n";
fshader1->compileSourceCode(fsrc1);
program1.addShader(vshader1); program1.addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vsrc1);
program1.addShader(fshader1); program1.addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fsrc1);
program1.link(); program1.link();
vertexAttr1 = program1.attributeLocation("vertex"); vertexAttr1 = program1.attributeLocation("vertex");

View File

@ -260,11 +260,11 @@ void QQuickCustomMaterialShader::compile()
m_log.clear(); m_log.clear();
m_compiled = true; m_compiled = true;
if (!program()->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader())) { if (!program()->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader())) {
m_log += QLatin1String("*** Vertex shader ***\n") + program()->log(); m_log += QLatin1String("*** Vertex shader ***\n") + program()->log();
m_compiled = false; m_compiled = false;
} }
if (!program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader())) { if (!program()->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader())) {
m_log += QLatin1String("*** Fragment shader ***\n") + program()->log(); m_log += QLatin1String("*** Fragment shader ***\n") + program()->log();
m_compiled = false; m_compiled = false;
} }

View File

@ -364,8 +364,8 @@ void QSGMaterialShader::compile()
{ {
Q_ASSERT_X(!m_program.isLinked(), "QSGSMaterialShader::compile()", "Compile called multiple times!"); Q_ASSERT_X(!m_program.isLinked(), "QSGSMaterialShader::compile()", "Compile called multiple times!");
program()->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader()); program()->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader());
program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader()); program()->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader());
char const *const *attr = attributeNames(); char const *const *attr = attributeNames();
#ifndef QT_NO_DEBUG #ifndef QT_NO_DEBUG

View File

@ -119,19 +119,13 @@ private:
const QString source = QLatin1String(qopenglslMainWithTexCoordsVertexShader) const QString source = QLatin1String(qopenglslMainWithTexCoordsVertexShader)
+ QLatin1String(qopenglslUntransformedPositionVertexShader); + QLatin1String(qopenglslUntransformedPositionVertexShader);
QOpenGLShader *vertexShader = new QOpenGLShader(QOpenGLShader::Vertex, m_blitProgram); m_blitProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, source);
vertexShader->compileSourceCode(source);
m_blitProgram->addShader(vertexShader);
} }
{ {
const QString source = QLatin1String(qopenglslMainFragmentShader) const QString source = QLatin1String(qopenglslMainFragmentShader)
+ QLatin1String(qopenglslImageSrcFragmentShader); + QLatin1String(qopenglslImageSrcFragmentShader);
QOpenGLShader *fragmentShader = new QOpenGLShader(QOpenGLShader::Fragment, m_blitProgram); m_blitProgram->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, source);
fragmentShader->compileSourceCode(source);
m_blitProgram->addShader(fragmentShader);
} }
m_blitProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR); m_blitProgram->bindAttributeLocation("vertexCoordsArray", QT_VERTEX_COORDS_ATTR);
m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR); m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);

View File

@ -262,8 +262,8 @@ void QSGDefaultRenderContext::compileShader(QSGMaterialShader *shader, QSGMateri
"QSGRenderContext::compile()", "QSGRenderContext::compile()",
"materials with custom compile step cannot have custom vertex/fragment code"); "materials with custom compile step cannot have custom vertex/fragment code");
QOpenGLShaderProgram *p = shader->program(); QOpenGLShaderProgram *p = shader->program();
p->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexCode ? vertexCode : shader->vertexShader()); p->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexCode ? vertexCode : shader->vertexShader());
p->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentCode ? fragmentCode : shader->fragmentShader()); p->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentCode ? fragmentCode : shader->fragmentShader());
p->link(); p->link();
if (!p->isLinked()) if (!p->isLinked())
qWarning() << "shader compilation failed:" << endl << p->log(); qWarning() << "shader compilation failed:" << endl << p->log();

View File

@ -217,11 +217,11 @@ void QSGShaderSourceBuilder::initializeProgramFromFiles(QOpenGLShaderProgram *pr
QSGShaderSourceBuilder builder; QSGShaderSourceBuilder builder;
builder.appendSourceFile(vertexShader); builder.appendSourceFile(vertexShader);
program->addShaderFromSourceCode(QOpenGLShader::Vertex, builder.source()); program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, builder.source());
builder.clear(); builder.clear();
builder.appendSourceFile(fragmentShader); builder.appendSourceFile(fragmentShader);
program->addShaderFromSourceCode(QOpenGLShader::Fragment, builder.source()); program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, builder.source());
} }
QByteArray QSGShaderSourceBuilder::source() const QByteArray QSGShaderSourceBuilder::source() const