diff options
author | Michael Brasser <michael.brasser@live.com> | 2013-04-11 09:46:09 -0500 |
---|---|---|
committer | Michael Brasser <michael.brasser@live.com> | 2013-04-12 16:30:15 +0200 |
commit | cf6ac9189c70e76259bc07b90d8c60839e145700 (patch) | |
tree | 6ff3628b33f3cb7b9f55df278f9efcbb3a047e4f | |
parent | b3b6fc919d7a31aa5a4cbd9418880f38e94b9b8b (diff) |
Enable preloading/sharing of the overlap renderer's clip program.
This allows the cost to be payed once at startup, rather than
on the first frame of each renderer.
Change-Id: Ibcd0e2a3f15bf121ba139a7ac19b0df490116b0c
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
-rw-r--r-- | customcontext/context.cpp | 26 | ||||
-rw-r--r-- | customcontext/context.h | 2 | ||||
-rw-r--r-- | customcontext/renderer/overlaprenderer.cpp | 31 | ||||
-rw-r--r-- | customcontext/renderer/overlaprenderer.h | 4 |
4 files changed, 40 insertions, 23 deletions
diff --git a/customcontext/context.cpp b/customcontext/context.cpp index ba03e06..41de804 100644 --- a/customcontext/context.cpp +++ b/customcontext/context.cpp @@ -231,6 +231,24 @@ void Context::initialize(QOpenGLContext *context) } #endif +#ifdef CUSTOMCONTEXT_OVERLAPRENDERER + if (m_overlapRenderer) { + m_clipProgram.addShaderFromSourceCode(QOpenGLShader::Vertex, + "attribute highp vec4 vCoord; \n" + "uniform highp mat4 matrix; \n" + "void main() { \n" + " gl_Position = matrix * vCoord; \n" + "}"); + m_clipProgram.addShaderFromSourceCode(QOpenGLShader::Fragment, + "void main() { \n" + " gl_FragColor = vec4(0.81, 0.83, 0.12, 1.0); \n" // Trolltech green ftw! + "}"); + m_clipProgram.bindAttributeLocation("vCoord", 0); + m_clipProgram.link(); + m_clipMatrixID = m_clipProgram.uniformLocation("matrix"); + } +#endif + #ifdef CUSTOMCONTEXT_DEBUG qDebug("CustomContext: initialized.."); #ifdef CUSTOMCONTEXT_MATERIALPRELOAD @@ -303,8 +321,12 @@ QSGTexture *Context::createTexture(const QImage &image) const QSGRenderer *Context::createRenderer() { #ifdef CUSTOMCONTEXT_OVERLAPRENDERER - if (m_overlapRenderer) - return new OverlapRenderer::Renderer(this); + if (m_overlapRenderer) { + OverlapRenderer::Renderer *renderer = + new OverlapRenderer::Renderer(this); + renderer->setClipProgram(&m_clipProgram, m_clipMatrixID); + return renderer; + } #endif return QSGContext::createRenderer(); } diff --git a/customcontext/context.h b/customcontext/context.h index 53bfb6f..72f2b87 100644 --- a/customcontext/context.h +++ b/customcontext/context.h @@ -97,6 +97,8 @@ private: #ifdef CUSTOMCONTEXT_OVERLAPRENDERER bool m_overlapRenderer; + QOpenGLShaderProgram m_clipProgram; + int m_clipMatrixID; #endif #ifdef CUSTOMCONTEXT_ANIMATIONDRIVER diff --git a/customcontext/renderer/overlaprenderer.cpp b/customcontext/renderer/overlaprenderer.cpp index c6f1a3e..b1d04e7 100644 --- a/customcontext/renderer/overlaprenderer.cpp +++ b/customcontext/renderer/overlaprenderer.cpp @@ -847,26 +847,16 @@ void Renderer::nodeChanged(QSGNode *node, QSGNode::DirtyState flags) } } +void Renderer::setClipProgram(QOpenGLShaderProgram *program, int matrixID) +{ + clipProgram = program; + clipMatrixID = matrixID; +} + void Renderer::render() { PROFILE_BEGINFRAME(); - if (!clipProgram.isLinked()) { - clipProgram.addShaderFromSourceCode(QOpenGLShader::Vertex, - "attribute highp vec4 vCoord; \n" - "uniform highp mat4 matrix; \n" - "void main() { \n" - " gl_Position = matrix * vCoord; \n" - "}"); - clipProgram.addShaderFromSourceCode(QOpenGLShader::Fragment, - "void main() { \n" - " gl_FragColor = vec4(0.81, 0.83, 0.12, 1.0); \n" // Trolltech green ftw! - "}"); - clipProgram.bindAttributeLocation("vCoord", 0); - clipProgram.link(); - clipMatrixID = clipProgram.uniformLocation("matrix"); - } - batchConfigs.clear(); minBatchConfig = 0; @@ -1641,8 +1631,9 @@ void Renderer::drawBatches() glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); - clipProgram.bind(); - clipProgram.enableAttributeArray(0); + Q_ASSERT(clipProgram); + clipProgram->bind(); + clipProgram->enableAttributeArray(0); currentClipType |= StencilClip; } @@ -1655,7 +1646,7 @@ void Renderer::drawBatches() const QSGGeometry::Attribute *a = g->attributes(); glVertexAttribPointer(0, a->tupleSize, a->type, GL_FALSE, g->sizeOfVertex(), g->vertexData()); - clipProgram.setUniformValue(clipMatrixID, m); + clipProgram->setUniformValue(clipMatrixID, m); if (g->indexCount()) glDrawElements(g->drawingMode(), g->indexCount(), g->indexType(), g->indexData()); else @@ -1669,7 +1660,7 @@ void Renderer::drawBatches() clip = clip->clipList(); if (currentClipType & StencilClip) { - clipProgram.disableAttributeArray(0); + clipProgram->disableAttributeArray(0); glStencilFunc(GL_EQUAL, m_current_stencil_value, 0xff); // stencil test, ref, test mask glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // stencil fail, z fail, z pass glStencilMask(0); // write mask diff --git a/customcontext/renderer/overlaprenderer.h b/customcontext/renderer/overlaprenderer.h index 8e089a7..9cd7567 100644 --- a/customcontext/renderer/overlaprenderer.h +++ b/customcontext/renderer/overlaprenderer.h @@ -332,6 +332,8 @@ public: void render(); void nodeChanged(QSGNode *node, QSGNode::DirtyState flags); + void setClipProgram(QOpenGLShaderProgram *program, int matrixID); + private: void buildRenderOrderList(QSGNode *node); @@ -359,7 +361,7 @@ private: std::vector<VertexFormat *> m_vertexFormats; std::vector<RenderBatch> m_batches; - QOpenGLShaderProgram clipProgram; + QOpenGLShaderProgram *clipProgram; int clipMatrixID; int minBatchConfig; |