diff options
author | Paul Olav Tvete <paul.tvete@qt.io> | 2017-06-26 12:27:19 +0200 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@qt.io> | 2017-08-15 11:45:18 +0000 |
commit | cf8fd0dec1593d063be36774a1a6bd3ac336c053 (patch) | |
tree | eecd45e434b3a39dfaa5924201c09deba0b36b60 /src/hardwareintegration/client/libhybris-egl-server | |
parent | 53f1d9d65d54b8e4869c92ce76675ac6d1208c73 (diff) |
Update server buffer integration
Fix crashes, and change the (private) API to be more usable.
The libhybris code compiles without warnings, but is untested.
Change-Id: I1433daf1ba76d7869d1dfe260642199ce5a1b849
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
Diffstat (limited to 'src/hardwareintegration/client/libhybris-egl-server')
2 files changed, 40 insertions, 11 deletions
diff --git a/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.cpp b/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.cpp index 21af476fd..51b904e75 100644 --- a/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.cpp +++ b/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.cpp @@ -41,6 +41,7 @@ #include <QtWaylandClient/private/qwaylanddisplay_p.h> #include <QDebug> #include <QtGui/QOpenGLContext> +#include <QtGui/QOpenGLTexture> #include <hybris/eglplatformcommon/hybris_nativebufferext.h> #include <EGL/egl.h> @@ -59,6 +60,7 @@ LibHybrisServerBuffer::LibHybrisServerBuffer(LibHybrisEglServerBufferIntegration , int32_t format) : QWaylandServerBuffer() , m_integration(integration) + , m_texture(nullptr) , m_stride(stride) , m_hybrisFormat(format) { @@ -76,18 +78,28 @@ LibHybrisServerBuffer::~LibHybrisServerBuffer() m_integration->eglDestroyImageKHR(m_image); } -void LibHybrisServerBuffer::bindTextureToBuffer() +QOpenGLTexture * LibHybrisServerBuffer::toOpenGlTexture() { if (!QOpenGLContext::currentContext()) { qWarning("LibHybrisServerBuffer: creating texture with no current context"); } + if (!m_texture) { + m_texture = new QOpenGLTexture(QOpenGLTexture::Target2D); + m_texture->create(); + } + + m_texture->bind(); m_integration->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + m_texture->release(); + m_texture->setSize(m_size.width(), m_size.height()); + + return m_texture; } void LibHybrisServerBuffer::libhybris_buffer_add_fd(int32_t fd) @@ -114,10 +126,14 @@ void LibHybrisServerBuffer::libhybris_buffer_add_fd(int32_t fd) } } -void LibHybrisEglServerBufferIntegration::initialize(QWaylandDisplay *display) +void LibHybrisEglServerBufferIntegration::initializeEgl() { - m_egl_display = eglGetDisplay((EGLNativeDisplayType) display->wl_display()); - if (EGL_NO_DISPLAY) { + if (m_egl_initialized) + return; + m_egl_initialized = true; + + m_egl_display = eglGetDisplay((EGLNativeDisplayType) m_display->wl_display()); + if (m_egl_display == EGL_NO_DISPLAY) { qWarning("Failed to initialize libhybris egl server buffer integration. Could not get egl display from wl_display."); return; } @@ -145,8 +161,13 @@ void LibHybrisEglServerBufferIntegration::initialize(QWaylandDisplay *display) qWarning("Failed to initialize libhybris egl server buffer integration. Could not resolve eglHybrisCreateRemoteBuffer"); return; } + m_egl_initialized = true; +} - QtWayland::wl_registry::init(wl_display_get_registry(display->wl_display())); +void LibHybrisEglServerBufferIntegration::initialize(QWaylandDisplay *display) +{ + m_display = display; + display->addRegistryListener(&wlDisplayHandleGlobal, this); } QWaylandServerBuffer *LibHybrisEglServerBufferIntegration::serverBuffer(struct qt_server_buffer *buffer) @@ -154,12 +175,12 @@ QWaylandServerBuffer *LibHybrisEglServerBufferIntegration::serverBuffer(struct q return static_cast<QWaylandServerBuffer *>(qt_server_buffer_get_user_data(buffer)); } -void LibHybrisEglServerBufferIntegration::registry_global(uint32_t name, const QString &interface, uint32_t version) +void LibHybrisEglServerBufferIntegration::wlDisplayHandleGlobal(void *data, ::wl_registry *registry, uint32_t id, const QString &interface, uint32_t version) { Q_UNUSED(version); if (interface == QStringLiteral("qt_libhybris_egl_server_buffer")) { - struct ::wl_registry *registry = QtWayland::wl_registry::object(); - QtWayland::qt_libhybris_egl_server_buffer::init(registry, name, 1); + auto *integration = static_cast<LibHybrisEglServerBufferIntegration *>(data); + integration->QtWayland::qt_libhybris_egl_server_buffer::init(registry, id, 1); } } diff --git a/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.h b/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.h index e9f0689a2..b3c9c464d 100644 --- a/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.h +++ b/src/hardwareintegration/client/libhybris-egl-server/libhybriseglserverbufferintegration.h @@ -75,7 +75,7 @@ class LibHybrisServerBuffer : public QWaylandServerBuffer, public QtWayland::qt_ public: LibHybrisServerBuffer(LibHybrisEglServerBufferIntegration *integration, int32_t numFds, wl_array *ints, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format); ~LibHybrisServerBuffer(); - void bindTextureToBuffer() override; + QOpenGLTexture* toOpenGlTexture() override; protected: void libhybris_buffer_add_fd(int32_t fd) override; @@ -83,6 +83,7 @@ protected: private: LibHybrisEglServerBufferIntegration *m_integration; EGLImageKHR m_image; + QOpenGLTexture *m_texture; int m_numFds; QVector<int32_t> m_ints; QVector<int32_t> m_fds; @@ -92,7 +93,6 @@ private: class LibHybrisEglServerBufferIntegration : public QWaylandServerBufferIntegration - , public QtWayland::wl_registry , public QtWayland::qt_libhybris_egl_server_buffer { public: @@ -106,19 +106,27 @@ public: inline EGLBoolean eglHybrisCreateRemoteBuffer(EGLint width, EGLint height, EGLint usage, EGLint format, EGLint stride, int num_ints, int *ints, int num_fds, int *fds, EGLClientBuffer *buffer); protected: - void registry_global(uint32_t name, const QString &interface, uint32_t version) override; void libhybris_egl_server_buffer_server_buffer_created(struct ::qt_libhybris_buffer *id, struct ::qt_server_buffer *qid, int32_t numFds, wl_array *ints, int32_t name, int32_t width, int32_t height, int32_t stride, int32_t format) override; private: + static void wlDisplayHandleGlobal(void *data, struct ::wl_registry *registry, uint32_t id, + const QString &interface, uint32_t version); + void initializeEgl(); + PFNEGLCREATEIMAGEKHRPROC m_egl_create_image; PFNEGLDESTROYIMAGEKHRPROC m_egl_destroy_image; PFNGLEGLIMAGETARGETTEXTURE2DOESPROC m_gl_egl_image_target_texture; PFNEGLHYBRISCREATEREMOTEBUFFERPROC m_egl_create_buffer; + QWaylandDisplay *m_display = nullptr; EGLDisplay m_egl_display; + bool m_egl_initialized = false; }; EGLImageKHR LibHybrisEglServerBufferIntegration::eglCreateImageKHR(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list) { + if (!m_egl_initialized) + initializeEgl(); + if (!m_egl_create_image) { qWarning("LibHybrisEglServerBufferIntegration: Trying to used unresolved function eglCreateImageKHR"); return EGL_NO_IMAGE_KHR; |