diff options
-rw-r--r-- | src/egl/Android.mk | 6 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 2 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_android.c | 56 |
3 files changed, 49 insertions, 15 deletions
diff --git a/src/egl/Android.mk b/src/egl/Android.mk index 11818694f4f..8412aeb7984 100644 --- a/src/egl/Android.mk +++ b/src/egl/Android.mk @@ -57,9 +57,13 @@ LOCAL_SHARED_LIBRARIES := \ libhardware \ liblog \ libcutils \ - libgralloc_drm \ libsync +ifeq ($(BOARD_USES_DRM_GRALLOC),true) + LOCAL_CFLAGS += -DHAVE_DRM_GRALLOC + LOCAL_SHARED_LIBRARIES += libgralloc_drm +endif + ifeq ($(filter $(MESA_ANDROID_MAJOR_VERSION), 4 5 6 7),) LOCAL_SHARED_LIBRARIES += libnativewindow endif diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index adabc527f85..5d8fbfa2356 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -67,8 +67,6 @@ struct zwp_linux_dmabuf_v1; #include <system/window.h> #include <hardware/gralloc.h> -#include <gralloc_drm_handle.h> - #endif /* HAVE_ANDROID_PLATFORM */ #include "eglconfig.h" diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 1d6ed92bd61..4ba96aad908 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -37,7 +37,11 @@ #include "loader.h" #include "egl_dri2.h" #include "egl_dri2_fallbacks.h" + +#ifdef HAVE_DRM_GRALLOC +#include <gralloc_drm_handle.h> #include "gralloc_drm.h" +#endif /* HAVE_DRM_GRALLOC */ #define ALIGN(val, align) (((val) + (align) - 1) & ~((align) - 1)) @@ -164,11 +168,13 @@ get_native_buffer_fd(struct ANativeWindowBuffer *buf) return (handle && handle->numFds) ? handle->data[0] : -1; } +#ifdef HAVE_DRM_GRALLOC static int get_native_buffer_name(struct ANativeWindowBuffer *buf) { return gralloc_drm_get_gem_handle(buf->handle); } +#endif /* HAVE_DRM_GRALLOC */ static EGLBoolean droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf) @@ -838,6 +844,7 @@ droid_create_image_from_prime_fd(_EGLDisplay *disp, _EGLContext *ctx, return dri2_create_image_dma_buf(disp, ctx, NULL, attr_list); } +#ifdef HAVE_DRM_GRALLOC static _EGLImage * droid_create_image_from_name(_EGLDisplay *disp, _EGLContext *ctx, struct ANativeWindowBuffer *buf) @@ -881,6 +888,7 @@ droid_create_image_from_name(_EGLDisplay *disp, _EGLContext *ctx, return &dri2_img->base; } +#endif /* HAVE_DRM_GRALLOC */ static EGLBoolean droid_query_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, @@ -937,7 +945,11 @@ dri2_create_image_android_native_buffer(_EGLDisplay *disp, if (fd >= 0) return droid_create_image_from_prime_fd(disp, ctx, buf, fd); +#ifdef HAVE_DRM_GRALLOC return droid_create_image_from_name(disp, ctx, buf); +#else + return NULL; +#endif } static _EGLImage * @@ -959,6 +971,7 @@ droid_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) { } +#ifdef HAVE_DRM_GRALLOC static int droid_get_buffers_parse_attachments(struct dri2_egl_surface *dri2_surf, unsigned int *attachments, int count) @@ -1034,6 +1047,7 @@ droid_get_buffers_with_format(__DRIdrawable * driDrawable, return dri2_surf->buffers; } +#endif /* HAVE_DRM_GRALLOC */ static unsigned droid_get_capability(void *loaderPrivate, enum dri_loader_cap cap) @@ -1116,6 +1130,14 @@ droid_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *dpy) return (config_count != 0); } +enum { + /* perform(const struct gralloc_module_t *mod, + * int op, + * int *fd); + */ + GRALLOC_MODULE_PERFORM_GET_DRM_FD = 0x40000002, +}; + static int droid_open_device(struct dri2_egl_display *dri2_dpy) { @@ -1158,6 +1180,7 @@ static const struct dri2_egl_display_vtbl droid_display_vtbl = { .get_dri_drawable = dri2_surface_get_dri_drawable, }; +#ifdef HAVE_DRM_GRALLOC static const __DRIdri2LoaderExtension droid_dri2_loader_extension = { .base = { __DRI_DRI2_LOADER, 4 }, @@ -1166,6 +1189,7 @@ static const __DRIdri2LoaderExtension droid_dri2_loader_extension = { .getBuffersWithFormat = droid_get_buffers_with_format, .getCapability = droid_get_capability, }; +#endif /* HAVE_DRM_GRALLOC */ static const __DRIimageLoaderExtension droid_image_loader_extension = { .base = { __DRI_IMAGE_LOADER, 2 }, @@ -1175,12 +1199,14 @@ static const __DRIimageLoaderExtension droid_image_loader_extension = { .getCapability = droid_get_capability, }; +#ifdef HAVE_DRM_GRALLOC static const __DRIextension *droid_dri2_loader_extensions[] = { &droid_dri2_loader_extension.base, &image_lookup_extension.base, &use_invalidate.base, NULL, }; +#endif /* HAVE_DRM_GRALLOC */ static const __DRIextension *droid_image_loader_extensions[] = { &droid_image_loader_extension.base, @@ -1230,20 +1256,26 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy->is_render_node = drmGetNodeTypeFromFd(dri2_dpy->fd) == DRM_NODE_RENDER; - /* render nodes cannot use Gem names, and thus do not support - * the __DRI_DRI2_LOADER extension */ if (!dri2_dpy->is_render_node) { - dri2_dpy->loader_extensions = droid_dri2_loader_extensions; - if (!dri2_load_driver(disp)) { - err = "DRI2: failed to load driver"; - goto cleanup; - } + #ifdef HAVE_DRM_GRALLOC + /* Handle control nodes using __DRI_DRI2_LOADER extension and GEM names + * for backwards compatibility with drm_gralloc. (Do not use on new + * systems.) */ + dri2_dpy->loader_extensions = droid_dri2_loader_extensions; + if (!dri2_load_driver(disp)) { + err = "DRI2: failed to load driver"; + goto cleanup; + } + #else + err = "DRI2: handle is not for a render node"; + goto cleanup; + #endif } else { - dri2_dpy->loader_extensions = droid_image_loader_extensions; - if (!dri2_load_driver_dri3(disp)) { - err = "DRI3: failed to load driver"; - goto cleanup; - } + dri2_dpy->loader_extensions = droid_image_loader_extensions; + if (!dri2_load_driver_dri3(disp)) { + err = "DRI3: failed to load driver"; + goto cleanup; + } } if (!dri2_create_screen(disp)) { |