summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-06-10 14:03:57 +0300
committerTomi Korpipää <tomi.korpipaa@theqtcompany.com>2015-06-11 07:54:40 +0000
commit611e2e940f54210346330657077038324deabd02 (patch)
tree0a4d87d008548f993d95bdbd27455545a3cc5873
parent5b5282c95cbdb69fffba1679ad015b2ab140b3fc (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.cpp4
-rw-r--r--src/imports/qtcanvas3d/glcommandqueue.cpp17
-rw-r--r--src/imports/qtcanvas3d/glcommandqueue_p.h1
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);