Commit graph

13320 commits

Author SHA1 Message Date
Martin Gräßlin
92d06a8c4b Make Toplevel::opacity virtual and copy it to Deleted
Toplevel::opacity() accesses the WinInfo, but for a Wayland client
we won't have the opacity through the WinInfo, so let's have it as
a virtual method that a subclass can override. Also it needs to be
copied to Deleted to not have a Deleted of a Wayland client crash
because it accesses the not existing WinInfo.
2015-05-08 12:43:44 +02:00
Martin Gräßlin
cfba4bacdf [wayland] Reference BufferInterface in WindowPixmap
As long as our WindowPixmap uses the buffer we should have it referenced.
2015-05-08 12:43:44 +02:00
Martin Gräßlin
209b62d522 [wayland] Pass EGLDisplay to KWayland::Server::Display
This allows the Server to calculate the size of a Buffer and we don't
need to use the queryBuffer for the size.
2015-05-08 12:43:44 +02:00
Martin Graesslin
e12400a675 Add a hwcomposer backend based on libhybris
This backend interacts with libhybris to create a hwcomposer which is
used for creating the egl context and surface. The initial version of
this backend is based on test_hwcomposer.cpp provided by libhybris.

Please note that using the hwcomposer backend requires a newer libepoxy,
the latest stable release is not able to bring up OpenGLES, so one needs
a master build of libepoxy.

Notes on licensing:
libhybris is Apache 2.0 licensed, which is not compatile with GPLv2.
But it is compatible with GPLv3. Thus the source files in the hwcomposer
backend are licensed GPLv3+ and not GPLv2+ as the rest of KWin. If one
uses KWin without the hwcomposer backend (which is obviously the default)
the licence doesn't change. But if the hwcomposer backend is used the
overall license of KWin changes to GPLv3+.
2015-05-08 10:28:52 +02:00
Martin Gräßlin
713c6b25dc [kwinglutils] Init glVersion on gles
The glVersion was not set at all for gles causing any code doing a
hasGLVersion check to fail which means that the compositor doesn't
start at all, because it has a hasGLVersion(2, 0) check.

The complete ifdef is no longer needed. The used additional glGetStringi
is also available in gles 3.0, thus epoxy can handle it quite well
without a need for ifdef.

