assert(basefb);
assert(pipe);
- if (!crtc->applied && !grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode))
+ if (!crtc->applied) {
+ if (!grdrm_modes_compatible(&crtc->kern.mode, &crtc->set.mode))
+ return 0;
+
+ /* TODO: Theoretically, we should be able to page-flip to our
+ * framebuffer here. We didn't perform any deep modeset, but the
+ * DRM driver is really supposed to reject our page-flip in case
+ * the FB is not compatible. We then properly fall back to a
+ * deep modeset.
+ * As it turns out, drivers don't to this. Therefore, we need to
+ * perform a full modeset on enter now. We might avoid this in
+ * the future with fixed drivers.. */
+
return 0;
+ }
fb = fb_from_base(basefb);
assert(fb->card);
+ if (fb->base.free_fn)
+ fb->base.free_fn(fb->base.data.ptr);
+
if (fb->id > 0 && fb->card->fd >= 0) {
r = ioctl(fb->card->fd, DRM_IOCTL_MODE_RMFB, fb->id);
if (r < 0)
return basepipe->back;
}
+static void grdrm_pipe_enable(grdev_pipe *basepipe) {
+ grdrm_pipe *pipe = grdrm_pipe_from_base(basepipe);
+
+ pipe->crtc->applied = false;
+}
+
+static void grdrm_pipe_disable(grdev_pipe *basepipe) {
+ grdrm_pipe *pipe = grdrm_pipe_from_base(basepipe);
+
+ pipe->crtc->applied = false;
+}
+
static const grdev_pipe_vtable grdrm_pipe_vtable = {
.free = grdrm_pipe_free,
.target = grdrm_pipe_target,
+ .enable = grdrm_pipe_enable,
+ .disable = grdrm_pipe_disable,
};
/*