Lines Matching refs:draw

58 dri3_flush_present_events(struct loader_dri3_drawable *draw);
61 dri3_find_back_alloc(struct loader_dri3_drawable *draw);
78 get_xcb_visualtype_for_depth(struct loader_dri3_drawable *draw, int depth)
81 xcb_screen_t *screen = draw->screen;
128 dri3_get_red_mask_for_depth(struct loader_dri3_drawable *draw, int depth)
130 xcb_visualtype_t *visual = get_xcb_visualtype_for_depth(draw, depth);
141 * \param draw[in] The drawable intended to blit from / to.
144 static bool loader_dri3_have_image_blit(const struct loader_dri3_drawable *draw)
146 return draw->ext->image->base.version >= 9 &&
147 draw->ext->image->blitImage != NULL;
155 * \param draw[in] Pointer to the drawable whose dri screen we want a
163 loader_dri3_blit_context_get(struct loader_dri3_drawable *draw)
167 if (blit_context.ctx && blit_context.cur_screen != draw->dri_screen) {
173 blit_context.ctx = draw->ext->core->createNewContext(draw->dri_screen,
175 blit_context.cur_screen = draw->dri_screen;
176 blit_context.core = draw->ext->core;
195 * \param draw[in] The drawable which owns the images.
208 loader_dri3_blit_image(struct loader_dri3_drawable *draw,
216 if (!loader_dri3_have_image_blit(draw))
219 dri_context = draw->vtable->get_dri_context(draw);
221 if (!dri_context || !draw->vtable->in_current_context(draw)) {
222 dri_context = loader_dri3_blit_context_get(draw);
228 draw->ext->image->blitImage(dri_context, dst, src, dstx0, dsty0,
257 dri3_fence_await(xcb_connection_t *c, struct loader_dri3_drawable *draw,
262 if (draw) {
263 mtx_lock(&draw->mtx);
264 dri3_flush_present_events(draw);
265 mtx_unlock(&draw->mtx);
270 dri3_update_max_num_back(struct loader_dri3_drawable *draw)
272 switch (draw->last_present_mode) {
276 if (draw->swap_interval == 0)
283 if (new_max != draw->max_num_back) {
288 if (new_max < draw->max_num_back)
289 draw->cur_num_back = 2;
291 draw->max_num_back = new_max;
304 if (draw->max_num_back != 2)
305 draw->cur_num_back = 1;
307 draw->max_num_back = 2;
312 loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval)
325 if (draw->swap_interval != interval)
326 loader_dri3_swapbuffer_barrier(draw);
328 draw->swap_interval = interval;
337 dri3_free_render_buffer(struct loader_dri3_drawable *draw,
341 xcb_free_pixmap(draw->conn, buffer->pixmap);
342 xcb_sync_destroy_fence(draw->conn, buffer->sync_fence);
344 draw->ext->image->destroyImage(buffer->image);
346 draw->ext->image->destroyImage(buffer->linear_buffer);
351 loader_dri3_drawable_fini(struct loader_dri3_drawable *draw)
355 draw->ext->core->destroyDrawable(draw->dri_drawable);
357 for (i = 0; i < ARRAY_SIZE(draw->buffers); i++) {
358 if (draw->buffers[i])
359 dri3_free_render_buffer(draw, draw->buffers[i]);
362 if (draw->special_event) {
364 xcb_present_select_input_checked(draw->conn, draw->eid, draw->drawable,
367 xcb_discard_reply(draw->conn, cookie.sequence);
368 xcb_unregister_for_special_event(draw->conn, draw->special_event);
371 if (draw->region)
372 xcb_xfixes_destroy_region(draw->conn, draw->region);
374 cnd_destroy(&draw->event_cnd);
375 mtx_destroy(&draw->mtx);
389 struct loader_dri3_drawable *draw)
395 draw->conn = conn;
396 draw->ext = ext;
397 draw->vtable = vtable;
398 draw->drawable = drawable;
399 draw->type = type;
400 draw->region = 0;
401 draw->dri_screen = dri_screen;
402 draw->is_different_gpu = is_different_gpu;
403 draw->multiplanes_available = multiplanes_available;
404 draw->prefer_back_buffer_reuse = prefer_back_buffer_reuse;
406 draw->have_back = 0;
407 draw->have_fake_front = 0;
408 draw->first_init = true;
409 draw->adaptive_sync = false;
410 draw->adaptive_sync_active = false;
412 draw->cur_blit_source = -1;
413 draw->back_format = __DRI_IMAGE_FORMAT_NONE;
414 mtx_init(&draw->mtx, mtx_plain);
415 cnd_init(&draw->event_cnd);
417 if (draw->ext->config) {
420 draw->ext->config->configQueryb(draw->dri_screen,
424 draw->adaptive_sync = adaptive_sync;
427 if (!draw->adaptive_sync)
428 set_adaptive_sync_property(conn, draw->drawable, false);
430 draw->swap_interval = dri_get_initial_swap_interval(draw->dri_screen,
431 draw->ext->config);
433 dri3_update_max_num_back(draw);
436 draw->dri_drawable =
437 draw->ext->image_driver->createNewDrawable(dri_screen,
439 draw);
441 if (!draw->dri_drawable)
444 cookie = xcb_get_geometry(draw->conn, draw->drawable);
445 reply = xcb_get_geometry_reply(draw->conn, cookie, &error);
447 draw->ext->core->destroyDrawable(draw->dri_drawable);
451 draw->screen = get_screen_for_root(draw->conn, reply->root);
452 draw->width = reply->width;
453 draw->height = reply->height;
454 draw->depth = reply->depth;
455 draw->vtable->set_drawable_size(draw, draw->width, draw->height);
458 draw->swap_method = __DRI_ATTRIB_SWAP_UNDEFINED;
459 if (draw->ext->core->base.version >= 2) {
460 (void )draw->ext->core->getConfigAttrib(dri_config,
462 &draw->swap_method);
469 loader_dri3_set_swap_interval(draw, draw->swap_interval);
478 dri3_handle_present_event(struct loader_dri3_drawable *draw,
485 draw->width = ce->width;
486 draw->height = ce->height;
487 draw->vtable->set_drawable_size(draw, draw->width, draw->height);
488 draw->ext->flush->invalidate(draw->dri_drawable);
499 uint64_t recv_sbc = (draw->send_sbc & 0xffffffff00000000LL) | ce->serial;
506 if (recv_sbc <= draw->send_sbc)
507 draw->recv_sbc = recv_sbc;
508 else if (recv_sbc == (draw->recv_sbc + 0x100000001ULL))
509 draw->recv_sbc = recv_sbc - 0x100000000ULL;
516 draw->last_present_mode == XCB_PRESENT_COMPLETE_MODE_FLIP) {
517 for (int b = 0; b < ARRAY_SIZE(draw->buffers); b++) {
518 if (draw->buffers[b])
519 draw->buffers[b]->reallocate = true;
528 draw->last_present_mode != ce->mode) {
529 for (int b = 0; b < ARRAY_SIZE(draw->buffers); b++) {
530 if (draw->buffers[b])
531 draw->buffers[b]->reallocate = true;
535 draw->last_present_mode = ce->mode;
537 if (draw->vtable->show_fps)
538 draw->vtable->show_fps(draw, ce->ust);
540 draw->ust = ce->ust;
541 draw->msc = ce->msc;
542 } else if (ce->serial == draw->eid) {
543 draw->notify_ust = ce->ust;
544 draw->notify_msc = ce->msc;
552 for (b = 0; b < ARRAY_SIZE(draw->buffers); b++) {
553 struct loader_dri3_buffer *buf = draw->buffers[b];
565 dri3_wait_for_event_locked(struct loader_dri3_drawable *draw,
571 xcb_flush(draw->conn);
574 if (draw->has_event_waiter) {
575 cnd_wait(&draw->event_cnd, &draw->mtx);
577 *full_sequence = draw->last_special_event_sequence;
581 draw->has_event_waiter = true;
583 mtx_unlock(&draw->mtx);
584 ev = xcb_wait_for_special_event(draw->conn, draw->special_event);
585 mtx_lock(&draw->mtx);
586 draw->has_event_waiter = false;
587 cnd_broadcast(&draw->event_cnd);
591 draw->last_special_event_sequence = ev->full_sequence;
595 dri3_handle_present_event(draw, ge);
605 loader_dri3_wait_for_msc(struct loader_dri3_drawable *draw,
610 xcb_void_cookie_t cookie = xcb_present_notify_msc(draw->conn,
611 draw->drawable,
612 draw->eid,
618 mtx_lock(&draw->mtx);
622 if (!dri3_wait_for_event_locked(draw, &full_sequence)) {
623 mtx_unlock(&draw->mtx);
626 } while (full_sequence != cookie.sequence || draw->notify_msc < target_msc);
628 *ust = draw->notify_ust;
629 *msc = draw->notify_msc;
630 *sbc = draw->recv_sbc;
631 mtx_unlock(&draw->mtx);
643 loader_dri3_wait_for_sbc(struct loader_dri3_drawable *draw,
653 mtx_lock(&draw->mtx);
655 target_sbc = draw->send_sbc;
657 while (draw->recv_sbc < target_sbc) {
658 if (!dri3_wait_for_event_locked(draw, NULL)) {
659 mtx_unlock(&draw->mtx);
664 *ust = draw->ust;
665 *msc = draw->msc;
666 *sbc = draw->recv_sbc;
667 mtx_unlock(&draw->mtx);
677 dri3_find_back(struct loader_dri3_drawable *draw, bool prefer_a_different)
683 mtx_lock(&draw->mtx);
685 dri3_flush_present_events(draw);
690 if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1) {
693 draw->cur_blit_source = -1;
695 num_to_consider = draw->cur_num_back;
696 max_num = draw->max_num_back;
708 int current_back_id = draw->cur_back;
711 int id = LOADER_DRI3_BACK_ID((b + draw->cur_back) % draw->cur_num_back);
712 struct loader_dri3_buffer *buffer = draw->buffers[id];
716 draw->cur_back = id;
717 mtx_unlock(&draw->mtx);
723 num_to_consider = ++draw->cur_num_back;
726 } else if (!dri3_wait_for_event_locked(draw, NULL)) {
727 mtx_unlock(&draw->mtx);
734 dri3_drawable_gc(struct loader_dri3_drawable *draw)
736 if (!draw->gc) {
738 xcb_create_gc(draw->conn,
739 (draw->gc = xcb_generate_id(draw->conn)),
740 draw->drawable,
744 return draw->gc;
749 dri3_back_buffer(struct loader_dri3_drawable *draw)
751 return draw->buffers[LOADER_DRI3_BACK_ID(draw->cur_back)];
755 dri3_front_buffer(struct loader_dri3_drawable *draw)
757 return draw->buffers[LOADER_DRI3_FRONT_ID];
794 loader_dri3_flush(struct loader_dri3_drawable *draw,
799 __DRIcontext *dri_context = draw->vtable->get_dri_context(draw);
802 draw->ext->flush->flush_with_flags(dri_context, draw->dri_drawable,
808 loader_dri3_copy_sub_buffer(struct loader_dri3_drawable *draw,
817 if (!draw->have_back || draw->type != LOADER_DRI3_DRAWABLE_WINDOW)
822 loader_dri3_flush(draw, flags, __DRI2_THROTTLE_COPYSUBBUFFER);
824 back = dri3_find_back_alloc(draw);
828 y = draw->height - y - height;
830 if (draw->is_different_gpu) {
834 (void) loader_dri3_blit_image(draw,
841 loader_dri3_swapbuffer_barrier(draw);
842 dri3_fence_reset(draw->conn, back);
843 dri3_copy_area(draw->conn,
845 draw->drawable,
846 dri3_drawable_gc(draw),
848 dri3_fence_trigger(draw->conn, back);
852 if (draw->have_fake_front &&
853 !loader_dri3_blit_image(draw,
854 dri3_front_buffer(draw)->image,
858 !draw->is_different_gpu) {
859 dri3_fence_reset(draw->conn, dri3_front_buffer(draw));
860 dri3_copy_area(draw->conn,
862 dri3_front_buffer(draw)->pixmap,
863 dri3_drawable_gc(draw),
865 dri3_fence_trigger(draw->conn, dri3_front_buffer(draw));
866 dri3_fence_await(draw->conn, NULL, dri3_front_buffer(draw));
868 dri3_fence_await(draw->conn, draw, back);
872 loader_dri3_copy_drawable(struct loader_dri3_drawable *draw,
876 loader_dri3_flush(draw, __DRI2_FLUSH_DRAWABLE, __DRI2_THROTTLE_COPYSUBBUFFER);
878 struct loader_dri3_buffer *front = dri3_front_buffer(draw);
880 dri3_fence_reset(draw->conn, front);
882 dri3_copy_area(draw->conn,
884 dri3_drawable_gc(draw),
885 0, 0, 0, 0, draw->width, draw->height);
888 dri3_fence_trigger(draw->conn, front);
889 dri3_fence_await(draw->conn, draw, front);
894 loader_dri3_wait_x(struct loader_dri3_drawable *draw)
898 if (draw == NULL || !draw->have_fake_front)
901 front = dri3_front_buffer(draw);
903 loader_dri3_copy_drawable(draw, front->pixmap, draw->drawable);
910 if (draw->is_different_gpu)
911 (void) loader_dri3_blit_image(draw,
919 loader_dri3_wait_gl(struct loader_dri3_drawable *draw)
923 if (draw == NULL || !draw->have_fake_front)
926 front = dri3_front_buffer(draw);
931 if (draw->is_different_gpu)
932 (void) loader_dri3_blit_image(draw,
937 loader_dri3_swapbuffer_barrier(draw);
938 loader_dri3_copy_drawable(draw, draw->drawable, front->pixmap);
946 dri3_flush_present_events(struct loader_dri3_drawable *draw)
951 if (draw->has_event_waiter)
954 if (draw->special_event) {
957 while ((ev = xcb_poll_for_special_event(draw->conn,
958 draw->special_event)) != NULL) {
960 dri3_handle_present_event(draw, ge);
970 loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw,
980 * void glXSwapBuffers(Display *dpy, GLXDrawable draw);
981 * This operation is a no-op if draw was created with a non-double-buffered
982 * GLXFBConfig, or if draw is a GLXPixmap.
1004 if (!draw->have_back || draw->type == LOADER_DRI3_DRAWABLE_PIXMAP)
1007 draw->vtable->flush_drawable(draw, flush_flags);
1009 back = dri3_find_back_alloc(draw);
1014 mtx_lock(&draw->mtx);
1016 if (draw->adaptive_sync && !draw->adaptive_sync_active) {
1017 set_adaptive_sync_property(draw->conn, draw->drawable, true);
1018 draw->adaptive_sync_active = true;
1021 if (draw->is_different_gpu) {
1023 (void) loader_dri3_blit_image(draw,
1034 if (draw->swap_method != __DRI_ATTRIB_SWAP_UNDEFINED || force_copy)
1035 draw->cur_blit_source = LOADER_DRI3_BACK_ID(draw->cur_back);
1040 if (draw->have_fake_front) {
1043 tmp = dri3_front_buffer(draw);
1044 draw->buffers[LOADER_DRI3_FRONT_ID] = back;
1045 draw->buffers[LOADER_DRI3_BACK_ID(draw->cur_back)] = tmp;
1047 if (draw->swap_method == __DRI_ATTRIB_SWAP_COPY || force_copy)
1048 draw->cur_blit_source = LOADER_DRI3_FRONT_ID;
1051 dri3_flush_present_events(draw);
1053 if (draw->type == LOADER_DRI3_DRAWABLE_WINDOW) {
1054 dri3_fence_reset(draw->conn, back);
1061 ++draw->send_sbc;
1063 target_msc = draw->msc + abs(draw->swap_interval) *
1064 (draw->send_sbc - draw->recv_sbc);
1096 if (draw->swap_interval <= 0)
1103 if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1)
1106 if (draw->multiplanes_available)
1110 back->last_swap = draw->send_sbc;
1112 if (!draw->region) {
1113 draw->region = xcb_generate_id(draw->conn);
1114 xcb_xfixes_create_region(draw->conn, draw->region, 0, NULL);
1124 xcb_rects[i].y = draw->height - rect[1] - rect[3];
1129 region = draw->region;
1130 xcb_xfixes_set_region(draw->conn, region, n_rects, xcb_rects);
1133 xcb_present_pixmap(draw->conn,
1134 draw->drawable,
1136 (uint32_t) draw->send_sbc,
1150 assert(draw->type == LOADER_DRI3_DRAWABLE_PBUFFER);
1155 draw->send_sbc++;
1156 draw->recv_sbc = back->last_swap = draw->send_sbc;
1162 if (draw->is_different_gpu ||
1163 !loader_dri3_blit_image(draw,
1164 dri3_front_buffer(draw)->image,
1166 0, 0, draw->width, draw->height,
1168 dri3_copy_area(draw->conn, back->pixmap,
1169 draw->drawable,
1170 dri3_drawable_gc(draw),
1171 0, 0, 0, 0, draw->width, draw->height);
1175 ret = (int64_t) draw->send_sbc;
1183 if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1 &&
1184 draw->cur_blit_source != LOADER_DRI3_BACK_ID(draw->cur_back)) {
1185 struct loader_dri3_buffer *new_back = dri3_back_buffer(draw);
1186 struct loader_dri3_buffer *src = draw->buffers[draw->cur_blit_source];
1188 dri3_fence_reset(draw->conn, new_back);
1189 dri3_copy_area(draw->conn, src->pixmap,
1191 dri3_drawable_gc(draw),
1192 0, 0, 0, 0, draw->width, draw->height);
1193 dri3_fence_trigger(draw->conn, new_back);
1197 xcb_flush(draw->conn);
1198 if (draw->stamp)
1199 ++(*draw->stamp);
1201 mtx_unlock(&draw->mtx);
1203 draw->ext->flush->invalidate(draw->dri_drawable);
1209 loader_dri3_query_buffer_age(struct loader_dri3_drawable *draw)
1211 struct loader_dri3_buffer *back = dri3_find_back_alloc(draw);
1214 mtx_lock(&draw->mtx);
1216 draw->send_sbc - back->last_swap + 1;
1217 mtx_unlock(&draw->mtx);
1301 dri3_linear_format_for_format(struct loader_dri3_drawable *draw, uint32_t format)
1307 if (dri3_get_red_mask_for_depth(draw, 30) == 0x3ff)
1315 if (dri3_get_red_mask_for_depth(draw, 30) == 0x3ff)
1358 has_supported_modifier(struct loader_dri3_drawable *draw, unsigned int format,
1366 if (!draw->ext->image->queryDmaBufModifiers(draw->dri_screen,
1376 draw->ext->image->queryDmaBufModifiers(draw->dri_screen, format,
1401 dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
1438 if (!draw->is_different_gpu) {
1440 if (draw->multiplanes_available &&
1441 draw->ext->image->base.version >= 15 &&
1442 draw->ext->image->queryDmaBufModifiers &&
1443 draw->ext->image->createImageWithModifiers) {
1448 mod_cookie = xcb_dri3_get_supported_modifiers(draw->conn,
1449 draw->window,
1451 mod_reply = xcb_dri3_get_supported_modifiers_reply(draw->conn,
1469 if (!has_supported_modifier(draw, image_format_to_fourcc(format),
1494 buffer->image = loader_dri_create_image(draw->dri_screen, draw->ext->image,
1499 (draw->is_protected_content ?
1509 buffer->image = draw->ext->image->createImage(draw->dri_screen,
1522 if (draw->dri_screen_display_gpu) {
1524 draw->ext->image->createImage(draw->dri_screen_display_gpu,
1526 dri3_linear_format_for_format(draw, format),
1537 draw->ext->image->createImage(draw->dri_screen,
1539 dri3_linear_format_for_format(draw, format),
1556 if (!draw->ext->image->queryImage(pixmap_buffer, __DRI_IMAGE_ATTRIB_NUM_PLANES,
1561 __DRIimage *image = draw->ext->image->fromPlanar(pixmap_buffer, i, NULL);
1570 ret = draw->ext->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD,
1572 ret &= draw->ext->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE,
1574 ret &= draw->ext->image->queryImage(image, __DRI_IMAGE_ATTRIB_OFFSET,
1577 draw->ext->image->destroyImage(image);
1583 ret = draw->ext->image->queryImage(pixmap_buffer,
1586 ret &= draw->ext->image->queryImage(pixmap_buffer,
1593 if (draw->is_different_gpu && draw->dri_screen_display_gpu &&
1598 if (draw->ext->image->base.version >= 20)
1600 draw->ext->image->createImageFromFds2(draw->dri_screen,
1611 draw->ext->image->createImageFromFds(draw->dri_screen,
1622 draw->ext->image->destroyImage(linear_buffer_display_gpu);
1625 pixmap = xcb_generate_id(draw->conn);
1627 if (draw->multiplanes_available &&
1629 xcb_dri3_pixmap_from_buffers(draw->conn,
1631 draw->window,
1644 xcb_dri3_pixmap_from_buffer(draw->conn,
1646 draw->drawable,
1653 xcb_dri3_fence_from_fd(draw->conn,
1655 (sync_fence = xcb_generate_id(draw->conn)),
1677 draw->ext->image->destroyImage(pixmap_buffer);
1679 if (draw->is_different_gpu)
1680 draw->ext->image->destroyImage(buffer->image);
1691 dri3_detect_drawable_is_window(struct loader_dri3_drawable *draw)
1703 xcb_present_select_input_checked(draw->conn, draw->eid, draw->drawable,
1711 xcb_generic_error_t *error = xcb_request_check(draw->conn, cookie);
1721 draw->type = LOADER_DRI3_DRAWABLE_PBUFFER;
1725 draw->type = LOADER_DRI3_DRAWABLE_WINDOW;
1730 dri3_setup_present_event(struct loader_dri3_drawable *draw)
1733 if (draw->type == LOADER_DRI3_DRAWABLE_PIXMAP ||
1734 draw->type == LOADER_DRI3_DRAWABLE_PBUFFER)
1737 draw->eid = xcb_generate_id(draw->conn);
1739 if (draw->type == LOADER_DRI3_DRAWABLE_WINDOW) {
1740 xcb_present_select_input(draw->conn, draw->eid, draw->drawable,
1745 assert(draw->type == LOADER_DRI3_DRAWABLE_UNKNOWN);
1747 if (!dri3_detect_drawable_is_window(draw))
1750 if (draw->type != LOADER_DRI3_DRAWABLE_WINDOW)
1757 draw->special_event = xcb_register_for_special_xge(draw->conn,
1759 draw->eid,
1760 draw->stamp);
1771 dri3_update_drawable(struct loader_dri3_drawable *draw)
1773 mtx_lock(&draw->mtx);
1774 if (draw->first_init) {
1779 draw->first_init = false;
1781 if (!dri3_setup_present_event(draw)) {
1782 mtx_unlock(&draw->mtx);
1786 geom_cookie = xcb_get_geometry(draw->conn, draw->drawable);
1788 geom_reply = xcb_get_geometry_reply(draw->conn, geom_cookie, NULL);
1791 mtx_unlock(&draw->mtx);
1794 draw->width = geom_reply->width;
1795 draw->height = geom_reply->height;
1796 draw->depth = geom_reply->depth;
1797 draw->vtable->set_drawable_size(draw, draw->width, draw->height);
1802 if (draw->type != LOADER_DRI3_DRAWABLE_WINDOW)
1803 draw->window = root_win;
1805 draw->window = draw->drawable;
1807 dri3_flush_present_events(draw);
1808 mtx_unlock(&draw->mtx);
1908 struct loader_dri3_drawable *draw)
1911 struct loader_dri3_buffer *buffer = draw->buffers[buf_id];
1923 pixmap = draw->drawable;
1942 cur_screen = draw->vtable->get_dri_screen();
1944 cur_screen = draw->dri_screen;
1947 xcb_dri3_fence_from_fd(draw->conn,
1949 (sync_fence = xcb_generate_id(draw->conn)),
1953 if (draw->multiplanes_available &&
1954 draw->ext->image->base.version >= 15 &&
1955 draw->ext->image->createImageFromDmaBufs2) {
1959 bps_cookie = xcb_dri3_buffers_from_pixmap(draw->conn, pixmap);
1960 bps_reply = xcb_dri3_buffers_from_pixmap_reply(draw->conn, bps_cookie,
1965 loader_dri3_create_image_from_buffers(draw->conn, bps_reply, format,
1966 cur_screen, draw->ext->image,
1977 bp_cookie = xcb_dri3_buffer_from_pixmap(draw->conn, pixmap);
1978 bp_reply = xcb_dri3_buffer_from_pixmap_reply(draw->conn, bp_cookie, NULL);
1982 buffer->image = loader_dri3_create_image(draw->conn, bp_reply, format,
1983 cur_screen, draw->ext->image,
2000 draw->buffers[buf_id] = buffer;
2005 xcb_sync_destroy_fence(draw->conn, sync_fence);
2021 struct loader_dri3_drawable *draw)
2028 draw->back_format = format;
2030 buf_id = dri3_find_back(draw, !draw->prefer_back_buffer_reuse);
2038 buffer = draw->buffers[buf_id];
2043 if (!buffer || buffer->width != draw->width ||
2044 buffer->height != draw->height ||
2050 new_buffer = dri3_alloc_render_buffer(draw,
2052 draw->width,
2053 draw->height,
2054 draw->depth);
2062 (buffer_type == loader_dri3_buffer_front && draw->have_fake_front))
2066 if (!loader_dri3_blit_image(draw,
2074 dri3_fence_reset(draw->conn, new_buffer);
2075 dri3_copy_area(draw->conn,
2078 dri3_drawable_gc(draw),
2080 draw->width, draw->height);
2081 dri3_fence_trigger(draw->conn, new_buffer);
2084 dri3_free_render_buffer(draw, buffer);
2087 loader_dri3_swapbuffer_barrier(draw);
2088 dri3_fence_reset(draw->conn, new_buffer);
2089 dri3_copy_area(draw->conn,
2090 draw->drawable,
2092 dri3_drawable_gc(draw),
2094 draw->width, draw->height);
2095 dri3_fence_trigger(draw->conn, new_buffer);
2098 dri3_fence_await(draw->conn, draw, new_buffer);
2099 (void) loader_dri3_blit_image(draw,
2102 0, 0, draw->width, draw->height,
2108 draw->buffers[buf_id] = buffer;
2112 dri3_fence_await(draw->conn, draw, buffer);
2124 draw->cur_blit_source != -1 &&
2125 draw->buffers[draw->cur_blit_source] &&
2126 buffer != draw->buffers[draw->cur_blit_source]) {
2128 struct loader_dri3_buffer *source = draw->buffers[draw->cur_blit_source];
2131 (void) loader_dri3_blit_image(draw,
2134 0, 0, draw->width, draw->height,
2137 draw->cur_blit_source = -1;
2151 struct loader_dri3_drawable *draw)
2162 draw->cur_blit_source = -1;
2167 n_id = (draw->cur_blit_source == LOADER_DRI3_FRONT_ID) ? 0 : 1;
2174 buffer = draw->buffers[buf_id];
2176 dri3_free_render_buffer(draw, buffer);
2177 draw->buffers[buf_id] = NULL;
2196 struct loader_dri3_drawable *draw = loaderPrivate;
2207 if (!dri3_update_drawable(draw))
2210 dri3_update_max_num_back(draw);
2213 for (buf_id = draw->cur_num_back; buf_id < LOADER_DRI3_MAX_BACK; buf_id++) {
2214 if (draw->cur_blit_source != buf_id && draw->buffers[buf_id]) {
2215 dri3_free_render_buffer(draw, draw->buffers[buf_id]);
2216 draw->buffers[buf_id] = NULL;
2223 if (draw->type != LOADER_DRI3_DRAWABLE_WINDOW ||
2224 draw->swap_method == __DRI_ATTRIB_SWAP_EXCHANGE)
2236 if (draw->type != LOADER_DRI3_DRAWABLE_WINDOW && !draw->is_different_gpu)
2240 draw);
2245 draw);
2250 dri3_free_buffers(driDrawable, loader_dri3_buffer_front, draw);
2251 draw->have_fake_front = 0;
2258 draw);
2261 draw->have_back = 1;
2263 dri3_free_buffers(driDrawable, loader_dri3_buffer_back, draw);
2264 draw->have_back = 0;
2270 draw->have_fake_front =
2271 draw->is_different_gpu ||
2272 draw->type == LOADER_DRI3_DRAWABLE_WINDOW;
2280 draw->stamp = stamp;
2290 loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw)
2295 geom_cookie = xcb_get_geometry(draw->conn, draw->drawable);
2297 geom_reply = xcb_get_geometry_reply(draw->conn, geom_cookie, NULL);
2300 draw->width = geom_reply->width;
2301 draw->height = geom_reply->height;
2302 draw->vtable->set_drawable_size(draw, draw->width, draw->height);
2303 draw->ext->flush->invalidate(draw->dri_drawable);
2317 loader_dri3_swapbuffer_barrier(struct loader_dri3_drawable *draw)
2321 (void) loader_dri3_wait_for_sbc(draw, 0, &ust, &msc, &sbc);
2344 * \param draw[in,out] Pointer to the drawable for which to find back.
2353 dri3_find_back_alloc(struct loader_dri3_drawable *draw)
2358 id = dri3_find_back(draw, false);
2362 back = draw->buffers[id];
2364 if (!back && draw->back_format != __DRI_IMAGE_FORMAT_NONE &&
2365 dri3_update_drawable(draw))
2366 back = dri3_alloc_render_buffer(draw, draw->back_format,
2367 draw->width, draw->height, draw->depth);
2372 draw->buffers[id] = back;
2375 if (draw->cur_blit_source != -1 &&
2376 draw->buffers[draw->cur_blit_source] &&
2377 back != draw->buffers[draw->cur_blit_source]) {
2378 struct loader_dri3_buffer *source = draw->buffers[draw->cur_blit_source];
2380 dri3_fence_await(draw->conn, draw, source);
2381 dri3_fence_await(draw->conn, draw, back);
2382 (void) loader_dri3_blit_image(draw,
2385 0, 0, draw->width, draw->height,
2388 draw->cur_blit_source = -1;