aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2017-01-08 16:08:34 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2017-01-13 12:24:33 +0000
commitf02e234fc012f4430378bc5205f32914822e4dff (patch)
treed5c7eeb27d2f42ae9003995d57b5c326285042ea /src/quick/items
parente0200d5a72d29a3918bf66290e498f99c0a62a0a (diff)
Reduce state changes with NVPR-backed PathItems
Not setting the matrices and other states again and again for every path in the item saves a little CPU time. Change-Id: Iec9447de4c22cd25343462160bd4a8b9aa44368a Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/quick/items')
-rw-r--r--src/quick/items/qquickpathitemnvprrenderer.cpp37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/quick/items/qquickpathitemnvprrenderer.cpp b/src/quick/items/qquickpathitemnvprrenderer.cpp
index 2338e51ff8..0c4357145a 100644
--- a/src/quick/items/qquickpathitemnvprrenderer.cpp
+++ b/src/quick/items/qquickpathitemnvprrenderer.cpp
@@ -585,6 +585,7 @@ void QQuickPathItemNvprRenderNode::renderOffscreenFill(VisualPathRenderData *d)
return;
f->glViewport(0, 0, itemSize.width(), itemSize.height());
+ f->glDisable(GL_DEPTH_TEST);
f->glClearColor(0, 0, 0, 0);
f->glClearStencil(0);
f->glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
@@ -599,6 +600,7 @@ void QQuickPathItemNvprRenderNode::renderOffscreenFill(VisualPathRenderData *d)
renderFill(d);
d->fallbackFbo->release();
+ f->glEnable(GL_DEPTH_TEST);
f->glViewport(0, 0, rtSize.width(), rtSize.height());
}
@@ -635,6 +637,20 @@ void QQuickPathItemNvprRenderNode::render(const RenderState *state)
const bool stencilClip = state->stencilEnabled();
// when true, the stencil buffer already has a clip path with a ref value of sv
const int sv = state->stencilValue();
+ const bool hasScissor = state->scissorEnabled();
+
+ if (hasScissor) {
+ // scissor rect is already set, just enable scissoring
+ f->glEnable(GL_SCISSOR_TEST);
+ }
+
+ // Depth test against the opaque batches rendered before.
+ f->glEnable(GL_DEPTH_TEST);
+ f->glDepthFunc(GL_LESS);
+ nvpr.pathCoverDepthFunc(GL_LESS);
+ nvpr.pathStencilDepthOffset(-0.05f, -1);
+
+ bool reloadMatrices = true;
for (VisualPathRenderData &d : m_vp) {
updatePath(&d);
@@ -646,21 +662,18 @@ void QQuickPathItemNvprRenderNode::render(const RenderState *state)
// Fall back to a texture when complex clipping is in use and we have
// to fill. Reconciling glStencilFillPath's and the scenegraph's clip
// stencil semantics has not succeeded so far...
+ if (hasScissor)
+ f->glDisable(GL_SCISSOR_TEST);
renderOffscreenFill(&d);
+ reloadMatrices = true;
+ if (hasScissor)
+ f->glEnable(GL_SCISSOR_TEST);
}
- // Depth test against the opaque batches rendered before.
- f->glEnable(GL_DEPTH_TEST);
- f->glDepthFunc(GL_LESS);
- nvpr.pathCoverDepthFunc(GL_LESS);
- nvpr.pathStencilDepthOffset(-0.05f, -1);
-
- nvpr.matrixLoadf(GL_PATH_MODELVIEW_NV, matrix()->constData());
- nvpr.matrixLoadf(GL_PATH_PROJECTION_NV, state->projectionMatrix()->constData());
-
- if (state->scissorEnabled()) {
- // scissor rect is already set, just enable scissoring
- f->glEnable(GL_SCISSOR_TEST);
+ if (reloadMatrices) {
+ reloadMatrices = false;
+ nvpr.matrixLoadf(GL_PATH_MODELVIEW_NV, matrix()->constData());
+ nvpr.matrixLoadf(GL_PATH_PROJECTION_NV, state->projectionMatrix()->constData());
}
// Fill!