1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
28 #include <systemd/sd-bus.h>
29 #include <systemd/sd-event.h>
35 typedef struct grdev_tile grdev_tile;
36 typedef struct grdev_display_cache grdev_display_cache;
38 typedef struct grdev_pipe_vtable grdev_pipe_vtable;
39 typedef struct grdev_pipe grdev_pipe;
40 typedef struct grdev_card_vtable grdev_card_vtable;
41 typedef struct grdev_card grdev_card;
47 bool grdev_is_drm_card(grdev_card *card);
48 grdev_card *grdev_find_drm_card(grdev_session *session, dev_t devnum);
49 int grdev_drm_card_new(grdev_card **out, grdev_session *session, struct udev_device *ud);
62 LIST_FIELDS(grdev_tile, childs_by_node);
64 grdev_display *display;
82 LIST_HEAD(grdev_tile, child_list);
87 int grdev_tile_new_leaf(grdev_tile **out, grdev_pipe *pipe);
88 int grdev_tile_new_node(grdev_tile **out);
89 grdev_tile *grdev_tile_free(grdev_tile *tile);
91 DEFINE_TRIVIAL_CLEANUP_FUNC(grdev_tile*, grdev_tile_free);
93 struct grdev_display {
94 grdev_session *session;
106 struct grdev_display_cache {
108 grdev_display_target target;
119 grdev_display *grdev_find_display(grdev_session *session, const char *name);
121 int grdev_display_new(grdev_display **out, grdev_session *session, const char *name);
122 grdev_display *grdev_display_free(grdev_display *display);
124 DEFINE_TRIVIAL_CLEANUP_FUNC(grdev_display*, grdev_display_free);
130 struct grdev_pipe_vtable {
131 void (*free) (grdev_pipe *pipe);
132 void (*enable) (grdev_pipe *pipe);
133 void (*disable) (grdev_pipe *pipe);
134 grdev_fb *(*target) (grdev_pipe *pipe);
138 const grdev_pipe_vtable *vtable;
143 grdev_display_cache *cache;
159 #define GRDEV_PIPE_INIT(_vtable, _card) ((grdev_pipe){ \
160 .vtable = (_vtable), \
164 grdev_pipe *grdev_find_pipe(grdev_card *card, const char *name);
166 int grdev_pipe_add(grdev_pipe *pipe, const char *name, size_t n_fbs);
167 grdev_pipe *grdev_pipe_free(grdev_pipe *pipe);
169 DEFINE_TRIVIAL_CLEANUP_FUNC(grdev_pipe*, grdev_pipe_free);
171 void grdev_pipe_ready(grdev_pipe *pipe, bool running);
172 void grdev_pipe_frame(grdev_pipe *pipe);
178 struct grdev_card_vtable {
179 void (*free) (grdev_card *card);
180 void (*enable) (grdev_card *card);
181 void (*disable) (grdev_card *card);
182 void (*commit) (grdev_card *card);
183 void (*restore) (grdev_card *card);
187 const grdev_card_vtable *vtable;
188 grdev_session *session;
197 #define GRDEV_CARD_INIT(_vtable, _session) ((grdev_card){ \
198 .vtable = (_vtable), \
199 .session = (_session), \
202 grdev_card *grdev_find_card(grdev_session *session, const char *name);
204 int grdev_card_add(grdev_card *card, const char *name);
205 grdev_card *grdev_card_free(grdev_card *card);
207 DEFINE_TRIVIAL_CLEANUP_FUNC(grdev_card*, grdev_card_free);
213 struct grdev_session {
214 grdev_context *context;
217 grdev_event_fn event_fn;
220 unsigned long n_pins;
223 Hashmap *display_map;
231 grdev_session *grdev_session_pin(grdev_session *session);
232 grdev_session *grdev_session_unpin(grdev_session *session);
234 DEFINE_TRIVIAL_CLEANUP_FUNC(grdev_session*, grdev_session_unpin);
240 struct grdev_context {
245 Hashmap *session_map;