BOOL DRI3PixmapFromDmaBuf(Display *dpy, int screen, int fd, int width, int height, int stride, int depth, int bpp, Pixmap *pixmap) { xcb_connection_t *xcb_connection = XGetXCBConnection(dpy); Window root = RootWindow(dpy, screen); xcb_void_cookie_t cookie; xcb_generic_error_t *error; cookie = xcb_dri3_pixmap_from_buffer_checked(xcb_connection, (*pixmap = xcb_generate_id(xcb_connection)), root, 0, width, height, stride, depth, bpp, fd); error = xcb_request_check(xcb_connection, cookie); /* performs a flush */ if (error) { ERR("Error using DRI3 to convert a DmaBufFd to pixmap\n"); return FALSE; } return TRUE; }
static VkResult x11_image_init(VkDevice device_h, struct x11_swapchain *chain, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks* pAllocator, struct x11_image *image) { xcb_void_cookie_t cookie; VkResult result; uint32_t row_pitch; uint32_t offset; uint32_t bpp = 32; int fd; uint32_t size; result = chain->base.image_fns->create_wsi_image(device_h, pCreateInfo, pAllocator, &image->image, &image->memory, &size, &offset, &row_pitch, &fd); if (result != VK_SUCCESS) return result; image->pixmap = xcb_generate_id(chain->conn); cookie = xcb_dri3_pixmap_from_buffer_checked(chain->conn, image->pixmap, chain->window, size, pCreateInfo->imageExtent.width, pCreateInfo->imageExtent.height, row_pitch, chain->depth, bpp, fd); xcb_discard_reply(chain->conn, cookie.sequence); int fence_fd = xshmfence_alloc_shm(); if (fence_fd < 0) goto fail_pixmap; image->shm_fence = xshmfence_map_shm(fence_fd); if (image->shm_fence == NULL) goto fail_shmfence_alloc; image->sync_fence = xcb_generate_id(chain->conn); xcb_dri3_fence_from_fd(chain->conn, image->pixmap, image->sync_fence, false, fence_fd); image->busy = false; xshmfence_trigger(image->shm_fence); return VK_SUCCESS; fail_shmfence_alloc: close(fence_fd); fail_pixmap: cookie = xcb_free_pixmap(chain->conn, image->pixmap); xcb_discard_reply(chain->conn, cookie.sequence); chain->base.image_fns->free_wsi_image(device_h, pAllocator, image->image, image->memory); return result; }