|
|
|
@ -61,19 +61,26 @@ static void atomic_begin(struct atomic *atom) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool atomic_commit(struct atomic *atom,
|
|
|
|
|
static bool atomic_commit(struct atomic *atom, struct wlr_drm_backend *drm,
|
|
|
|
|
struct wlr_drm_connector *conn, struct wlr_drm_page_flip *page_flip,
|
|
|
|
|
uint32_t flags) {
|
|
|
|
|
struct wlr_drm_backend *drm = conn->backend;
|
|
|
|
|
if (atom->failed) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ret = drmModeAtomicCommit(drm->fd, atom->req, flags, page_flip);
|
|
|
|
|
if (ret != 0) {
|
|
|
|
|
wlr_drm_conn_log_errno(conn,
|
|
|
|
|
(flags & DRM_MODE_ATOMIC_TEST_ONLY) ? WLR_DEBUG : WLR_ERROR,
|
|
|
|
|
"Atomic commit failed");
|
|
|
|
|
enum wlr_log_importance log_level = WLR_ERROR;
|
|
|
|
|
if (flags & DRM_MODE_ATOMIC_TEST_ONLY) {
|
|
|
|
|
log_level = WLR_DEBUG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (conn != NULL) {
|
|
|
|
|
wlr_drm_conn_log_errno(conn, log_level, "Atomic commit failed");
|
|
|
|
|
} else {
|
|
|
|
|
wlr_log_errno(log_level, "Atomic commit failed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *flags_str = atomic_commit_flags_str(flags);
|
|
|
|
|
wlr_log(WLR_DEBUG, "(Atomic commit flags: %s)",
|
|
|
|
|
flags_str ? flags_str : "<error>");
|
|
|
|
@ -369,7 +376,7 @@ static bool atomic_crtc_commit(struct wlr_drm_connector *conn,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ok = atomic_commit(&atom, conn, page_flip, flags);
|
|
|
|
|
bool ok = atomic_commit(&atom, drm, conn, page_flip, flags);
|
|
|
|
|
atomic_finish(&atom);
|
|
|
|
|
|
|
|
|
|
if (ok && !test_only) {
|
|
|
|
@ -392,6 +399,33 @@ static bool atomic_crtc_commit(struct wlr_drm_connector *conn,
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool drm_atomic_reset(struct wlr_drm_backend *drm) {
|
|
|
|
|
struct atomic atom;
|
|
|
|
|
atomic_begin(&atom);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < drm->num_crtcs; i++) {
|
|
|
|
|
struct wlr_drm_crtc *crtc = &drm->crtcs[i];
|
|
|
|
|
atomic_add(&atom, crtc->id, crtc->props.mode_id, 0);
|
|
|
|
|
atomic_add(&atom, crtc->id, crtc->props.active, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct wlr_drm_connector *conn;
|
|
|
|
|
wl_list_for_each(conn, &drm->connectors, link) {
|
|
|
|
|
atomic_add(&atom, conn->id, conn->props.crtc_id, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < drm->num_planes; i++) {
|
|
|
|
|
plane_disable(&atom, &drm->planes[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
|
|
|
|
|
bool ok = atomic_commit(&atom, drm, NULL, NULL, flags);
|
|
|
|
|
atomic_finish(&atom);
|
|
|
|
|
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const struct wlr_drm_interface atomic_iface = {
|
|
|
|
|
.crtc_commit = atomic_crtc_commit,
|
|
|
|
|
.reset = drm_atomic_reset,
|
|
|
|
|
};
|
|
|
|
|