Exemple #1
0
static boolean
dri2_surface_swap_buffers(struct native_surface *nsurf, int num_rects,
                          const int *rects)
{
    struct dri2_surface *dri2surf = dri2_surface(nsurf);
    struct dri2_display *dri2dpy = dri2surf->dri2dpy;
    struct native_display *ndpy = &dri2dpy->base;
    struct pipe_context *pipe = ndpy_get_copy_context(ndpy);

    /* copy to front buffer */
    if (dri2surf->have_back) {
        pipe->flush_resource(pipe, dri2surf->textures[NATIVE_ATTACHMENT_BACK_LEFT]);
        pipe->flush(pipe, NULL, 0);

        if (num_rects > 0)
            x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
                                             num_rects, rects,
                                             DRI2BufferBackLeft, DRI2BufferFrontLeft);
        else
            x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
                                      0, 0, dri2surf->width, dri2surf->height,
                                      DRI2BufferBackLeft, DRI2BufferFrontLeft);
    }

    /* and update fake front buffer */
    if (dri2surf->have_fake) {
        if (num_rects > 0)
            x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
                                             num_rects, rects,
                                             DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
        else
            x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
                                      0, 0, dri2surf->width, dri2surf->height,
                                      DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
    }

    /* force buffers to be updated in next validation call */
    if (!dri2_surface_receive_events(&dri2surf->base)) {
        dri2surf->server_stamp++;
        dri2dpy->event_handler->invalid_surface(&dri2dpy->base,
                                                &dri2surf->base, dri2surf->server_stamp);
    }

    return TRUE;
}
Exemple #2
0
static boolean
dri2_surface_swap_buffers(struct native_surface *nsurf, int num_rects,
                          const int *rects)
{
   struct dri2_surface *dri2surf = dri2_surface(nsurf);
   struct dri2_display *dri2dpy = dri2surf->dri2dpy;

   /* copy to front buffer */
   if (dri2surf->have_back) {
      if (num_rects > 0)
         x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
               num_rects, rects,
               DRI2BufferBackLeft, DRI2BufferFrontLeft);
      else
         x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
               0, 0, dri2surf->width, dri2surf->height,
               DRI2BufferBackLeft, DRI2BufferFrontLeft);
   }

   /* and update fake front buffer */
   if (dri2surf->have_fake) {
      if (num_rects > 0)
         x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
               num_rects, rects,
               DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
      else
         x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
               0, 0, dri2surf->width, dri2surf->height,
               DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
   }

   /* force buffers to be updated in next validation call */
   if (!dri2_surface_receive_events(&dri2surf->base)) {
      dri2surf->server_stamp++;
      dri2dpy->event_handler->invalid_surface(&dri2dpy->base,
            &dri2surf->base, dri2surf->server_stamp);
   }

   return TRUE;
}