diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-01-21 15:57:19 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-22 12:24:18 +0100 |
commit | abc1cb32727a94ddac07020759c3c97382477cf9 (patch) | |
tree | 3a37b2e78d69c8a02e6a8c6d29d1799dc19c13e4 /src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | |
parent | 43d39e1d5899fb5b12a7afc73c088ca7faa3a89d (diff) |
Revert QSGRenderNode to the old "in context" behavior
There is already a lot of code out there that makes use
of the rendernode hook and some of it is not capable
of dealing with the render target being something other
than 0. (Mozilla in this case).
By forcing everything into the "alpha" code path, the
hit on the renderer should be fairly minimal as long as
render nodes are kept to a minimum, so reverting back
to the ugly old behavior is acceptable.
The API is still internal and highly discouraged.
Change-Id: Ie35484f52da6b0420257c95710fdda07a2be2c23
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 140 |
1 files changed, 55 insertions, 85 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index a10191ec16..52a293871c 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -605,11 +605,6 @@ void Element::computeBounds() boundsOutsideFloatRange = bounds.isOutsideFloatRange(); } -RenderNodeElement::~RenderNodeElement() -{ - delete fbo; -} - bool Batch::isMaterialCompatible(Element *e) const { // If material has changed between opaque and translucent, it is not compatible @@ -768,6 +763,8 @@ Renderer::Renderer(QSGRenderContext *ctx) , m_zRange(0) , m_currentMaterial(0) , m_currentShader(0) + , m_currentClip(0) + , m_currentClipType(NoClip) , m_vao(0) { setNodeUpdater(new Updater(this)); @@ -1014,6 +1011,8 @@ void Renderer::nodeWasAdded(QSGNode *node, Node *shadowParent) snode->data = e; Q_ASSERT(!m_renderNodeElements.contains(static_cast<QSGRenderNode *>(node))); m_renderNodeElements.insert(e->renderNode, e); + m_useDepthBuffer = false; + m_rebuild |= FullRebuild; } QSGNODE_TRAVERSE(node) @@ -1919,10 +1918,10 @@ void Renderer::updateClip(const QSGClipNode *clipList, const Batch *batch) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if (batch->isOpaque) glDisable(GL_DEPTH_TEST); - ClipType type = updateStencilClip(m_currentClip); + m_currentClipType = updateStencilClip(m_currentClip); if (batch->isOpaque) { glEnable(GL_DEPTH_TEST); - if (type & StencilClip) + if (m_currentClipType & StencilClip) glDepthMask(true); } } @@ -2198,11 +2197,6 @@ void Renderer::renderBatches() << " -> Alpha: " << qsg_countNodesInBatches(m_alphaBatches) << " nodes in " << m_alphaBatches.size() << " batches..."; } - for (QHash<QSGRenderNode *, RenderNodeElement *>::const_iterator it = m_renderNodeElements.constBegin(); - it != m_renderNodeElements.constEnd(); ++it) { - prepareRenderNode(it.value()); - } - QRect r = viewportRect(); glViewport(r.x(), deviceRect().bottom() - r.bottom(), r.width(), r.height()); glClearColor(clearColor().redF(), clearColor().greenF(), clearColor().blueF(), clearColor().alphaF()); @@ -2269,7 +2263,6 @@ void Renderer::renderBatches() updateStencilClip(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - } void Renderer::deleteRemovedElements() @@ -2421,33 +2414,15 @@ void Renderer::render() m_vao->release(); } -void Renderer::prepareRenderNode(RenderNodeElement *e) +void Renderer::renderRenderNode(Batch *batch) { - if (e->fbo && e->fbo->size() != deviceRect().size()) { - delete e->fbo; - e->fbo = 0; - } - - if (!e->fbo) - e->fbo = new QOpenGLFramebufferObject(deviceRect().size(), QOpenGLFramebufferObject::CombinedDepthStencil); - e->fbo->bind(); - - glDisable(GL_STENCIL_TEST); - glDisable(GL_SCISSOR_TEST); - glDisable(GL_DEPTH_TEST); - glDisable(GL_BLEND); + if (Q_UNLIKELY(debug_render)) + qDebug() << " -" << batch << "rendernode"; - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + Q_ASSERT(batch->first->isRenderNode); + RenderNodeElement *e = (RenderNodeElement *) batch->first; - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); - - QSGRenderNode::RenderState state; - QMatrix4x4 pm = projectionMatrix(); - state.projectionMatrix = ± - state.scissorEnabled = false; - state.stencilEnabled = false; + setActiveShader(0, 0); QSGNode *clip = e->renderNode->parent(); e->renderNode->m_clip_list = 0; @@ -2459,6 +2434,16 @@ void Renderer::prepareRenderNode(RenderNodeElement *e) clip = clip->parent(); } + updateClip(e->renderNode->m_clip_list, batch); + + QSGRenderNode::RenderState state; + QMatrix4x4 pm = projectionMatrix(); + state.projectionMatrix = ± + state.scissorEnabled = m_currentClipType & ScissorClip; + state.stencilEnabled = m_currentClipType & StencilClip; + state.scissorRect = m_current_scissor_rect; + state.stencilValue = m_current_stencil_value; + QSGNode *xform = e->renderNode->parent(); QMatrix4x4 matrix; while (xform != rootNode()) { @@ -2480,66 +2465,51 @@ void Renderer::prepareRenderNode(RenderNodeElement *e) opacity = opacity->parent(); } + glDisable(GL_STENCIL_TEST); + glDisable(GL_SCISSOR_TEST); + glDisable(GL_DEPTH_TEST); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + e->renderNode->render(state); e->renderNode->m_matrix = 0; + e->renderNode->m_clip_list = 0; - bindable()->bind(); -} - -void Renderer::renderRenderNode(Batch *batch) -{ - updateStencilClip(0); - m_currentClip = 0; - - setActiveShader(0, 0); - - if (!m_shaderManager->blitProgram) { - m_shaderManager->blitProgram = new QOpenGLShaderProgram(); - - QSGShaderSourceBuilder::initializeProgramFromFiles( - m_shaderManager->blitProgram, - QStringLiteral(":/scenegraph/shaders/rendernode.vert"), - QStringLiteral(":/scenegraph/shaders/rendernode.frag")); - m_shaderManager->blitProgram->bindAttributeLocation("av", 0); - m_shaderManager->blitProgram->bindAttributeLocation("at", 1); - m_shaderManager->blitProgram->link(); - - Q_ASSERT(m_shaderManager->blitProgram->isLinked()); + QSGRenderNode::StateFlags changes = e->renderNode->changedStates(); + if (changes & QSGRenderNode::ViewportState) { + QRect r = viewportRect(); + glViewport(r.x(), deviceRect().bottom() - r.bottom(), r.width(), r.height()); } - RenderNodeElement *e = static_cast<RenderNodeElement *>(batch->first); - glBindTexture(GL_TEXTURE_2D, e->fbo->texture()); - - m_shaderManager->blitProgram->bind(); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + if (changes & QSGRenderNode::StencilState) { + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glStencilMask(0xff); + glDisable(GL_STENCIL_TEST); + } - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); + if (changes & (QSGRenderNode::StencilState | QSGRenderNode::ScissorState)) { + glDisable(GL_SCISSOR_TEST); + m_currentClip = 0; + m_currentClipType = NoClip; + } - float z = 1.0f - e->order * m_zRange; + if (changes & QSGRenderNode::DepthState) + glDisable(GL_DEPTH_TEST); - float av[] = { -1, -1, z, - 1, -1, z, - -1, 1, z, - 1, 1, z }; - float at[] = { 0, 0, - 1, 0, - 0, 1, - 1, 1 }; + if (changes & QSGRenderNode::ColorState) + bindable()->reactivate(); - glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, av); - glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, at); + if (changes & QSGRenderNode::BlendState) { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + if (changes & QSGRenderNode::CullState) { + glFrontFace(isMirrored() ? GL_CW : GL_CCW); + glDisable(GL_CULL_FACE); + } - glDisableVertexAttribArray(0); - glDisableVertexAttribArray(1); - glBindTexture(GL_TEXTURE_2D, 0); } QT_END_NAMESPACE |