android: add support for ICS
authorChia-I Wu <olv@lunarg.com>
Fri, 25 Nov 2011 03:59:02 +0000 (11:59 +0800)
committerChia-I Wu <olv@lunarg.com>
Fri, 25 Nov 2011 04:34:33 +0000 (12:34 +0800)
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
include/EGL/eglext.h
src/egl/drivers/dri2/egl_dri2.h
src/egl/drivers/dri2/platform_android.c
src/gallium/state_trackers/egl/android/native_android.cpp
src/gallium/state_trackers/egl/common/egl_g3d_image.c
src/gallium/state_trackers/egl/common/native_buffer.h
src/gallium/winsys/sw/android/android_sw_winsys.cpp

index 83177a0cbe7ccc87199f6f0c37da7281677d0593..f28ddc2ef66dd9eb048af7ee491c37d3ba57dcb7 100644 (file)
 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 \
index 0449ae2cd1a669dad1b32cdf52c052984c8f6a23..9484b83c6503935e8db9da9c907e51a76e0e1efb 100644 (file)
@@ -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
 
index 1c2c7fe5a64c408ddb545162f57e39ce21185ddb..95b87b875002bf93c4f59e084a74f71f72277982 100644 (file)
 
 #ifdef HAVE_ANDROID_PLATFORM
 #define LOG_TAG "EGL-DRI2"
-#include <ui/egl/android_natives.h>
-#include <ui/android_native_buffer.h>
-#include <cutils/log.h>
-#include <gralloc_drm_handle.h>
+
+#if ANDROID_VERSION >= 0x0400
+#  include <system/window.h>
+#else
+#  define android_native_buffer_t ANativeWindowBuffer
+#  include <ui/egl/android_natives.h>
+#  include <ui/android_native_buffer.h>
 #endif
 
+#include <hardware/gralloc.h>
+#include <gralloc_drm_handle.h>
+#include <cutils/log.h>
+
+#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];
index 3abd53636929bab74ed79457cb44f4ea49221772..1998941f82928953a4ce389e9cb10b59572df131 100644 (file)
@@ -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);
    }
index 490d6e83884d5ec719cad503fd5f1075562d7a49..01d3a02d364f5411a03ec2a596e4af69af8ac4e2 100644 (file)
  */
 
 #define LOG_TAG "EGL-GALLIUM"
-#include <cutils/log.h>
-#include <cutils/properties.h>
+
+#if ANDROID_VERSION >= 0x0400
+#include <stdlib.h>
+#include <system/window.h>
+#else
+#define android_native_buffer_t ANativeWindowBuffer
+#include <ui/egl/android_natives.h>
+#include <ui/android_native_buffer.h>
+#endif
+
 #include <hardware/gralloc.h>
+#include <cutils/properties.h>
+#include <cutils/log.h>
 #include <utils/Errors.h>
-#include <ui/android_native_buffer.h>
 
 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;
 
index 4d90c40031997236c796d10c3c7f36db6fdf43d2..cf8ec98dbba47da4126b049432f3caf4937de660 100644 (file)
@@ -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:
index 503ed580b05654f6babcdcb98075e098ec44cf7d..eb161b11a3d0087acea54ae8b3170ebfbe0def38 100644 (file)
@@ -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;
 };
 
index 02faf1e0cca0575e12ad32f3a1268846b292b8c9..f9b90044ac541fe2183e4e7fbaeb01a235787e17 100644 (file)
 #include "util/u_format.h"
 #include "state_tracker/sw_winsys.h"
 
+#include <hardware/gralloc.h>
 #include <utils/Errors.h>
-#include <private/ui/sw_gralloc_handle.h>
 
-#include <hardware/gralloc.h>
+#if ANDROID_VERSION < 0x0300
+#include <private/ui/sw_gralloc_handle.h>
+#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<const sw_gralloc_handle_t *>(adt->handle);
+      adt->mapped = reinterpret_cast<void *>(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<const sw_gralloc_handle_t *>(adt->handle);
-         adt->mapped = reinterpret_cast<void *>(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;