diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2014-09-19 14:13:06 +0200 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2014-09-19 14:13:06 +0200 |
commit | f22e0bce3732c1fd005b7a886042394e036bc1b3 (patch) | |
tree | 2ec712b9298fc3d6a6abdd05083a8c95f31a61b9 /src/libsystemd-terminal/grdev.c | |
parent | 650c5444273993f969b9cd7df9add6ab2df0414e (diff) |
terminal: add grdev DRM backend
The grdev-drm backend manages DRM cards for grdev. Any DRM card with
DUMB_BUFFER support can be used. So far, our policy is to configure all
available connectors, but keep pipes inactive as long as users don't
enable the displays on top.
We hard-code double-buffering so far, but can easily support
single-buffering or n-buffering. We also require XRGB8888 as format as
this is required to be supported by all DRM drivers and it is what VTs
use. This allows us to switch from VTs to grdev via page-flips instead of
deep modesets.
There is still a lot room for improvements in this backend, but it works
smoothly so far so more enhanced features can be added later.
Diffstat (limited to 'src/libsystemd-terminal/grdev.c')
-rw-r--r-- | src/libsystemd-terminal/grdev.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c index ab1c407ecb..1e02a6799c 100644 --- a/src/libsystemd-terminal/grdev.c +++ b/src/libsystemd-terminal/grdev.c @@ -20,6 +20,7 @@ ***/ #include <inttypes.h> +#include <libudev.h> #include <stdbool.h> #include <stdlib.h> #include <systemd/sd-bus.h> @@ -30,6 +31,7 @@ #include "hashmap.h" #include "login-shared.h" #include "macro.h" +#include "udev-util.h" #include "util.h" static void pipe_enable(grdev_pipe *pipe); @@ -1083,6 +1085,68 @@ void grdev_session_restore(grdev_session *session) { card->vtable->restore(card); } +void grdev_session_add_drm(grdev_session *session, struct udev_device *ud) { + grdev_card *card; + dev_t devnum; + int r; + + assert(session); + assert(ud); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return; + + card = grdev_find_drm_card(session, devnum); + if (card) + return; + + r = grdev_drm_card_new(&card, session, ud); + if (r < 0) { + log_debug("grdev: %s: cannot add DRM device for %s: %s", + session->name, udev_device_get_syspath(ud), strerror(-r)); + return; + } + + session_add_card(session, card); +} + +void grdev_session_remove_drm(grdev_session *session, struct udev_device *ud) { + grdev_card *card; + dev_t devnum; + + assert(session); + assert(ud); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return; + + card = grdev_find_drm_card(session, devnum); + if (!card) + return; + + session_remove_card(session, card); +} + +void grdev_session_hotplug_drm(grdev_session *session, struct udev_device *ud) { + grdev_card *card; + dev_t devnum; + + assert(session); + assert(ud); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return; + + card = grdev_find_drm_card(session, devnum); + if (!card) + return; + + /* TODO: hotplug card */ +} + static void session_configure(grdev_session *session) { grdev_display *display; grdev_tile *tile; |