Module: Mesa Branch: main Commit: efe12ae7ee1801d8d05c4069b793766b2f06cb7b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=efe12ae7ee1801d8d05c4069b793766b2f06cb7b
Author: Roman Stratiienko <r.stratiie...@gmail.com> Date: Thu Jul 27 21:42:44 2023 +0300 egl/android: Switch to generic buffer-info code Switch to a new common buffer-info layer. After this change, the virgl fallback logic is changed, but it should work as well. Signed-off-by: Roman Stratiienko <r.stratiie...@gmail.com> Tested-by: Mauro Rossi <issor.or...@gmail.com> Reviewed-by: Yiwei Zhang <zzyi...@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24374> --- src/egl/drivers/dri2/egl_dri2.c | 4 + src/egl/drivers/dri2/egl_dri2.h | 4 +- src/egl/drivers/dri2/platform_android.c | 450 +++-------------------- src/egl/drivers/dri2/platform_android.h | 34 -- src/egl/drivers/dri2/platform_android_mapper.cpp | 230 ------------ src/egl/meson.build | 7 +- 6 files changed, 59 insertions(+), 670 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 16f6a096971..992f0e3d46d 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1243,6 +1243,10 @@ dri2_display_destroy(_EGLDisplay *disp) free(dri2_dpy->device_name); #endif +#ifdef HAVE_ANDROID_PLATFORM + u_gralloc_destroy(&dri2_dpy->gralloc); +#endif + switch (disp->Platform) { case _EGL_PLATFORM_X11: dri2_teardown_x11(dri2_dpy); diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 5edd810f476..57d8820c079 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -72,6 +72,8 @@ struct zwp_linux_dmabuf_feedback_v1; #include <hardware/gralloc.h> +#include "util/u_gralloc/u_gralloc.h" + #if ANDROID_API_LEVEL >= 26 #include <vndk/window.h> #else @@ -311,7 +313,7 @@ struct dri2_egl_display { #endif #ifdef HAVE_ANDROID_PLATFORM - const gralloc_module_t *gralloc; + struct u_gralloc *gralloc; /* gralloc vendor usage bit for front rendering */ uint32_t front_rendering_usage; #endif diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 4fb5621edf8..76fbef104de 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -48,390 +48,29 @@ #include "loader.h" #include "platform_android.h" -#define ALIGN(val, align) (((val) + (align)-1) & ~((align)-1)) - -enum chroma_order { - YCbCr, - YCrCb, -}; - -struct droid_yuv_format { - /* Lookup keys */ - int native; /* HAL_PIXEL_FORMAT_ */ - enum chroma_order chroma_order; /* chroma order is {Cb, Cr} or {Cr, Cb} */ - int chroma_step; /* Distance in bytes between subsequent chroma pixels. */ - - /* Result */ - int fourcc; /* DRM_FORMAT_ */ -}; - -/* The following table is used to look up a DRI image FourCC based - * on native format and information contained in android_ycbcr struct. */ -static const struct droid_yuv_format droid_yuv_formats[] = { - /* Native format, YCrCb, Chroma step, DRI image FourCC */ - {HAL_PIXEL_FORMAT_YCbCr_420_888, YCbCr, 2, DRM_FORMAT_NV12}, - {HAL_PIXEL_FORMAT_YCbCr_420_888, YCbCr, 1, DRM_FORMAT_YUV420}, - {HAL_PIXEL_FORMAT_YCbCr_420_888, YCrCb, 1, DRM_FORMAT_YVU420}, - {HAL_PIXEL_FORMAT_YV12, YCrCb, 1, DRM_FORMAT_YVU420}, - /* HACK: See droid_create_image_from_prime_fds() and - * https://issuetracker.google.com/32077885. */ - {HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, YCbCr, 2, DRM_FORMAT_NV12}, - {HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, YCbCr, 1, DRM_FORMAT_YUV420}, - {HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, YCrCb, 1, DRM_FORMAT_YVU420}, - {HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, YCrCb, 1, DRM_FORMAT_AYUV}, - {HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, YCrCb, 1, DRM_FORMAT_XYUV8888}, -}; - -static int -get_fourcc_yuv(int native, enum chroma_order chroma_order, int chroma_step) -{ - for (int i = 0; i < ARRAY_SIZE(droid_yuv_formats); ++i) - if (droid_yuv_formats[i].native == native && - droid_yuv_formats[i].chroma_order == chroma_order && - droid_yuv_formats[i].chroma_step == chroma_step) - return droid_yuv_formats[i].fourcc; - - return -1; -} - -static bool -is_yuv(int native) -{ - for (int i = 0; i < ARRAY_SIZE(droid_yuv_formats); ++i) - if (droid_yuv_formats[i].native == native) - return true; - - return false; -} - -static int -get_format_bpp(int native) -{ - int bpp; - - switch (native) { - case HAL_PIXEL_FORMAT_RGBA_FP16: - bpp = 8; - break; - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: - /* - * HACK: Hardcode this to RGBX_8888 as per cros_gralloc hack. - * TODO: Remove this once https://issuetracker.google.com/32077885 is - * fixed. - */ - case HAL_PIXEL_FORMAT_RGBX_8888: - case HAL_PIXEL_FORMAT_BGRA_8888: - case HAL_PIXEL_FORMAT_RGBA_1010102: - bpp = 4; - break; - case HAL_PIXEL_FORMAT_RGB_565: - bpp = 2; - break; - default: - bpp = 0; - break; - } - - return bpp; -} - -/* createImageFromFds requires fourcc format */ -static int -get_fourcc(int native) -{ - switch (native) { - case HAL_PIXEL_FORMAT_RGB_565: - return DRM_FORMAT_RGB565; - case HAL_PIXEL_FORMAT_BGRA_8888: - return DRM_FORMAT_ARGB8888; - case HAL_PIXEL_FORMAT_RGBA_8888: - return DRM_FORMAT_ABGR8888; - case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: - /* - * HACK: Hardcode this to RGBX_8888 as per cros_gralloc hack. - * TODO: Remove this once https://issuetracker.google.com/32077885 is - * fixed. - */ - case HAL_PIXEL_FORMAT_RGBX_8888: - return DRM_FORMAT_XBGR8888; - case HAL_PIXEL_FORMAT_RGBA_FP16: - return DRM_FORMAT_ABGR16161616F; - case HAL_PIXEL_FORMAT_RGBA_1010102: - return DRM_FORMAT_ABGR2101010; - default: - _eglLog(_EGL_WARNING, "unsupported native buffer format 0x%x", native); - } - return -1; -} - -/* returns # of fds, and by reference the actual fds */ -static unsigned -get_native_buffer_fds(struct ANativeWindowBuffer *buf, int fds[3]) -{ - native_handle_t *handle = (native_handle_t *)buf->handle; - - if (!handle) - return 0; - - /* - * Various gralloc implementations exist, but the dma-buf fd tends - * to be first. Access it directly to avoid a dependency on specific - * gralloc versions. - */ - for (int i = 0; i < handle->numFds; i++) - fds[i] = handle->data[i]; - - return handle->numFds; -} - -static int -get_yuv_buffer_info(struct dri2_egl_display *dri2_dpy, - struct ANativeWindowBuffer *buf, - struct buffer_info *out_buf_info) -{ - struct android_ycbcr ycbcr; - enum chroma_order chroma_order; - int drm_fourcc = 0; - int num_fds = 0; - int fds[3]; - int ret; - - num_fds = get_native_buffer_fds(buf, fds); - if (num_fds == 0) - return -EINVAL; - - if (!dri2_dpy->gralloc->lock_ycbcr) { - _eglLog(_EGL_WARNING, "Gralloc does not support lock_ycbcr"); - return -EINVAL; - } - - memset(&ycbcr, 0, sizeof(ycbcr)); - ret = dri2_dpy->gralloc->lock_ycbcr(dri2_dpy->gralloc, buf->handle, 0, 0, 0, - 0, 0, &ycbcr); - if (ret) { - /* HACK: See native_window_buffer_get_buffer_info() and - * https://issuetracker.google.com/32077885.*/ - if (buf->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) - return -EAGAIN; - - _eglLog(_EGL_WARNING, "gralloc->lock_ycbcr failed: %d", ret); - return -EINVAL; - } - dri2_dpy->gralloc->unlock(dri2_dpy->gralloc, buf->handle); - - chroma_order = ((size_t)ycbcr.cr < (size_t)ycbcr.cb) ? YCrCb : YCbCr; - - /* .chroma_step is the byte distance between the same chroma channel - * values of subsequent pixels, assumed to be the same for Cb and Cr. */ - drm_fourcc = get_fourcc_yuv(buf->format, chroma_order, ycbcr.chroma_step); - if (drm_fourcc == -1) { - _eglLog(_EGL_WARNING, - "unsupported YUV format, native = %x, chroma_order = %s, " - "chroma_step = %d", - buf->format, chroma_order == YCbCr ? "YCbCr" : "YCrCb", - ycbcr.chroma_step); - return -EINVAL; - } - - *out_buf_info = (struct buffer_info){ - .width = buf->width, - .height = buf->height, - .drm_fourcc = drm_fourcc, - .num_planes = ycbcr.chroma_step == 2 ? 2 : 3, - .fds = {-1, -1, -1, -1}, - .modifier = DRM_FORMAT_MOD_INVALID, - .yuv_color_space = EGL_ITU_REC601_EXT, - .sample_range = EGL_YUV_NARROW_RANGE_EXT, - .horizontal_siting = EGL_YUV_CHROMA_SITING_0_EXT, - .vertical_siting = EGL_YUV_CHROMA_SITING_0_EXT, - }; - - /* When lock_ycbcr's usage argument contains no SW_READ/WRITE flags - * it will return the .y/.cb/.cr pointers based on a NULL pointer, - * so they can be interpreted as offsets. */ - out_buf_info->offsets[0] = (size_t)ycbcr.y; - /* We assume here that all the planes are located in one DMA-buf. */ - if (chroma_order == YCrCb) { - out_buf_info->offsets[1] = (size_t)ycbcr.cr; - out_buf_info->offsets[2] = (size_t)ycbcr.cb; - } else { - out_buf_info->offsets[1] = (size_t)ycbcr.cb; - out_buf_info->offsets[2] = (size_t)ycbcr.cr; - } - - /* .ystride is the line length (in bytes) of the Y plane, - * .cstride is the line length (in bytes) of any of the remaining - * Cb/Cr/CbCr planes, assumed to be the same for Cb and Cr for fully - * planar formats. */ - out_buf_info->pitches[0] = ycbcr.ystride; - out_buf_info->pitches[1] = out_buf_info->pitches[2] = ycbcr.cstride; - - /* - * Since this is EGL_NATIVE_BUFFER_ANDROID don't assume that - * the single-fd case cannot happen. So handle eithe single - * fd or fd-per-plane case: - */ - if (num_fds == 1) { - out_buf_info->fds[1] = out_buf_info->fds[0] = fds[0]; - if (out_buf_info->num_planes == 3) - out_buf_info->fds[2] = fds[0]; - } else { - assert(num_fds == out_buf_info->num_planes); - out_buf_info->fds[0] = fds[0]; - out_buf_info->fds[1] = fds[1]; - out_buf_info->fds[2] = fds[2]; - } - - return 0; -} - -static int -native_window_buffer_get_buffer_info(struct dri2_egl_display *dri2_dpy, - struct ANativeWindowBuffer *buf, - struct buffer_info *out_buf_info) -{ - int num_planes = 0; - int drm_fourcc = 0; - int pitch = 0; - int fds[3]; - - if (is_yuv(buf->format)) { - int ret = get_yuv_buffer_info(dri2_dpy, buf, out_buf_info); - /* - * HACK: https://issuetracker.google.com/32077885 - * There is no API available to properly query the IMPLEMENTATION_DEFINED - * format. As a workaround we rely here on gralloc allocating either - * an arbitrary YCbCr 4:2:0 or RGBX_8888, with the latter being recognized - * by lock_ycbcr failing. - */ - if (ret != -EAGAIN) - return ret; - } - - /* - * Non-YUV formats could *also* have multiple planes, such as ancillary - * color compression state buffer, but the rest of the code isn't ready - * yet to deal with modifiers: - */ - num_planes = get_native_buffer_fds(buf, fds); - if (num_planes == 0) - return -EINVAL; - - assert(num_planes == 1); - - drm_fourcc = get_fourcc(buf->format); - if (drm_fourcc == -1) { - _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR"); - return -EINVAL; - } - - pitch = buf->stride * get_format_bpp(buf->format); - if (pitch == 0) { - _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR"); - return -EINVAL; - } - - *out_buf_info = (struct buffer_info){ - .width = buf->width, - .height = buf->height, - .drm_fourcc = drm_fourcc, - .num_planes = num_planes, - .fds = {fds[0], -1, -1, -1}, - .modifier = DRM_FORMAT_MOD_INVALID, - .offsets = {0, 0, 0, 0}, - .pitches = {pitch, 0, 0, 0}, - .yuv_color_space = EGL_ITU_REC601_EXT, - .sample_range = EGL_YUV_NARROW_RANGE_EXT, - .horizontal_siting = EGL_YUV_CHROMA_SITING_0_EXT, - .vertical_siting = EGL_YUV_CHROMA_SITING_0_EXT, - }; - - return 0; -} - -/* More recent CrOS gralloc has a perform op that fills out the struct below - * with canonical information about the buffer and its modifier, planes, - * offsets and strides. If we have this, we can skip straight to - * createImageFromDmaBufs2() and avoid all the guessing and recalculations. - * This also gives us the modifier and plane offsets/strides for multiplanar - * compressed buffers (eg Intel CCS buffers) in order to make that work in - * Android. - */ - -static const char cros_gralloc_module_name[] = "CrOS Gralloc"; - -#define CROS_GRALLOC_DRM_GET_BUFFER_INFO 4 -#define CROS_GRALLOC_DRM_GET_USAGE 5 -#define CROS_GRALLOC_DRM_GET_USAGE_FRONT_RENDERING_BIT 0x1 - -struct cros_gralloc0_buffer_info { - uint32_t drm_fourcc; - int num_fds; - int fds[4]; - uint64_t modifier; - int offset[4]; - int stride[4]; -}; - -static int -cros_get_buffer_info(struct dri2_egl_display *dri2_dpy, - struct ANativeWindowBuffer *buf, - struct buffer_info *out_buf_info) -{ - struct cros_gralloc0_buffer_info info; - - if (strcmp(dri2_dpy->gralloc->common.name, cros_gralloc_module_name) == 0 && - dri2_dpy->gralloc->perform && - dri2_dpy->gralloc->perform(dri2_dpy->gralloc, - CROS_GRALLOC_DRM_GET_BUFFER_INFO, buf->handle, - &info) == 0) { - *out_buf_info = (struct buffer_info){ - .width = buf->width, - .height = buf->height, - .drm_fourcc = info.drm_fourcc, - .num_planes = info.num_fds, - .fds = {-1, -1, -1, -1}, - .modifier = info.modifier, - .yuv_color_space = EGL_ITU_REC601_EXT, - .sample_range = EGL_YUV_NARROW_RANGE_EXT, - .horizontal_siting = EGL_YUV_CHROMA_SITING_0_EXT, - .vertical_siting = EGL_YUV_CHROMA_SITING_0_EXT, - }; - for (int i = 0; i < out_buf_info->num_planes; i++) { - out_buf_info->fds[i] = info.fds[i]; - out_buf_info->offsets[i] = info.offset[i]; - out_buf_info->pitches[i] = info.stride[i]; - } - - return 0; - } - - return -EINVAL; -} - static __DRIimage * -droid_create_image_from_buffer_info(struct dri2_egl_display *dri2_dpy, - struct buffer_info *buf_info, void *priv) +droid_create_image_from_buffer_info( + struct dri2_egl_display *dri2_dpy, int width, int height, + struct u_gralloc_buffer_basic_info *buf_info, + struct u_gralloc_buffer_color_info *color_info, void *priv) { unsigned error; if (dri2_dpy->image->base.version >= 15 && dri2_dpy->image->createImageFromDmaBufs2 != NULL) { return dri2_dpy->image->createImageFromDmaBufs2( - dri2_dpy->dri_screen_render_gpu, buf_info->width, buf_info->height, - buf_info->drm_fourcc, buf_info->modifier, buf_info->fds, - buf_info->num_planes, buf_info->pitches, buf_info->offsets, - buf_info->yuv_color_space, buf_info->sample_range, - buf_info->horizontal_siting, buf_info->vertical_siting, &error, priv); + dri2_dpy->dri_screen_render_gpu, width, height, buf_info->drm_fourcc, + buf_info->modifier, buf_info->fds, buf_info->num_planes, + buf_info->strides, buf_info->offsets, color_info->yuv_color_space, + color_info->sample_range, color_info->horizontal_siting, + color_info->vertical_siting, &error, priv); } return dri2_dpy->image->createImageFromDmaBufs( - dri2_dpy->dri_screen_render_gpu, buf_info->width, buf_info->height, - buf_info->drm_fourcc, buf_info->fds, buf_info->num_planes, - buf_info->pitches, buf_info->offsets, buf_info->yuv_color_space, - buf_info->sample_range, buf_info->horizontal_siting, - buf_info->vertical_siting, &error, priv); + dri2_dpy->dri_screen_render_gpu, width, height, buf_info->drm_fourcc, + buf_info->fds, buf_info->num_planes, buf_info->strides, buf_info->offsets, + color_info->yuv_color_space, color_info->sample_range, + color_info->horizontal_siting, color_info->vertical_siting, &error, priv); } static __DRIimage * @@ -440,23 +79,41 @@ droid_create_image_from_native_buffer(_EGLDisplay *disp, void *priv) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); - struct buffer_info buf_info; + struct u_gralloc_buffer_basic_info buf_info; + struct u_gralloc_buffer_color_info color_info = { + .yuv_color_space = __DRI_YUV_COLOR_SPACE_ITU_REC601, + .sample_range = __DRI_YUV_NARROW_RANGE, + .horizontal_siting = __DRI_YUV_CHROMA_SITING_0, + .vertical_siting = __DRI_YUV_CHROMA_SITING_0, + }; + struct u_gralloc_buffer_handle gr_handle = { + .handle = buf->handle, + .hal_format = buf->format, + .pixel_stride = buf->stride, + }; __DRIimage *img = NULL; - /* If dri driver is gallium virgl, real modifier info queried back from - * CrOS info (and potentially mapper metadata if integrated later) cannot - * get resolved and the buffer import will fail. Thus the fallback behavior - * is preserved down to native_window_buffer_get_buffer_info() so that the - * buffer can be imported without modifier info as a last resort. - */ - if (!img && !mapper_metadata_get_buffer_info(buf, &buf_info)) - img = droid_create_image_from_buffer_info(dri2_dpy, &buf_info, priv); + if (u_gralloc_get_buffer_basic_info(dri2_dpy->gralloc, &gr_handle, + &buf_info)) + return 0; - if (!img && !cros_get_buffer_info(dri2_dpy, buf, &buf_info)) - img = droid_create_image_from_buffer_info(dri2_dpy, &buf_info, priv); + /* May fail in some cases, defaults will be used in that case */ + u_gralloc_get_buffer_color_info(dri2_dpy->gralloc, &gr_handle, &color_info); - if (!img && !native_window_buffer_get_buffer_info(dri2_dpy, buf, &buf_info)) - img = droid_create_image_from_buffer_info(dri2_dpy, &buf_info, priv); + img = droid_create_image_from_buffer_info(dri2_dpy, buf->width, buf->height, + &buf_info, &color_info, priv); + + if (!img) { + /* If dri driver is gallium virgl, real modifier info queried back from + * CrOS info (and potentially mapper metadata if integrated later) cannot + * get resolved and the buffer import will fail. Thus the fallback + * behavior is preserved so that the buffer can be imported without + * modifier info as a last resort. + */ + buf_info.modifier = DRM_FORMAT_MOD_INVALID; + img = droid_create_image_from_buffer_info( + dri2_dpy, buf->width, buf->height, &buf_info, &color_info, priv); + } return img; } @@ -1479,7 +1136,6 @@ dri2_initialize_android(_EGLDisplay *disp) bool device_opened = false; struct dri2_egl_display *dri2_dpy; const char *err; - int ret; dri2_dpy = calloc(1, sizeof(*dri2_dpy)); if (!dri2_dpy) @@ -1487,10 +1143,10 @@ dri2_initialize_android(_EGLDisplay *disp) dri2_dpy->fd_render_gpu = -1; dri2_dpy->fd_display_gpu = -1; - ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, - (const hw_module_t **)&dri2_dpy->gralloc); - if (ret) { - err = "DRI2: failed to get gralloc module"; + + dri2_dpy->gralloc = u_gralloc_create(U_GRALLOC_TYPE_AUTO); + if (dri2_dpy->gralloc == NULL) { + err = "DRI2: failed to get gralloc"; goto cleanup; } @@ -1571,13 +1227,9 @@ dri2_initialize_android(_EGLDisplay *disp) * * So at least we can force BO_USE_LINEAR as the fallback. */ - uint32_t front_rendering_usage = 0; - if (!strcmp(dri2_dpy->gralloc->common.name, cros_gralloc_module_name) && - dri2_dpy->gralloc->perform && - dri2_dpy->gralloc->perform( - dri2_dpy->gralloc, CROS_GRALLOC_DRM_GET_USAGE, - CROS_GRALLOC_DRM_GET_USAGE_FRONT_RENDERING_BIT, - &front_rendering_usage) == 0) { + uint64_t front_rendering_usage = 0; + if (!u_gralloc_get_front_rendering_usage(dri2_dpy->gralloc, + &front_rendering_usage)) { dri2_dpy->front_rendering_usage = front_rendering_usage; disp->Extensions.KHR_mutable_render_buffer = EGL_TRUE; } diff --git a/src/egl/drivers/dri2/platform_android.h b/src/egl/drivers/dri2/platform_android.h index 23c73167506..674297a5447 100644 --- a/src/egl/drivers/dri2/platform_android.h +++ b/src/egl/drivers/dri2/platform_android.h @@ -117,38 +117,4 @@ ANativeWindow_query(const struct ANativeWindow *window, } #endif // ANDROID_API_LEVEL < 26 -struct buffer_info { - int width; - int height; - uint32_t drm_fourcc; - int num_planes; - int fds[4]; - uint64_t modifier; - int offsets[4]; - int pitches[4]; - enum __DRIYUVColorSpace yuv_color_space; - enum __DRISampleRange sample_range; - enum __DRIChromaSiting horizontal_siting; - enum __DRIChromaSiting vertical_siting; -}; - -#ifdef USE_IMAPPER4_METADATA_API -#ifdef __cplusplus -extern "C" { -#endif -extern int -mapper_metadata_get_buffer_info(struct ANativeWindowBuffer *buf, - struct buffer_info *out_buf_info); -#ifdef __cplusplus -} -#endif -#else -static inline int -mapper_metadata_get_buffer_info(struct ANativeWindowBuffer *buf, - struct buffer_info *out_buf_info) -{ - return -ENOTSUP; -} -#endif /* USE_IMAPPER4_METADATA_API */ - #endif /* EGL_ANDROID_INCLUDED */ diff --git a/src/egl/drivers/dri2/platform_android_mapper.cpp b/src/egl/drivers/dri2/platform_android_mapper.cpp deleted file mode 100644 index 385a187ed31..00000000000 --- a/src/egl/drivers/dri2/platform_android_mapper.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 2021 GlobalLogic Ukraine - * Copyright (C) 2021 Roman Stratiienko (r.stratiie...@gmail.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "platform_android.h" - -#include <aidl/android/hardware/graphics/common/ChromaSiting.h> -#include <aidl/android/hardware/graphics/common/Dataspace.h> -#include <aidl/android/hardware/graphics/common/ExtendableType.h> -#include <aidl/android/hardware/graphics/common/PlaneLayoutComponent.h> -#include <aidl/android/hardware/graphics/common/PlaneLayoutComponentType.h> -#include <gralloctypes/Gralloc4.h> -#include <system/window.h> - -using aidl::android::hardware::graphics::common::ChromaSiting; -using aidl::android::hardware::graphics::common::Dataspace; -using aidl::android::hardware::graphics::common::ExtendableType; -using aidl::android::hardware::graphics::common::PlaneLayout; -using aidl::android::hardware::graphics::common::PlaneLayoutComponent; -using aidl::android::hardware::graphics::common::PlaneLayoutComponentType; -using android::hardware::hidl_handle; -using android::hardware::hidl_vec; -using android::hardware::graphics::common::V1_2::BufferUsage; -using android::hardware::graphics::mapper::V4_0::Error; -using android::hardware::graphics::mapper::V4_0::IMapper; -using MetadataType = - android::hardware::graphics::mapper::V4_0::IMapper::MetadataType; - -Error -GetMetadata(android::sp<IMapper> mapper, const native_handle_t *buffer, - MetadataType type, hidl_vec<uint8_t> *metadata) -{ - Error error = Error::NONE; - - auto native_handle = const_cast<native_handle_t *>(buffer); - - auto ret = mapper->get(native_handle, type, - [&](const auto &get_error, const auto &get_metadata) { - error = get_error; - *metadata = get_metadata; - }); - - if (!ret.isOk()) - error = Error::NO_RESOURCES; - - return error; -} - -std::optional<std::vector<PlaneLayout>> -GetPlaneLayouts(android::sp<IMapper> mapper, const native_handle_t *buffer) -{ - hidl_vec<uint8_t> encoded_layouts; - - Error error = - GetMetadata(mapper, buffer, android::gralloc4::MetadataType_PlaneLayouts, - &encoded_layouts); - - if (error != Error::NONE) - return std::nullopt; - - std::vector<PlaneLayout> plane_layouts; - - auto status = - android::gralloc4::decodePlaneLayouts(encoded_layouts, &plane_layouts); - - if (status != android::OK) - return std::nullopt; - - return plane_layouts; -} - -extern "C" { - -int -mapper_metadata_get_buffer_info(struct ANativeWindowBuffer *buf, - struct buffer_info *out_buf_info) -{ - static android::sp<IMapper> mapper = IMapper::getService(); - struct buffer_info buf_info = *out_buf_info; - if (mapper == nullptr) - return -EINVAL; - - if (!buf->handle) - return -EINVAL; - - buf_info.width = buf->width; - buf_info.height = buf->height; - - hidl_vec<uint8_t> encoded_format; - auto err = GetMetadata(mapper, buf->handle, - android::gralloc4::MetadataType_PixelFormatFourCC, - &encoded_format); - if (err != Error::NONE) - return -EINVAL; - - auto status = android::gralloc4::decodePixelFormatFourCC( - encoded_format, &buf_info.drm_fourcc); - if (status != android::OK) - return -EINVAL; - - hidl_vec<uint8_t> encoded_modifier; - err = GetMetadata(mapper, buf->handle, - android::gralloc4::MetadataType_PixelFormatModifier, - &encoded_modifier); - if (err != Error::NONE) - return -EINVAL; - - status = android::gralloc4::decodePixelFormatModifier(encoded_modifier, - &buf_info.modifier); - if (status != android::OK) - return -EINVAL; - - auto layouts_opt = GetPlaneLayouts(mapper, buf->handle); - - if (!layouts_opt) - return -EINVAL; - - std::vector<PlaneLayout> &layouts = *layouts_opt; - - buf_info.num_planes = layouts.size(); - - bool per_plane_unique_fd = buf->handle->numFds == buf_info.num_planes; - - for (uint32_t i = 0; i < layouts.size(); i++) { - buf_info.fds[i] = - per_plane_unique_fd ? buf->handle->data[i] : buf->handle->data[0]; - buf_info.pitches[i] = layouts[i].strideInBytes; - buf_info.offsets[i] = layouts[i].offsetInBytes; - } - - /* optional attributes */ - hidl_vec<uint8_t> encoded_chroma_siting; - err = GetMetadata(mapper, buf->handle, - android::gralloc4::MetadataType_ChromaSiting, - &encoded_chroma_siting); - if (err == Error::NONE) { - ExtendableType chroma_siting_ext; - status = android::gralloc4::decodeChromaSiting(encoded_chroma_siting, - &chroma_siting_ext); - if (status != android::OK) - return -EINVAL; - - ChromaSiting chroma_siting = - android::gralloc4::getStandardChromaSitingValue(chroma_siting_ext); - switch (chroma_siting) { - case ChromaSiting::SITED_INTERSTITIAL: - buf_info.horizontal_siting = __DRI_YUV_CHROMA_SITING_0_5; - buf_info.vertical_siting = __DRI_YUV_CHROMA_SITING_0_5; - break; - case ChromaSiting::COSITED_HORIZONTAL: - buf_info.horizontal_siting = __DRI_YUV_CHROMA_SITING_0; - buf_info.vertical_siting = __DRI_YUV_CHROMA_SITING_0_5; - break; - default: - break; - } - } - - hidl_vec<uint8_t> encoded_dataspace; - err = GetMetadata(mapper, buf->handle, - android::gralloc4::MetadataType_Dataspace, - &encoded_dataspace); - if (err == Error::NONE) { - Dataspace dataspace; - status = - android::gralloc4::decodeDataspace(encoded_dataspace, &dataspace); - if (status != android::OK) - return -EINVAL; - - Dataspace standard = - (Dataspace)((int)dataspace & (uint32_t)Dataspace::STANDARD_MASK); - switch (standard) { - case Dataspace::STANDARD_BT709: - buf_info.yuv_color_space = __DRI_YUV_COLOR_SPACE_ITU_REC709; - break; - case Dataspace::STANDARD_BT601_625: - case Dataspace::STANDARD_BT601_625_UNADJUSTED: - case Dataspace::STANDARD_BT601_525: - case Dataspace::STANDARD_BT601_525_UNADJUSTED: - buf_info.yuv_color_space = __DRI_YUV_COLOR_SPACE_ITU_REC601; - break; - case Dataspace::STANDARD_BT2020: - case Dataspace::STANDARD_BT2020_CONSTANT_LUMINANCE: - buf_info.yuv_color_space = __DRI_YUV_COLOR_SPACE_ITU_REC2020; - break; - default: - break; - } - - Dataspace range = - (Dataspace)((int)dataspace & (uint32_t)Dataspace::RANGE_MASK); - switch (range) { - case Dataspace::RANGE_FULL: - buf_info.sample_range = __DRI_YUV_FULL_RANGE; - break; - case Dataspace::RANGE_LIMITED: - buf_info.sample_range = __DRI_YUV_NARROW_RANGE; - break; - default: - break; - } - } - - *out_buf_info = buf_info; - - return 0; -} - -} // extern "C" diff --git a/src/egl/meson.build b/src/egl/meson.build index b92c00f585a..8343bb6b953 100644 --- a/src/egl/meson.build +++ b/src/egl/meson.build @@ -133,13 +133,8 @@ if with_dri2 incs_for_egl += include_directories('wayland/wayland-drm') endif if with_platform_android - deps_for_egl += dep_android + deps_for_egl += [dep_android, idep_u_gralloc] files_egl += files('drivers/dri2/platform_android.c') - if dep_android_mapper4.found() - files_egl += files('drivers/dri2/platform_android_mapper.cpp') - c_args_for_egl += '-DUSE_IMAPPER4_METADATA_API' - cpp_args_for_egl += '-DUSE_IMAPPER4_METADATA_API' - endif endif elif with_platform_haiku c_args_for_egl += [