From 7aacc8144e7da6b1ec48ab7c1e5c431d78c99c5f Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Mon, 18 Nov 2019 19:34:07 +0300 Subject: xcb: Reduce number of created colormaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create a colormap per visual, not per window. Pick-to: 5.15 Change-Id: I97d94618f159b4beaffd4a1afe0611233ced6676 Reviewed-by: Liang Qi Reviewed-by: Shawn Rutledge Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/xcb/qxcbscreen.cpp | 19 +++++++++++++++++++ src/plugins/platforms/xcb/qxcbscreen.h | 3 +++ src/plugins/platforms/xcb/qxcbwindow.cpp | 15 ++++----------- src/plugins/platforms/xcb/qxcbwindow.h | 1 - 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index 82e256657c..e65418b077 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -131,6 +131,9 @@ QXcbVirtualDesktop::QXcbVirtualDesktop(QXcbConnection *connection, xcb_screen_t QXcbVirtualDesktop::~QXcbVirtualDesktop() { delete m_xSettings; + + for (auto cmap : qAsConst(m_visualColormaps)) + xcb_free_colormap(xcb_connection(), cmap); } QDpi QXcbVirtualDesktop::dpi() const @@ -493,6 +496,22 @@ quint8 QXcbVirtualDesktop::depthOfVisual(xcb_visualid_t visualid) const return *it; } +xcb_colormap_t QXcbVirtualDesktop::colormapForVisual(xcb_visualid_t visualid) const +{ + auto it = m_visualColormaps.constFind(visualid); + if (it != m_visualColormaps.constEnd()) + return *it; + + auto cmap = xcb_generate_id(xcb_connection()); + xcb_create_colormap(xcb_connection(), + XCB_COLORMAP_ALLOC_NONE, + cmap, + screen()->root, + visualid); + m_visualColormaps.insert(visualid, cmap); + return cmap; +} + QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDesktop, xcb_randr_output_t outputId, xcb_randr_get_output_info_reply_t *output) : QXcbObject(connection) diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index 9298a67b2b..9be3ce9e7f 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -107,6 +107,7 @@ public: const xcb_visualtype_t *visualForFormat(const QSurfaceFormat &format) const; const xcb_visualtype_t *visualForId(xcb_visualid_t) const; quint8 depthOfVisual(xcb_visualid_t) const; + xcb_colormap_t colormapForVisual(xcb_visualid_t) const; private: QRect getWorkArea() const; @@ -133,6 +134,7 @@ private: QString m_windowManagerName; QMap m_visuals; QMap m_visualDepths; + mutable QMap m_visualColormaps; uint16_t m_rotation = 0; }; @@ -190,6 +192,7 @@ public: const xcb_visualtype_t *visualForFormat(const QSurfaceFormat &format) const { return m_virtualDesktop->visualForFormat(format); } const xcb_visualtype_t *visualForId(xcb_visualid_t visualid) const; + xcb_colormap_t colormapForVisual(xcb_visualid_t visualid) const { return m_virtualDesktop->colormapForVisual(visualid); } quint8 depthOfVisual(xcb_visualid_t visualid) const { return m_virtualDesktop->depthOfVisual(visualid); } QString name() const override { return m_outputName; } diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 0dba120e30..147bac01dd 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -363,14 +363,9 @@ void QXcbWindow::create() return result; }; + xcb_colormap_t cmap = XCB_COLORMAP_NONE; if ((window()->supportsOpenGL() && haveOpenGL()) || m_format.hasAlpha()) { - m_cmap = xcb_generate_id(xcb_connection()); - xcb_create_colormap(xcb_connection(), - XCB_COLORMAP_ALLOC_NONE, - m_cmap, - xcb_parent_id, - m_visualId); - + cmap = platformScreen->colormapForVisual(m_visualId); mask |= XCB_CW_COLORMAP; } @@ -381,7 +376,7 @@ void QXcbWindow::create() type == Qt::Popup || type == Qt::ToolTip || (window()->flags() & Qt::BypassWindowManagerHint), type == Qt::Popup || type == Qt::Tool || type == Qt::SplashScreen || type == Qt::ToolTip || type == Qt::Drawer, defaultEventMask, - m_cmap + cmap }; m_window = xcb_generate_id(xcb_connection()); @@ -552,9 +547,7 @@ void QXcbWindow::destroy() xcb_destroy_window(xcb_connection(), m_window); m_window = 0; } - if (m_cmap) { - xcb_free_colormap(xcb_connection(), m_cmap); - } + m_mapped = false; if (m_pendingSyncRequest) diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index b8e5159c7f..c05e658652 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -233,7 +233,6 @@ protected: quint8 mode, quint8 detail, xcb_timestamp_t timestamp); xcb_window_t m_window = 0; - xcb_colormap_t m_cmap = 0; uint m_depth = 0; QImage::Format m_imageFormat = QImage::Format_ARGB32_Premultiplied; -- cgit v1.2.3