mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-19 06:47:02 -04:00
backend/drm: implement KMS state snapshot/restore
Following ideas from [1], snapshot the entire KMS state when the VT is switched away, and restore it when the VT is switched back. > Well the neat trick is that userspace doesn’t need to be able to > understand properties to save and restore them - the actual property > value transport between kernel and userspace is fully generic. That way, even if another DRM master changes a property we don't understand like CTM or HDR_OUTPUT_METADATA, we can switch it back and avoid getting garbage on screen. [1]: https://blog.ffwll.ch/2016/01/vt-switching-with-atomic-modeset.html
This commit is contained in:
parent
e0b2bf2a6b
commit
f0bb53c4ab
7 changed files with 155 additions and 20 deletions
|
|
@ -85,6 +85,8 @@ struct wlr_drm_backend {
|
|||
uint64_t cursor_width, cursor_height;
|
||||
|
||||
struct wlr_drm_format_set mgpu_formats;
|
||||
|
||||
drmModeAtomicReq *atomic_snapshot;
|
||||
};
|
||||
|
||||
struct wlr_drm_mode {
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@ struct wlr_drm_interface {
|
|||
bool (*crtc_commit)(struct wlr_drm_connector *conn,
|
||||
const struct wlr_drm_connector_state *state, uint32_t flags,
|
||||
bool test_only);
|
||||
bool (*snapshot_state)(struct wlr_drm_backend *drm);
|
||||
bool (*restore_state)(struct wlr_drm_backend *drm);
|
||||
};
|
||||
|
||||
extern const struct wlr_drm_interface atomic_iface;
|
||||
|
|
@ -24,5 +26,6 @@ extern const struct wlr_drm_interface legacy_iface;
|
|||
|
||||
bool drm_legacy_crtc_set_gamma(struct wlr_drm_backend *drm,
|
||||
struct wlr_drm_crtc *crtc, size_t size, uint16_t *lut);
|
||||
bool legacy_restore_state(struct wlr_drm_backend *drm);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@ const char *get_pnp_manufacturer(uint16_t code);
|
|||
void parse_edid(struct wlr_drm_connector *conn, size_t len, const uint8_t *data);
|
||||
const char *drm_connector_status_str(drmModeConnection status);
|
||||
|
||||
drmModeAtomicReq *snapshot_drm_state(int drm_fd);
|
||||
|
||||
// Part of match_obj
|
||||
enum {
|
||||
UNMATCHED = (uint32_t)-1,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue