diff options
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index 52f48c89a1..c6877369c0 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -900,7 +900,7 @@ Renderer::Renderer(QSGDefaultRenderContext *ctx, QSGRendererInterface::RenderMod // The shader manager is shared between renderers (think for example Item // layers that create a new Renderer each) with the same rendercontext (and // so same QRhi). - m_shaderManager = ctx->findChild<ShaderManager *>(QStringLiteral("__qt_ShaderManager"), Qt::FindDirectChildrenOnly); + m_shaderManager = ctx->findChild<ShaderManager *>(QString(), Qt::FindDirectChildrenOnly); if (!m_shaderManager) { m_shaderManager = new ShaderManager(ctx); m_shaderManager->setObjectName(QStringLiteral("__qt_ShaderManager")); @@ -920,8 +920,7 @@ Renderer::Renderer(QSGDefaultRenderContext *ctx, QSGRendererInterface::RenderMod static void qsg_wipeBuffer(Buffer *buffer) { - if (buffer->buf) - delete buffer->buf; + delete buffer->buf; // The free here is ok because we're in one of two situations. // 1. We're using the upload pool in which case unmap will have set the @@ -954,8 +953,14 @@ Renderer::~Renderer() qsg_wipeBatch(m_batchPool.at(i), separateIndexBuffer); } - for (Node *n : qAsConst(m_nodes)) + for (Node *n : qAsConst(m_nodes)) { + if (n->type() == QSGNode::GeometryNodeType) { + Element *e = n->element(); + if (!e->removed) + m_elementsToDelete.add(e); + } m_nodeAllocator.release(n); + } // Remaining elements... for (int i=0; i<m_elementsToDelete.size(); ++i) @@ -990,6 +995,9 @@ void Renderer::releaseCachedResources() m_dummyTexture = nullptr; m_rhi->releaseCachedResources(); + + m_vertexUploadPool.resize(0); + m_indexUploadPool.resize(0); } void Renderer::invalidateAndRecycleBatch(Batch *b) @@ -1028,8 +1036,11 @@ void Renderer::unmap(Buffer *buffer, bool isIndexBuf) buffer->buf = m_rhi->newBuffer(QRhiBuffer::Immutable, isIndexBuf ? QRhiBuffer::IndexBuffer : QRhiBuffer::VertexBuffer, buffer->size); - if (!buffer->buf->create()) + if (!buffer->buf->create()) { qWarning("Failed to build vertex/index buffer of size %d", buffer->size); + delete buffer->buf; + buffer->buf = nullptr; + } } else { bool needsRebuild = false; if (buffer->buf->size() < buffer->size) { @@ -1043,16 +1054,23 @@ void Renderer::unmap(Buffer *buffer, bool isIndexBuf) buffer->nonDynamicChangeCount = 0; needsRebuild = true; } - if (needsRebuild) - buffer->buf->create(); + if (needsRebuild) { + if (!buffer->buf->create()) { + qWarning("Failed to (re)build vertex/index buffer of size %d", buffer->size); + delete buffer->buf; + buffer->buf = nullptr; + } + } } - if (buffer->buf->type() != QRhiBuffer::Dynamic) { - m_resourceUpdates->uploadStaticBuffer(buffer->buf, - 0, buffer->size, buffer->data); - buffer->nonDynamicChangeCount += 1; - } else { - m_resourceUpdates->updateDynamicBuffer(buffer->buf, 0, buffer->size, - buffer->data); + if (buffer->buf) { + if (buffer->buf->type() != QRhiBuffer::Dynamic) { + m_resourceUpdates->uploadStaticBuffer(buffer->buf, + 0, buffer->size, buffer->data); + buffer->nonDynamicChangeCount += 1; + } else { + m_resourceUpdates->updateDynamicBuffer(buffer->buf, 0, buffer->size, + buffer->data); + } } if (m_visualizer->mode() == Visualizer::VisualizeNothing) buffer->data = nullptr; @@ -3169,6 +3187,9 @@ void Renderer::checkLineWidth(QSGGeometry *g) void Renderer::renderMergedBatch(PreparedRenderBatch *renderBatch, bool depthPostPass) { const Batch *batch = renderBatch->batch; + if (!batch->vbo.buf || !batch->ibo.buf) + return; + Element *e = batch->first; QSGGeometryNode *gn = e->node; QSGGeometry *g = gn->geometry(); @@ -3364,6 +3385,9 @@ bool Renderer::prepareRenderUnmergedBatch(Batch *batch, PreparedRenderBatch *ren void Renderer::renderUnmergedBatch(PreparedRenderBatch *renderBatch, bool depthPostPass) { const Batch *batch = renderBatch->batch; + if (!batch->vbo.buf) + return; + Element *e = batch->first; if (batch->clipState.type & ClipState::StencilClip) @@ -3382,11 +3406,13 @@ void Renderer::renderUnmergedBatch(PreparedRenderBatch *renderBatch, bool depthP const QRhiCommandBuffer::VertexInput vbufBinding(batch->vbo.buf, vOffset); if (g->indexCount()) { - cb->setVertexInput(VERTEX_BUFFER_BINDING, 1, &vbufBinding, - batch->ibo.buf, iOffset, - effectiveIndexSize == sizeof(quint32) ? QRhiCommandBuffer::IndexUInt32 - : QRhiCommandBuffer::IndexUInt16); - cb->drawIndexed(g->indexCount()); + if (batch->ibo.buf) { + cb->setVertexInput(VERTEX_BUFFER_BINDING, 1, &vbufBinding, + batch->ibo.buf, iOffset, + effectiveIndexSize == sizeof(quint32) ? QRhiCommandBuffer::IndexUInt32 + : QRhiCommandBuffer::IndexUInt16); + cb->drawIndexed(g->indexCount()); + } } else { cb->setVertexInput(VERTEX_BUFFER_BINDING, 1, &vbufBinding); cb->draw(g->vertexCount()); |