static boolean fbdev_surface_present(struct native_surface *nsurf, const struct native_present_control *ctrl) { struct fbdev_surface *fbsurf = fbdev_surface(nsurf); struct fbdev_display *fbdpy = fbsurf->fbdpy; boolean ret = FALSE; if (ctrl->swap_interval) return FALSE; if (ctrl->natt != NATIVE_ATTACHMENT_BACK_LEFT) return FALSE; if (!fbdpy->assume_fixed_vinfo) { struct fb_var_screeninfo vinfo; memset(&vinfo, 0, sizeof(vinfo)); if (ioctl(fbdpy->fd, FBIOGET_VSCREENINFO, &vinfo)) return FALSE; /* present the surface */ if (fbdev_surface_update_drawable(&fbsurf->base, &vinfo)) { ret = resource_surface_present(fbsurf->rsurf, ctrl->natt, (void *) &fbsurf->drawable); } fbsurf->width = vinfo.xres; fbsurf->height = vinfo.yres; if (resource_surface_set_size(fbsurf->rsurf, fbsurf->width, fbsurf->height)) { /* surface resized */ fbsurf->sequence_number++; fbdpy->event_handler->invalid_surface(&fbdpy->base, &fbsurf->base, fbsurf->sequence_number); } } else { /* the drawable never changes */ ret = resource_surface_present(fbsurf->rsurf, ctrl->natt, (void *) &fbsurf->drawable); } return ret; }
static boolean psl1ght_surface_flush_frontbuffer(struct native_surface *nsurf) { struct psl1ght_surface *pssurf = psl1ght_surface(nsurf); if (!pssurf->is_current) return TRUE; return resource_surface_present(pssurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, NULL); }
static boolean ximage_surface_flush_frontbuffer(struct native_surface *nsurf) { struct ximage_surface *xsurf = ximage_surface(nsurf); boolean ret; ret = resource_surface_present(xsurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, (void *) &xsurf->xdraw); /* force buffers to be updated in next validation call */ ximage_surface_invalidate(&xsurf->base); return ret; }
static boolean ximage_surface_swap_buffers(struct native_surface *nsurf) { struct ximage_surface *xsurf = ximage_surface(nsurf); boolean ret; ret = resource_surface_present(xsurf->rsurf, NATIVE_ATTACHMENT_BACK_LEFT, (void *) &xsurf->xdraw); resource_surface_swap_buffers(xsurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, TRUE); /* the front/back buffers have been swapped */ ximage_surface_invalidate(&xsurf->base); return ret; }
static boolean gdi_surface_flush_frontbuffer(struct native_surface *nsurf) { struct gdi_surface *gsurf = gdi_surface(nsurf); HDC hDC; boolean ret; hDC = GetDC(gsurf->hWnd); ret = resource_surface_present(gsurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, (void *) hDC); ReleaseDC(gsurf->hWnd, hDC); /* force buffers to be updated in next validation call */ gdi_surface_invalidate(&gsurf->base); return ret; }
static boolean gdi_surface_swap_buffers(struct native_surface *nsurf) { struct gdi_surface *gsurf = gdi_surface(nsurf); HDC hDC; boolean ret; hDC = GetDC(gsurf->hWnd); ret = resource_surface_present(gsurf->rsurf, NATIVE_ATTACHMENT_BACK_LEFT, (void *) hDC); ReleaseDC(gsurf->hWnd, hDC); resource_surface_swap_buffers(gsurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, TRUE); /* the front/back buffers have been swapped */ gdi_surface_invalidate(&gsurf->base); return ret; }
static boolean psl1ght_surface_swap_buffers(struct native_surface *nsurf) { struct psl1ght_surface *pssurf = psl1ght_surface(nsurf); struct psl1ght_display *psdpy = pssurf->psdpy; boolean ret = TRUE; if (pssurf->is_current) { ret = resource_surface_present(pssurf->rsurf, NATIVE_ATTACHMENT_BACK_LEFT, NULL); } resource_surface_swap_buffers(pssurf->rsurf, NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE); /* the front/back textures are swapped */ pssurf->sequence_number++; psdpy->event_handler->invalid_surface(&psdpy->base, &pssurf->base, pssurf->sequence_number); return ret; }