diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-06-10 14:03:57 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@theqtcompany.com> | 2015-06-11 07:54:40 +0000 |
commit | 611e2e940f54210346330657077038324deabd02 (patch) | |
tree | 0a4d87d008548f993d95bdbd27455545a3cc5873 | |
parent | 5b5282c95cbdb69fffba1679ad015b2ab140b3fc (diff) |
Fix getting GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
We need to return the canvas side resource id of the buffer matching
the id we get from OpenGL.
Change-Id: I99631013804d706794a8f477e0f57b354eba489d
Task-number: QTBUG-46532
Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com>
Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
-rw-r--r-- | src/imports/qtcanvas3d/canvasrenderer.cpp | 4 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/glcommandqueue.cpp | 17 | ||||
-rw-r--r-- | src/imports/qtcanvas3d/glcommandqueue_p.h | 1 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/imports/qtcanvas3d/canvasrenderer.cpp b/src/imports/qtcanvas3d/canvasrenderer.cpp index 3c1bad6..cd3d716 100644 --- a/src/imports/qtcanvas3d/canvasrenderer.cpp +++ b/src/imports/qtcanvas3d/canvasrenderer.cpp @@ -1512,6 +1512,10 @@ void CanvasRenderer::executeSyncCommand(GlSyncCommand &command) case CanvasGlCommandQueue::glGetVertexAttribiv: { GLint *retVal = reinterpret_cast<GLint *>(command.returnValue); glGetVertexAttribiv(GLuint(command.i1), GLenum(command.i2), retVal); + if (command.i2 == GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) { + // We need to return the buffer id of the context side, rather than the GL id. + *retVal = m_commandQueue.getCanvasId(*retVal, CanvasGlCommandQueue::glGenBuffers); + } break; } case CanvasGlCommandQueue::glGetString: { diff --git a/src/imports/qtcanvas3d/glcommandqueue.cpp b/src/imports/qtcanvas3d/glcommandqueue.cpp index 0cb51d7..7e2d1bd 100644 --- a/src/imports/qtcanvas3d/glcommandqueue.cpp +++ b/src/imports/qtcanvas3d/glcommandqueue.cpp @@ -261,6 +261,23 @@ GLuint CanvasGlCommandQueue::getGlId(GLint id) return m_resourceIdMap.value(id).glId; } +GLint CanvasGlCommandQueue::getCanvasId(GLuint glId, GlCommandId type) +{ + if (!glId) + return 0; + + QMutexLocker locker(&m_resourceMutex); + + QList<GLint> keyList = m_resourceIdMap.keys(); + foreach (GLint canvasId, keyList) { + GlResource value = m_resourceIdMap.value(canvasId); + if (value.glId == glId && value.commandId == type) + return canvasId; + } + + return 0; +} + void CanvasGlCommandQueue::setShaderToMap(GLint id, QOpenGLShader *shader) { QMutexLocker locker(&m_resourceMutex); diff --git a/src/imports/qtcanvas3d/glcommandqueue_p.h b/src/imports/qtcanvas3d/glcommandqueue_p.h index 6debcfc..b633982 100644 --- a/src/imports/qtcanvas3d/glcommandqueue_p.h +++ b/src/imports/qtcanvas3d/glcommandqueue_p.h @@ -248,6 +248,7 @@ public: void setGlIdToMap(GLint id, GLuint glId, GlCommandId commandId); void removeResourceIdFromMap(GLint id); GLuint getGlId(GLint id); + GLint getCanvasId(GLuint glId, GlCommandId type); void setShaderToMap(GLint id, QOpenGLShader *shader); void setProgramToMap(GLint id, QOpenGLShaderProgram *program); |