blob: 374e3ccf6811376efe7f978a6600d96ac6b3540f [file] [log] [blame]
From 9ef5282ff2991c9c58993844e1d4e387e128d9f3 Mon Sep 17 00:00:00 2001
From: "Kristian H. Kristensen" <hoegsberg@google.com>
Date: Mon, 10 Aug 2020 19:05:05 -0700
Subject: [PATCH 07/11] egl/android: Add support for CrOS buffer info perform
op
This uses a new gralloc perform op that returns the buffer info we
need. No need to guess at formats, hard code offsets and recalculate
strides. This also gives us the format modifier as well as aux planes
for compressed RGBA buffers.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6055>
---
src/egl/drivers/dri2/platform_android.c | 69 ++++++++++++++++++++++++-
1 file changed, 67 insertions(+), 2 deletions(-)
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
index 73955b6299e..3b2dffad212 100644
--- a/src/egl/drivers/dri2/platform_android.c
+++ b/src/egl/drivers/dri2/platform_android.c
@@ -350,6 +350,71 @@ droid_create_image_from_prime_fds(_EGLDisplay *disp,
NULL);
}
+/* 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
+
+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 __DRIimage *
+droid_create_image_from_cros_info(_EGLDisplay *disp,
+ struct ANativeWindowBuffer *buf)
+{
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ struct cros_gralloc0_buffer_info info;
+ unsigned error;
+
+ if (strcmp(dri2_dpy->gralloc->common.name, cros_gralloc_module_name) == 0 &&
+ dri2_dpy->gralloc->perform &&
+ dri2_dpy->image->base.version >= 15 &&
+ dri2_dpy->image->createImageFromDmaBufs2 != NULL &&
+ dri2_dpy->gralloc->perform(dri2_dpy->gralloc,
+ CROS_GRALLOC_DRM_GET_BUFFER_INFO,
+ buf->handle, &info) == 0) {
+ return dri2_dpy->image->createImageFromDmaBufs2(dri2_dpy->dri_screen,
+ buf->width, buf->height,
+ info.drm_fourcc, info.modifier,
+ info.fds, info.num_fds,
+ info.stride, info.offset,
+ EGL_ITU_REC601_EXT,
+ EGL_YUV_FULL_RANGE_EXT,
+ EGL_YUV_CHROMA_SITING_0_EXT,
+ EGL_YUV_CHROMA_SITING_0_EXT,
+ &error,
+ NULL);
+ }
+
+ return NULL;
+}
+
+static __DRIimage *
+droid_create_image_from_native_buffer(_EGLDisplay *disp,
+ struct ANativeWindowBuffer *buf)
+{
+ __DRIimage *dri_image;
+
+ dri_image = droid_create_image_from_cros_info(disp, buf);
+ if (dri_image)
+ return dri_image;
+
+ return droid_create_image_from_prime_fds(disp, buf);
+}
+
static EGLBoolean
droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf)
{
@@ -747,7 +812,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
}
dri2_surf->dri_image_back =
- droid_create_image_from_prime_fds(disp, dri2_surf->buffer);
+ droid_create_image_from_native_buffer(disp, dri2_surf->buffer);
if (!dri2_surf->dri_image_back) {
_eglLog(_EGL_WARNING, "failed to create DRI image from FD");
return -1;
@@ -986,7 +1051,7 @@ dri2_create_image_android_native_buffer(_EGLDisplay *disp,
}
__DRIimage *dri_image =
- droid_create_image_from_prime_fds(disp, buf);
+ droid_create_image_from_native_buffer(disp, buf);
#ifdef HAVE_DRM_GRALLOC
if (dri_image == NULL)
--
2.29.2.684.gfbc64c5ab5-goog