aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@jollamobile.com>2014-01-21 15:57:19 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-22 12:24:18 +0100
commitabc1cb32727a94ddac07020759c3c97382477cf9 (patch)
tree3a37b2e78d69c8a02e6a8c6d29d1799dc19c13e4 /src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
parent43d39e1d5899fb5b12a7afc73c088ca7faa3a89d (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.cpp140
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 = &pm;
- 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 = &pm;
+ 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