h = uterm_mode_get_height(mode);
uterm_display_fill(d->disp, 0, 0, 0, 0, 0, w, h);
- uterm_display_swap(d->disp);
+ uterm_display_swap(d->disp, false);
}
static int dummy_session_event(struct kmscon_session *session,
scr->pending = false;
tsm_screen_draw(scr->term->console, kmscon_text_prepare_cb,
kmscon_text_draw_cb, kmscon_text_render_cb, scr->txt);
- ret = uterm_display_swap(scr->disp);
+ ret = uterm_display_swap(scr->disp, false);
if (ret) {
log_warning("cannot swap display %p", scr->disp);
return;
return 0;
}
-static int display_swap(struct uterm_display *disp)
+static int display_swap(struct uterm_display *disp, bool immediate)
{
struct fbdev_display *dfb = disp->data;
struct fb_var_screeninfo *vinfo;
int ret;
- if (!(disp->flags & DISPLAY_DBUF))
+ if (!(disp->flags & DISPLAY_DBUF)) {
+ if (immediate)
+ return 0;
return display_schedule_vblank_timer(disp);
+ }
vinfo = &dfb->vinfo;
- vinfo->activate = FB_ACTIVATE_VBL;
+ if (immediate)
+ vinfo->activate = FB_ACTIVATE_NOW;
+ else
+ vinfo->activate = FB_ACTIVATE_VBL;
if (!dfb->bufid)
vinfo->yoffset = dfb->yres;
return VIDEO_CALL(disp->ops->use, -EOPNOTSUPP, disp);
}
-int uterm_display_swap(struct uterm_display *disp)
+int uterm_display_swap(struct uterm_display *disp, bool immediate)
{
if (!disp || !display_is_online(disp) || !video_is_awake(disp->video))
return -EINVAL;
- return VIDEO_CALL(disp->ops->swap, 0, disp);
+ return VIDEO_CALL(disp->ops->swap, 0, disp, immediate);
}
bool uterm_display_is_swapping(struct uterm_display *disp)
int uterm_display_get_dpms(const struct uterm_display *disp);
int uterm_display_use(struct uterm_display *disp);
-int uterm_display_swap(struct uterm_display *disp);
+int uterm_display_swap(struct uterm_display *disp, bool immediate);
bool uterm_display_is_swapping(struct uterm_display *disp);
int uterm_display_fill(struct uterm_display *disp,
return 0;
}
-static int swap_display(struct uterm_display *disp, bool immediate)
+static int display_swap(struct uterm_display *disp, bool immediate)
{
int ret;
struct gbm_bo *bo;
return 0;
}
-static int display_swap(struct uterm_display *disp)
-{
- return swap_display(disp, false);
-}
-
extern const char *gl_static_fill_vert;
extern const char *gl_static_fill_frag;
extern const char *gl_static_blend_vert;
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
- swap_display(iter, true);
+ display_swap(iter, true);
}
}
disp->current_mode = NULL;
}
-static int swap_display(struct uterm_display *disp, bool immediate)
+static int display_swap(struct uterm_display *disp, bool immediate)
{
int ret, rb;
struct uterm_drm2d_display *d2d = uterm_drm_display_get_data(disp);
return 0;
}
-static int display_swap(struct uterm_display *disp)
-{
- return swap_display(disp, false);
-}
-
static int display_blit(struct uterm_display *disp,
const struct uterm_video_buffer *buf,
unsigned int x, unsigned int y)
void (*deactivate) (struct uterm_display *disp);
int (*set_dpms) (struct uterm_display *disp, int state);
int (*use) (struct uterm_display *disp);
- int (*swap) (struct uterm_display *disp);
+ int (*swap) (struct uterm_display *disp, bool immediate);
int (*blit) (struct uterm_display *disp,
const struct uterm_video_buffer *buf,
unsigned int x, unsigned int y);
continue;
}
- ret = uterm_display_swap(iter);
+ ret = uterm_display_swap(iter, true);
if (ret) {
log_err("Cannot swap screen: %d", ret);
continue;