diff options
author | Gunnar Sletta <gunnar.sletta@digia.com> | 2013-10-30 14:09:18 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-30 15:18:33 +0100 |
commit | 4a7f1326e3d342148a4a9147505a4d8d531b4a06 (patch) | |
tree | 7194f7b696b264e319c3fd3671fc074a7cc25270 /src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | |
parent | 388fc07cf28417f6e755ad8a105a71aa55ab13c8 (diff) |
Work around Nouveau driver bugs
Change-Id: I25311a2bd88f41087352e0a43ba505f4e27b7e85
Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
Diffstat (limited to 'src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index 8514203f57..7a62dccc0f 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -1889,7 +1889,14 @@ void Renderer::renderMergedBatch(const Batch *batch) updateClip(gn->clipList(), batch); glBindBuffer(GL_ARRAY_BUFFER, batch->vbo.id); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vbo.id); + + char *indexBase = 0; + if (m_context->hasBrokenIndexBufferObjects()) { + indexBase = batch->vbo.data; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } else { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vbo.id); + } QSGMaterial *material = gn->activeMaterial(); @@ -1924,7 +1931,7 @@ void Renderer::renderMergedBatch(const Batch *batch) } glVertexAttribPointer(sms->pos_order, 1, GL_FLOAT, false, 0, (void *) (qintptr) (draw.zorders)); - glDrawElements(g->drawingMode(), draw.indexCount, GL_UNSIGNED_SHORT, (void *) (qintptr) (draw.indices)); + glDrawElements(g->drawingMode(), draw.indexCount, GL_UNSIGNED_SHORT, (void *) (qintptr) (indexBase + draw.indices)); } } @@ -1957,8 +1964,15 @@ void Renderer::renderUnmergedBatch(const Batch *batch) updateClip(gn->clipList(), batch); glBindBuffer(GL_ARRAY_BUFFER, batch->vbo.id); - if (batch->indexCount) - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vbo.id); + char *indexBase = 0; + if (batch->indexCount) { + if (m_context->hasBrokenIndexBufferObjects()) { + indexBase = batch->vbo.data; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } else { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vbo.id); + } + } // We always have dirty matrix as all batches are at a unique z range. QSGMaterialShader::RenderState::DirtyStates dirty = QSGMaterialShader::RenderState::DirtyMatrix; @@ -1977,7 +1991,7 @@ void Renderer::renderUnmergedBatch(const Batch *batch) } int vOffset = 0; - int iOffset = batch->vertexCount * gn->geometry()->sizeOfVertex(); + char *iOffset = indexBase + batch->vertexCount * gn->geometry()->sizeOfVertex(); QMatrix4x4 rootMatrix = batch->root ? matrixForRoot(batch->root) : QMatrix4x4(); @@ -2008,7 +2022,7 @@ void Renderer::renderUnmergedBatch(const Batch *batch) } if (g->indexCount()) - glDrawElements(g->drawingMode(), g->indexCount(), g->indexType(), (void *) (qintptr) iOffset); + glDrawElements(g->drawingMode(), g->indexCount(), g->indexType(), iOffset); else glDrawArrays(g->drawingMode(), 0, g->vertexCount()); |