Unfortunately the version string can be "strange" on GLES. On desktop
it looks like: "3.0 some driver foo", on GLES it could also be:
"OpenGL ES 3.0 some driver bar". Thus to make the logic work we are
first removing any leading "OpenGL ES " and hope that then the version
is encoded just like on GL.
2015-05-08 08:53:34 +02:00
Martin Gräßlin
2a8d7664b3 Properly add define for gles
Otherwise some parts still include epoxy/glx.h.
2015-05-07 14:11:30 +02:00
Martin Gräßlin
2220ae44c4 Create a plugin for each of the wayland backends
Each of the backends becomes a plugin. This allows kwin_wayland to load
the requested plugin and kwin itself doesn't need to link all the
libraries needed. E.g. libdrm is no longer linked if running kwin_x11.
Also this allows to create backends for the non-standard EGL platforms
(examples could be raspberrypi or Android devices).
2015-05-06 10:31:39 +02:00
Martin Gräßlin
33fb763e37 [wayland] Introduce a deviceIdentifier in AbstractBackend
To be used by the concrete backends for e.g. framebuffer device name,
DISPLAY or WAYLAND_DISPLAY variable.
2015-05-06 09:38:18 +02:00
Martin Gräßlin
d45cf6ee8d [wayland] Add an initialWindowSize to AbstractBackend
Useful for windowed backends like X11 and Wayland.
2015-05-06 09:26:51 +02:00
Martin Gräßlin
17d5839580 [wayland] AbstractBackend can emit an initFailed signal
Replaces the custom handling for Wayland and X11 Backend. Now they can
just emit the initFailed signal.
2015-05-06 09:26:51 +02:00
Martin Gräßlin
0782252f72 [wayland] AbstractBackend provides signal screensQueried
With this change all backends need to emit the screensQueried signal
at some point. So far only x11 backend did not provide the signal,
wayland had a comparable delayed init mechanism. Now all backends use
the same mechanism.
2015-05-06 09:05:37 +02:00
Martin Gräßlin
b2f5873a28 [wayland] X11WindowedBackend anounces input support by itself
It's the one knowing what it supports, no need to do it outside.
2015-05-06 09:05:37 +02:00
Martin Gräßlin
c4f8bed815 [wayland] Use a pure virtual AbstractBackend::init method
Two backends already used an init method, let's make that the same
in all backends to be able to have shared startup code.
2015-05-06 08:34:26 +02:00
Martin Gräßlin
2afaa60dc5 [wayland] A backend can mark whether it is ready
Replaces the functionality of the WaylandBackend and makes it available
to all backends by providing the functionality directly in
AbstractBackend. By default a backend is not ready and the implementation
must call setReady(true) to indicate that setup has finished
successfully. The compositor won't start till the backend indicates that
it is ready.
2015-05-05 19:05:31 +02:00
Martin Gräßlin
8ff394a020 [wayland] Dedicate logging category for each of the backends 2015-05-05 17:47:03 +02:00
Martin Gräßlin
767ca8d357 [wayland] Don't call into X11WindowedBackend from EglOnXBackend
Instead of having a ctor which takes the backend, it's a ctor which
takes all the information needed from the backend.
2015-05-05 15:35:12 +02:00
Martin Gräßlin
d80984beab [wayland] Move X11WindowedQPainterBackend into backends/x11 2015-05-05 15:23:53 +02:00
Martin Gräßlin
f7bf7cb7ba [wayland] Move WaylandQPainterBackend into backends/wayland 2015-05-05 15:13:36 +02:00
Martin Gräßlin
df6221ae4a [wayland] Move FramebufferQPainterBackend into backends/fbdev 2015-05-05 15:07:01 +02:00
Martin Gräßlin
06d8206192 [wayland] Move DrmQPainterBackend into backends/drm 2015-05-05 13:32:33 +02:00
Martin Gräßlin
72db1e63a3 [wayland] Move backend implementations into a backends/<name> directory
The aim is to be able to create a plugin for each of the backends.
The following directories are created:
* backends/drm
* backends/fbdev
* backends/wayland
* backends/x11
2015-05-05 13:05:37 +02:00
Martin Gräßlin
300a576d32 [wayland] Split out WaylandCursorTheme into own header/implementation
It's used by both the WaylandBackend and AbstractBackend. By splitting
it out the AbstractBackend doesn't need to depend on an implementation.
2015-05-05 13:05:04 +02:00
Martin Gräßlin
79b5685b7a [wayland] Add protected AbstractBackend::repaint(const QRect&)
Allows to trigger a repaint in the Compositor. This way the
implementation does not need to call into Compositor.
2015-05-05 11:39:18 +02:00
Martin Gräßlin
8be38dc4f6 [wayland] Don't call into InputRedirection from AbstractBackend implementations
Instead the AbstractBackend provides methods which delegate into
InputRedirection.
2015-05-05 11:37:59 +02:00
Sergio Martins
e283bda8e5 Fix unintentional no-op, unite() doesn't change the object
REVIEW: 123618
2015-05-03 22:31:23 +01:00
l10n daemon script
dd86680b72 SVN_SILENT made messages (.desktop file) 2015-04-28 15:34:57 +00:00
l10n daemon script
b4c8fa64b8 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2015-04-28 13:46:57 +00:00
Martin Gräßlin
b50d6d487b Add modelines to OutputInterfaces in DrmBackend
Each available mode on the connector is added to the
KWayland::Server::OutputInterface for the DrmOutput.

The logic to calculate the refreshRate is highly inspired from Weston's
implementation in compositor-drm.c.
2015-04-28 08:16:07 +02:00
l10n daemon script
88a15d10ae SVN_SILENT made messages (.desktop file) 2015-04-27 12:17:37 +00:00
l10n daemon script
dc19c0ed02 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2015-04-27 10:23:00 +00:00
Martin Gräßlin
6d3fa98e09 Read EDID in DrmBackend
Documentation for the wonderful EDID format can be found at:
http://read.pudn.com/downloads110/ebook/456020/E-EDID%20Standard.pdf

In case the link breaks: wikipedia also has a good section on it.

We read out the following information:
* EISA code (3 characters)
* serial number
* monitor name (up to 12 characters)
* physical size (stored in cm)

Unfortunately the EDID information cannot be trusted at all.
My 24" screen reports a sice of 16x9 cm. So we need to provide users
a way to overwrite the broken data in an easy way through kwinrc

