diff options
author | Paul Olav Tvete <paul.tvete@qt.io> | 2019-03-26 14:25:51 +0100 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@qt.io> | 2019-03-29 11:32:31 +0000 |
commit | acd1153c1de08d763f74c28619f7bb8953e89511 (patch) | |
tree | 8303b7dfcdee81392f6e709fe62905282fead4d5 | |
parent | 191d301936f07db47a4ff31edb69efd43aefe8b0 (diff) |
Vulkan server buffer integration crash fix
Duplicate file descriptor before calling glImportMemoryFdEXT()
on the server side. The Khronos specification says that "performing
any operation on <fd> in the application after an import results in
undefined behavior".
Change-Id: I6a800171450578b1dabba7efc624623388acf3a1
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
(cherry picked from commit fde6362edc6ecadbcca8872f71c111bd7c896801)
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r-- | src/hardwareintegration/compositor/vulkan-server/vulkanserverbufferintegration.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/hardwareintegration/compositor/vulkan-server/vulkanserverbufferintegration.cpp b/src/hardwareintegration/compositor/vulkan-server/vulkanserverbufferintegration.cpp index 46e335728..df197ca23 100644 --- a/src/hardwareintegration/compositor/vulkan-server/vulkanserverbufferintegration.cpp +++ b/src/hardwareintegration/compositor/vulkan-server/vulkanserverbufferintegration.cpp @@ -46,6 +46,9 @@ #include <QtGui/QOffscreenSurface> #include <QtGui/qopengl.h> +#include <unistd.h> +#include <fcntl.h> + #include <QtCore/QDebug> QT_BEGIN_NAMESPACE @@ -213,7 +216,15 @@ QOpenGLTexture *VulkanServerBuffer::toOpenGlTexture() funcs->glCreateMemoryObjectsEXT(1, &m_memoryObject); if (extraDebug) qDebug() << "glCreateMemoryObjectsEXT" << hex << glGetError(); - funcs->glImportMemoryFdEXT(m_memoryObject, m_memorySize, GL_HANDLE_TYPE_OPAQUE_FD_EXT, m_fd); + + + int dupfd = fcntl(m_fd, F_DUPFD_CLOEXEC, 0); + if (dupfd < 0) { + perror("VulkanServerBuffer::toOpenGlTexture() Could not dup fd:"); + return nullptr; + } + + funcs->glImportMemoryFdEXT(m_memoryObject, m_memorySize, GL_HANDLE_TYPE_OPAQUE_FD_EXT, dupfd); if (extraDebug) qDebug() << "glImportMemoryFdEXT" << hex << glGetError(); |