From 75cc24c876059d6eb183e07ed802f997fb416864 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 25 Nov 2011 11:59:02 +0800 Subject: [PATCH] android: add support for ICS With ICS (Android 4.0), several headers and structs are renamed. Define ANDROID_VERSION so that we can choose a different path depending on the platform version. I've tested only softpipe and llvmpipe. r600g is also reported to work. --- Android.common.mk | 6 +++ include/EGL/eglext.h | 1 - src/egl/drivers/dri2/egl_dri2.h | 21 ++++++--- src/egl/drivers/dri2/platform_android.c | 6 +-- .../egl/android/native_android.cpp | 27 +++++++---- .../state_trackers/egl/common/egl_g3d_image.c | 4 +- .../state_trackers/egl/common/native_buffer.h | 4 +- .../winsys/sw/android/android_sw_winsys.cpp | 47 +++++++++++-------- 8 files changed, 74 insertions(+), 42 deletions(-) diff --git a/Android.common.mk b/Android.common.mk index 83177a0cbe7..f28ddc2ef66 100644 --- a/Android.common.mk +++ b/Android.common.mk @@ -24,6 +24,12 @@ LOCAL_C_INCLUDES += \ $(MESA_TOP)/include +# define ANDROID_VERSION (e.g., 4.0.x => 0x0400) +major := $(word 1, $(subst ., , $(PLATFORM_VERSION))) +minor := $(word 2, $(subst ., , $(PLATFORM_VERSION))) +LOCAL_CFLAGS += \ + -DANDROID_VERSION=0x0$(major)0$(minor) + LOCAL_CFLAGS += \ -DPTHREADS \ -fvisibility=hidden \ diff --git a/include/EGL/eglext.h b/include/EGL/eglext.h index 0449ae2cd1a..9484b83c650 100644 --- a/include/EGL/eglext.h +++ b/include/EGL/eglext.h @@ -392,7 +392,6 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOK) (EGLDisplay dpy, EG #ifndef EGL_ANDROID_image_native_buffer #define EGL_ANDROID_image_native_buffer 1 -struct android_native_buffer_t; #define EGL_NATIVE_BUFFER_ANDROID 0x3140 /* eglCreateImageKHR target */ #endif diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 1c2c7fe5a64..95b87b87500 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -50,12 +50,21 @@ #ifdef HAVE_ANDROID_PLATFORM #define LOG_TAG "EGL-DRI2" -#include -#include -#include -#include + +#if ANDROID_VERSION >= 0x0400 +# include +#else +# define android_native_buffer_t ANativeWindowBuffer +# include +# include #endif +#include +#include +#include + +#endif /* HAVE_ANDROID_PLATFORM */ + #include "eglconfig.h" #include "eglcontext.h" #include "egldisplay.h" @@ -167,8 +176,8 @@ struct dri2_egl_surface #endif #ifdef HAVE_ANDROID_PLATFORM - android_native_window_t *window; - android_native_buffer_t *buffer; + struct ANativeWindow *window; + struct ANativeWindowBuffer *buffer; /* EGL-owned buffers */ __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT]; diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 3abd5363692..1998941f829 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -66,7 +66,7 @@ get_format_bpp(int native) } static int -get_native_buffer_name(struct android_native_buffer_t *buf) +get_native_buffer_name(struct ANativeWindowBuffer *buf) { struct gralloc_drm_handle_t *handle; @@ -280,7 +280,7 @@ droid_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) static _EGLImage * dri2_create_image_android_native_buffer(_EGLDisplay *disp, - struct android_native_buffer_t *buf) + struct ANativeWindowBuffer *buf) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_image *dri2_img; @@ -357,7 +357,7 @@ droid_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, switch (target) { case EGL_NATIVE_BUFFER_ANDROID: return dri2_create_image_android_native_buffer(disp, - (struct android_native_buffer_t *) buffer); + (struct ANativeWindowBuffer *) buffer); default: return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list); } diff --git a/src/gallium/state_trackers/egl/android/native_android.cpp b/src/gallium/state_trackers/egl/android/native_android.cpp index 490d6e83884..01d3a02d364 100644 --- a/src/gallium/state_trackers/egl/android/native_android.cpp +++ b/src/gallium/state_trackers/egl/android/native_android.cpp @@ -25,11 +25,20 @@ */ #define LOG_TAG "EGL-GALLIUM" -#include -#include + +#if ANDROID_VERSION >= 0x0400 +#include +#include +#else +#define android_native_buffer_t ANativeWindowBuffer +#include +#include +#endif + #include +#include +#include #include -#include extern "C" { #include "egllog.h" @@ -59,13 +68,13 @@ struct android_surface { struct native_surface base; struct android_display *adpy; - android_native_window_t *win; + ANativeWindow *win; /* staging color buffer for when buffer preserving is enabled */ struct pipe_resource *color_res; uint stamp; - android_native_buffer_t *buf; + ANativeWindowBuffer *buf; struct pipe_resource *buf_res; /* cache the current back buffers */ @@ -161,11 +170,11 @@ get_handle_name(buffer_handle_t handle) #endif /* ANDROID_BACKEND_NO_DRM */ /** - * Import an android_native_buffer_t allocated by the server. + * Import an ANativeWindowBuffer allocated by the server. */ static struct pipe_resource * import_buffer(struct android_display *adpy, const struct pipe_resource *templ, - struct android_native_buffer_t *abuf) + ANativeWindowBuffer *abuf) { struct pipe_screen *screen = adpy->base.screen; struct pipe_resource *res; @@ -232,7 +241,7 @@ android_surface_clear_cache(struct native_surface *nsurf) static struct pipe_resource * android_surface_add_cache(struct native_surface *nsurf, - struct android_native_buffer_t *abuf) + ANativeWindowBuffer *abuf) { struct android_surface *asurf = android_surface(nsurf); void *handle; @@ -716,7 +725,7 @@ android_display_import_buffer(struct native_display *ndpy, struct native_buffer *nbuf) { struct android_display *adpy = android_display(ndpy); - struct android_native_buffer_t *abuf; + ANativeWindowBuffer *abuf; enum pipe_format format; struct pipe_resource templ; diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_image.c b/src/gallium/state_trackers/egl/common/egl_g3d_image.c index 4d90c400319..cf8ec98dbba 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d_image.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d_image.c @@ -206,7 +206,7 @@ egl_g3d_reference_wl_buffer(_EGLDisplay *dpy, struct wl_buffer *buffer, static struct pipe_resource * egl_g3d_reference_android_native_buffer(_EGLDisplay *dpy, - struct android_native_buffer_t *buf) + struct ANativeWindowBuffer *buf) { struct egl_g3d_display *gdpy = egl_g3d_display(dpy); struct native_buffer nbuf; @@ -260,7 +260,7 @@ egl_g3d_create_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, #ifdef EGL_ANDROID_image_native_buffer case EGL_NATIVE_BUFFER_ANDROID: ptex = egl_g3d_reference_android_native_buffer(dpy, - (struct android_native_buffer_t *) buffer); + (struct ANativeWindowBuffer *) buffer); break; #endif default: diff --git a/src/gallium/state_trackers/egl/common/native_buffer.h b/src/gallium/state_trackers/egl/common/native_buffer.h index 503ed580b05..eb161b11a3d 100644 --- a/src/gallium/state_trackers/egl/common/native_buffer.h +++ b/src/gallium/state_trackers/egl/common/native_buffer.h @@ -33,7 +33,7 @@ #include "pipe/p_state.h" struct native_display; -struct android_native_buffer_t; +struct ANativeWindowBuffer; enum native_buffer_type { NATIVE_BUFFER_DRM, @@ -53,7 +53,7 @@ struct native_buffer { unsigned stride; } drm; - struct android_native_buffer_t *android; /**< opaque native buffer */ + struct ANativeWindowBuffer *android; /**< opaque native buffer */ } u; }; diff --git a/src/gallium/winsys/sw/android/android_sw_winsys.cpp b/src/gallium/winsys/sw/android/android_sw_winsys.cpp index 02faf1e0cca..f9b90044ac5 100644 --- a/src/gallium/winsys/sw/android/android_sw_winsys.cpp +++ b/src/gallium/winsys/sw/android/android_sw_winsys.cpp @@ -32,10 +32,12 @@ #include "util/u_format.h" #include "state_tracker/sw_winsys.h" +#include #include -#include -#include +#if ANDROID_VERSION < 0x0300 +#include +#endif #include "android_sw_winsys.h" @@ -105,14 +107,17 @@ android_displaytarget_unmap(struct sw_winsys *ws, struct android_sw_winsys *droid = android_sw_winsys(ws); struct android_sw_displaytarget *adt = android_sw_displaytarget(dt); +#if ANDROID_VERSION < 0x0300 + /* try sw_gralloc first */ + if (adt->mapped && sw_gralloc_handle_t::validate(adt->handle) >= 0) { + adt->mapped = NULL; + return; + } +#endif + if (adt->mapped) { - if (sw_gralloc_handle_t::validate(adt->handle) >= 0) { - adt->mapped = NULL; - } - else { - droid->grmod->unlock(droid->grmod, adt->handle); - adt->mapped = NULL; - } + droid->grmod->unlock(droid->grmod, adt->handle); + adt->mapped = NULL; } } @@ -124,17 +129,21 @@ android_displaytarget_map(struct sw_winsys *ws, struct android_sw_winsys *droid = android_sw_winsys(ws); struct android_sw_displaytarget *adt = android_sw_displaytarget(dt); +#if ANDROID_VERSION < 0x0300 + /* try sw_gralloc first */ + if (sw_gralloc_handle_t::validate(adt->handle) >= 0) { + const sw_gralloc_handle_t *swhandle = + reinterpret_cast(adt->handle); + adt->mapped = reinterpret_cast(swhandle->base); + + return adt->mapped; + } +#endif + if (!adt->mapped) { - if (sw_gralloc_handle_t::validate(adt->handle) >= 0) { - const sw_gralloc_handle_t *swhandle = - reinterpret_cast(adt->handle); - adt->mapped = reinterpret_cast(swhandle->base); - } - else { - /* lock the buffer for CPU access */ - droid->grmod->lock(droid->grmod, adt->handle, - adt->usage, 0, 0, adt->width, adt->height, &adt->mapped); - } + /* lock the buffer for CPU access */ + droid->grmod->lock(droid->grmod, adt->handle, + adt->usage, 0, 0, adt->width, adt->height, &adt->mapped); } return adt->mapped; -- 2.30.2