5#include <QtWaylandClient/private/qwaylanddisplay_p.h>
7#include <QtOpenGL/QOpenGLTexture>
8#include <QtGui/QOpenGLContext>
9#include <QtGui/qopengl.h>
10#include <QtGui/QImage>
11#include <QtCore/QCoreApplication>
18#ifdef VULKAN_SERVER_BUFFER_EXTRA_DEBUG
24#define DECL_GL_FUNCTION(name, type)
27#define FIND_GL_FUNCTION(name, type)
29 name = reinterpret_cast<type>(glContext->getProcAddress(#name));
31 qWarning() << "ERROR in GL proc lookup. Could not find " #name;
44 bool init(QOpenGLContext *glContext)
54 static bool create(QOpenGLContext *glContext);
64 if (!
funcs->init(glContext)) {
73 int32_t fd, uint32_t width, uint32_t height, uint32_t memory_size, uint32_t format)
74 : m_integration(integration)
77 , m_memorySize(memory_size)
78 , m_internalFormat(format)
80 m_size = QSize(width, height);
85 if (QCoreApplication::closingDown())
89 m_integration->deleteGLTextureWhenPossible(m_texture);
91 if (sbiExtraDebug) qDebug() <<
"glDeleteMemoryObjectsEXT" << m_memoryObject;
92 funcs->glDeleteMemoryObjectsEXT(1, &m_memoryObject);
94 qt_server_buffer_release(m_server_buffer);
95 qt_server_buffer_destroy(m_server_buffer);
103 if (sbiExtraDebug) qDebug() <<
"importing" << m_fd << Qt::hex << glGetError();
105 auto *glContext = QOpenGLContext::currentContext();
109 if (!funcs && !VulkanServerBufferGlFunctions::create(glContext))
112 funcs->glCreateMemoryObjectsEXT(1, &m_memoryObject);
113 if (sbiExtraDebug) qDebug() <<
"glCreateMemoryObjectsEXT" << Qt::hex << glGetError();
114 funcs->glImportMemoryFdEXT(m_memoryObject, m_memorySize, GL_HANDLE_TYPE_OPAQUE_FD_EXT, m_fd);
115 if (sbiExtraDebug) qDebug() <<
"glImportMemoryFdEXT" << Qt::hex << glGetError();
118 m_texture =
new QOpenGLTexture(QOpenGLTexture::Target2D);
121 if (sbiExtraDebug) qDebug() <<
"created texture" << m_texture->textureId() << Qt::hex << glGetError();
124 if (sbiExtraDebug) qDebug() <<
"bound texture" << Qt::hex << glGetError();
125 funcs->glTexStorageMem2DEXT(GL_TEXTURE_2D, 1, m_internalFormat, m_size.width(), m_size.height(), m_memoryObject, 0 );
126 if (sbiExtraDebug) qDebug() <<
"glTexStorageMem2DEXT" << Qt::hex << glGetError();
127 if (sbiExtraDebug) qDebug() <<
"format" << Qt::hex << m_internalFormat << GL_RGBA8;
141 display->addRegistryListener(&wlDisplayHandleGlobal,
this);
146 return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer));
149void VulkanServerBufferIntegration::wlDisplayHandleGlobal(
void *data, ::wl_registry *registry, uint32_t id,
const QString &interface, uint32_t version)
152 if (interface ==
"zqt_vulkan_server_buffer_v1") {
154 integration->QtWayland::zqt_vulkan_server_buffer_v1::init(registry, id, 1);
160 if (
sbiExtraDebug) qDebug() <<
"vulkan_server_buffer_server_buffer_created" << fd;
161 auto *server_buffer =
new VulkanServerBuffer(
this, id, fd, width, height, memory_size, format);
162 qt_server_buffer_set_user_data(id, server_buffer);
167 if (!QOpenGLContext::currentContext()) {
168 qWarning(
"VulkanServerBufferIntegration::deleteOrphanedTextures with no current context!");
171 qDeleteAll(orphanedTextures);
172 orphanedTextures.clear();
void initialize(QWaylandDisplay *display) override
void deleteOrphanedTextures()
void zqt_vulkan_server_buffer_v1_server_buffer_created(qt_server_buffer *id, int32_t fd, uint32_t width, uint32_t height, uint32_t memory_size, uint32_t format) override
QOpenGLTexture * toOpenGlTexture() override
~VulkanServerBuffer() override
#define DECL_GL_FUNCTION(name, type)
#define FIND_GL_FUNCTION(name, type)
Combined button and popup list for selecting options.
static constexpr bool sbiExtraDebug
static VulkanServerBufferGlFunctions * funcs
bool init(QOpenGLContext *glContext)
static bool create(QOpenGLContext *glContext)