static boolean drm_surface_present(struct native_surface *nsurf, enum native_attachment natt, boolean preserve, uint swap_interval) { boolean ret; if (swap_interval) return FALSE; switch (natt) { case NATIVE_ATTACHMENT_FRONT_LEFT: ret = drm_surface_flush_frontbuffer(nsurf); break; case NATIVE_ATTACHMENT_BACK_LEFT: if (preserve) ret = drm_surface_copy_swap(nsurf); else ret = drm_surface_swap_buffers(nsurf); break; default: ret = FALSE; break; } return ret; }
static boolean drm_surface_present(struct native_surface *nsurf, const struct native_present_control *ctrl) { boolean ret; if (ctrl->swap_interval) return FALSE; switch (ctrl->natt) { case NATIVE_ATTACHMENT_FRONT_LEFT: ret = drm_surface_flush_frontbuffer(nsurf); break; case NATIVE_ATTACHMENT_BACK_LEFT: if (ctrl->preserve) ret = drm_surface_copy_swap(nsurf); else ret = drm_surface_swap_buffers(nsurf); break; default: ret = FALSE; break; } return ret; }
static boolean drm_surface_swap_buffers(struct native_surface *nsurf) { struct drm_surface *drmsurf = drm_surface(nsurf); struct drm_crtc *drmcrtc = &drmsurf->current_crtc; struct drm_display *drmdpy = drmsurf->drmdpy; struct drm_framebuffer tmp_fb; int err; if (!drmsurf->have_pageflip) return drm_surface_copy_swap(nsurf); if (!drmsurf->back_fb.buffer_id) { if (!drm_surface_init_framebuffers(&drmsurf->base, TRUE)) return FALSE; } if (drmsurf->is_shown && drmcrtc->crtc) { err = drmModePageFlip(drmdpy->fd, drmcrtc->crtc->crtc_id, drmsurf->back_fb.buffer_id, 0, NULL); if (err) { drmsurf->have_pageflip = FALSE; return drm_surface_copy_swap(nsurf); } } /* swap the buffers */ tmp_fb = drmsurf->front_fb; drmsurf->front_fb = drmsurf->back_fb; drmsurf->back_fb = tmp_fb; resource_surface_swap_buffers(drmsurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE); /* the front/back textures are swapped */ drmsurf->sequence_number++; drmdpy->event_handler->invalid_surface(&drmdpy->base, &drmsurf->base, drmsurf->sequence_number); return TRUE; }