blob: 5bcd9b5cef3510922679093a5e7fca8d7ac48958 [file] [log] [blame]
From f61337b54923fcfe4837ee9f555857268130dd95 Mon Sep 17 00:00:00 2001
From: Yiwei Zhang <zzyiwei@chromium.org>
Date: Thu, 13 May 2021 22:57:44 +0000
Subject: [PATCH 3/3] egl/android: check front rendering support for cros
gralloc
Enable EGL_KHR_mutable_render_buffer when below conditions are met:
1. Driver part implementation of this extension is available
2. Loader part implementation of this extension is available
3. ClientAPIs must be OpenGL ES bits (ES, ES2 or ES3)
4. Gralloc is cros gralloc and it supports front render usage query
(4) is optional as long as another gralloc supports similar query.
Upon window surface creation, if the surface type has mutable render
buffer, then append the cached front rendering usage to the existing
usage and properly set to the ANativeWindow.
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10685>
---
src/egl/drivers/dri2/egl_dri2.h | 2 ++
src/egl/drivers/dri2/platform_android.c | 47 +++++++++++++++++++++++--
2 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index d7f9696da93..7d328040c2c 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -247,6 +247,8 @@ struct dri2_egl_display
#ifdef HAVE_ANDROID_PLATFORM
const gralloc_module_t *gralloc;
+ /* gralloc vendor usage bit for front rendering */
+ uint32_t front_rendering_usage;
#endif
bool is_render_node;
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
index 2fff5ac4dc4..585c4432a37 100644
--- a/src/egl/drivers/dri2/platform_android.c
+++ b/src/egl/drivers/dri2/platform_android.c
@@ -346,6 +346,8 @@ droid_create_image_from_prime_fds(_EGLDisplay *disp,
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;
@@ -632,6 +634,10 @@ droid_create_surface(_EGLDisplay *disp, EGLint type, _EGLConfig *conf,
uint32_t usage = strcmp(dri2_dpy->driver_name, "kms_swrast") == 0
? GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN
: GRALLOC_USAGE_HW_RENDER;
+
+ if (conf->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR)
+ usage |= dri2_dpy->front_rendering_usage;
+
native_window_set_usage(window, usage);
}
@@ -1671,10 +1677,47 @@ dri2_initialize_android(_EGLDisplay *disp)
}
disp->Extensions.KHR_image = EGL_TRUE;
+
+ dri2_dpy->front_rendering_usage = 0;
#if ANDROID_API_LEVEL >= 24
if (dri2_dpy->mutable_render_buffer &&
- dri2_dpy->loader_extensions == droid_image_loader_extensions) {
- disp->Extensions.KHR_mutable_render_buffer = EGL_TRUE;
+ dri2_dpy->loader_extensions == droid_image_loader_extensions &&
+ /* In big GL, front rendering is done at the core API level by directly
+ * rendering on the front buffer. However, in ES, the front buffer is
+ * completely inaccessible through the core ES API.
+ *
+ * EGL_KHR_mutable_render_buffer is Android's attempt to re-introduce
+ * front rendering into ES by squeezing into EGL. Unlike big GL, this
+ * extension redirects GL_BACK used by ES for front rendering. Thus we
+ * restrict the enabling of this extension to ES only.
+ */
+ (disp->ClientAPIs & ~(EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT |
+ EGL_OPENGL_ES3_BIT_KHR)) == 0) {
+ /* For cros gralloc, if the front rendering query is supported, then all
+ * available window surface configs support front rendering because:
+ *
+ * 1) EGL queries cros gralloc for the front rendering usage bit here
+ * 2) EGL combines the front rendering usage bit with the existing usage
+ * if the window surface requests mutable render buffer
+ * 3) EGL sets the combined usage onto the ANativeWindow and the next
+ * dequeueBuffer will ask gralloc for an allocation/re-allocation with
+ * the new combined usage
+ * 4) cros gralloc(on top of minigbm) resolves the front rendering usage
+ * bit into either BO_USE_FRONT_RENDERING or BO_USE_LINEAR based on
+ * the format support checking.
+ *
+ * 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) {
+ dri2_dpy->front_rendering_usage = front_rendering_usage;
+ disp->Extensions.KHR_mutable_render_buffer = EGL_TRUE;
+ }
}
#endif
--
2.32.0.rc0.204.g9fa02ecfa5-goog