[EdidOverwrite][EISA code/maker name][monitor name][serial number]
PhysicalSize=trueWidthInMM,trueHeightInMM

Unfortunately monitor name is not a sufficient enough identifier, that's
why serial number is also used. This makes automatic distribution of
overwrites difficult. But in the example above the monitor name is
"SyncMaster" which is a rather broad field in Samsung :-(

The extracted information from EDID is also used to set the corresponding
fields in KWayland::Server::OutputInterface.
2015-04-27 11:06:04 +02:00
l10n daemon script
3b93e2e826 SVN_SILENT made messages (.desktop file) 2015-04-25 11:59:16 +00:00
l10n daemon script
f4e2e0e2e9 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2015-04-25 10:26:32 +00:00
Martin Gräßlin
c52f542261 Fix build of DrmBackend with gbm dependency 2015-04-24 15:14:53 +02:00
l10n daemon script
5aeedeb8e9 SVN_SILENT made messages (.desktop file) 2015-04-24 11:33:58 +00:00
Martin Gräßlin
389d81731b DrmOutput creates OutputInterface on init
This automatically announces the OutputInterface when it gets created
and removes it when it gets destroyed again.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
603844cf98 [wayland] Allow the AbstractBackend subclasses to manage OutputInterfaces
This gives the backend more control without needing to provide all
information in Screens.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
f775e13c6e Improve tracking of DrmBuffers in DrmBackend
We need to prevent double deletions from the gbm callback. Therefore
we track all buffers in DrmBackend and pass the DrmBackend as user
data.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
843bfb8052 React on DrmOutput removed/added in EglGbmBackend
Creates a new gbmsurface and eglsurface, respectively deletes it.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
e298c2d584 React on DrmOutput added/removed in DrmQPainterBackend
For a new DrmOutput a new buffer needs to be created, for a removed
one the existing buffers need to be deleted.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
3a05e4b535 Update ScreensDrm whenever the screens got queried in the DrmBackend
Requires to move the screensQueried signal and disconnect during
Application startup.

As Screens only hold the geometry of each screen and the overall
geometry, there is no need (yet) to update in more detail when a
DrmOutput is added or removed. The overall queried is sufficient.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
7aee69a6b2 Support hotplug events for outputs in DrmBackend
The DrmBackend installs a UdevMonitor to listen for output hotplug
events. Whenever a hotplug event occurrs the resources are queried
again and a signal is emitted for each removed and added output.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
d9a29f3a49 [udev] Add wrapper for udev_monitor 2015-04-24 12:03:20 +02:00
Martin Gräßlin
cf27a056b8 [udev] Read property on UdevDevice 2015-04-24 12:03:20 +02:00
Martin Gräßlin
2a64755b76 Improve the rendering per output in SceneOpenGL/EglGbmBackend
The complete rendering is now splitted per output including present which
means that we only need to make the context per output current once per
rendering.

Unfortunately our architecture does not properly support gathering the
damage for multiple outputs. In fact the damage information is lost after
the first output got rendered. Thus we currently only support buffer age
for the first output, on other outputs full repaints are caused.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
c33a74ae58 [drm] Drop DrmBackend::present without DrmOutput*
Only the variant taking both buffer and output are used now.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
e650eef323 [drm] Find correct crtc/encoder/connector combination
We need to verify that a given crtc is not used already for one of
the created DrmOutputs.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
7c8c1dac0a [SceneOpenGL] Render per DrmOutput in EglGbmBackend
For each DrmOutput a gbm_surface and EglSurface is created. When
rendering per screen the context is made current on each of the
surfaces.

Note: viewport handling needs to be improved by e.g. passing through
the scene to restore to correct viewport after dropping an FBO.

Furthermore it seems like buffer age is not working correctly in this
setup (not overly surprising).

Dynamic changes are not yet supported.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
5c79f777a4 [SceneQPainter] Render per DrmOutput in DrmQPainterBackend
For each DrmOutput a set of buffers is created and presented. The
renderig is still in one go and not synced to the individual screens.

Dynamic changes are not yet supported.
2015-04-24 12:03:20 +02:00
Martin Gräßlin
9133c0f9d5 [SceneQPainter] Per-Screen rendering
The backend can indicate that the rendering needs to be split per screen.
In that case it has to provide a different rendering buffer per screen.
The painting in the scene is adjusted to either take a splitted path
or the existing path for all screens in one go.
2015-04-24 12:03:20 +02:00