static _EGLImage * dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx, EGLClientBuffer buffer, const EGLint *attr_list) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_image *dri2_img; unsigned int attachments[1]; xcb_drawable_t drawable; xcb_dri2_get_buffers_cookie_t buffers_cookie; xcb_dri2_get_buffers_reply_t *buffers_reply; xcb_dri2_dri2_buffer_t *buffers; xcb_get_geometry_cookie_t geometry_cookie; xcb_get_geometry_reply_t *geometry_reply; xcb_generic_error_t *error; int stride, format; (void) ctx; drawable = (xcb_drawable_t) (uintptr_t) buffer; xcb_dri2_create_drawable (dri2_dpy->conn, drawable); attachments[0] = XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT; buffers_cookie = xcb_dri2_get_buffers_unchecked (dri2_dpy->conn, drawable, 1, 1, attachments); geometry_cookie = xcb_get_geometry (dri2_dpy->conn, drawable); buffers_reply = xcb_dri2_get_buffers_reply (dri2_dpy->conn, buffers_cookie, NULL); buffers = xcb_dri2_get_buffers_buffers (buffers_reply); if (buffers == NULL) { return NULL; } geometry_reply = xcb_get_geometry_reply (dri2_dpy->conn, geometry_cookie, &error); if (geometry_reply == NULL || error != NULL) { _eglError(EGL_BAD_ALLOC, "xcb_get_geometry"); free(error); free(buffers_reply); return NULL; } switch (geometry_reply->depth) { case 16: format = __DRI_IMAGE_FORMAT_RGB565; break; case 24: format = __DRI_IMAGE_FORMAT_XRGB8888; break; case 32: format = __DRI_IMAGE_FORMAT_ARGB8888; break; default: _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr: unsupported pixmap depth"); free(buffers_reply); free(geometry_reply); return NULL; } dri2_img = malloc(sizeof *dri2_img); if (!dri2_img) { free(buffers_reply); free(geometry_reply); _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr"); return EGL_NO_IMAGE_KHR; } if (!_eglInitImage(&dri2_img->base, disp)) { free(buffers_reply); free(geometry_reply); free(dri2_img); return EGL_NO_IMAGE_KHR; } stride = buffers[0].pitch / buffers[0].cpp; dri2_img->dri_image = dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen, buffers_reply->width, buffers_reply->height, format, buffers[0].name, stride, dri2_img); free(buffers_reply); free(geometry_reply); return &dri2_img->base; }
static _EGLImage * dri2_create_image_android_native_buffer(_EGLDisplay *disp, _EGLContext *ctx, struct ANativeWindowBuffer *buf) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_image *dri2_img; int name; EGLint format; if (ctx != NULL) { /* From the EGL_ANDROID_image_native_buffer spec: * * * If <target> is EGL_NATIVE_BUFFER_ANDROID and <ctx> is not * EGL_NO_CONTEXT, the error EGL_BAD_CONTEXT is generated. */ _eglError(EGL_BAD_CONTEXT, "eglCreateEGLImageKHR: for " "EGL_NATIVE_BUFFER_ANDROID, the context must be " "EGL_NO_CONTEXT"); return NULL; } if (!buf || buf->common.magic != ANDROID_NATIVE_BUFFER_MAGIC || buf->common.version != sizeof(*buf)) { _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR"); return NULL; } name = get_native_buffer_name(buf); if (!name) { _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR"); return NULL; } /* see the table in droid_add_configs_for_visuals */ switch (buf->format) { case HAL_PIXEL_FORMAT_BGRA_8888: format = __DRI_IMAGE_FORMAT_ARGB8888; break; case HAL_PIXEL_FORMAT_RGB_565: format = __DRI_IMAGE_FORMAT_RGB565; break; case HAL_PIXEL_FORMAT_RGBA_8888: format = __DRI_IMAGE_FORMAT_ABGR8888; break; case HAL_PIXEL_FORMAT_RGBX_8888: format = __DRI_IMAGE_FORMAT_XBGR8888; break; case HAL_PIXEL_FORMAT_RGB_888: case HAL_PIXEL_FORMAT_RGBA_5551: case HAL_PIXEL_FORMAT_RGBA_4444: /* unsupported */ default: _eglLog(_EGL_WARNING, "unsupported native buffer format 0x%x", buf->format); return NULL; break; } dri2_img = calloc(1, sizeof(*dri2_img)); if (!dri2_img) { _eglError(EGL_BAD_ALLOC, "droid_create_image_mesa_drm"); return NULL; } if (!_eglInitImage(&dri2_img->base, disp)) { free(dri2_img); return NULL; } dri2_img->dri_image = dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen, buf->width, buf->height, format, name, buf->stride, dri2_img); if (!dri2_img->dri_image) { free(dri2_img); _eglError(EGL_BAD_ALLOC, "droid_create_image_mesa_drm"); return NULL; } return &dri2_img->base; }