summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@live.com>2013-04-11 09:46:09 -0500
committerMichael Brasser <michael.brasser@live.com>2013-04-12 16:30:15 +0200
commitcf6ac9189c70e76259bc07b90d8c60839e145700 (patch)
tree6ff3628b33f3cb7b9f55df278f9efcbb3a047e4f
parentb3b6fc919d7a31aa5a4cbd9418880f38e94b9b8b (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.cpp26
-rw-r--r--customcontext/context.h2
-rw-r--r--customcontext/renderer/overlaprenderer.cpp31
-rw-r--r--customcontext/renderer/overlaprenderer.h4
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;