summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorAlexander Volkov <a.volkov@rusbitech.ru>2019-11-18 19:34:07 +0300
committerAlexander Volkov <avolkov@astralinux.ru>2020-09-16 21:22:15 +0300
commit7aacc8144e7da6b1ec48ab7c1e5c431d78c99c5f (patch)
tree3c9f9168d1f1d8e9faf537b178e8d62d96db29b3 /src/plugins
parentbf075da8004718e6a7e8d3870b912e89cea8d08c (diff)
xcb: Reduce number of created colormaps
Create a colormap per visual, not per window. Pick-to: 5.15 Change-Id: I97d94618f159b4beaffd4a1afe0611233ced6676 Reviewed-by: Liang Qi <liang.qi@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp19
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.h3
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp15
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h1
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<xcb_visualid_t, xcb_visualtype_t> m_visuals;
QMap<xcb_visualid_t, quint8> m_visualDepths;
+ mutable QMap<xcb_visualid_t, xcb_colormap_t> 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;