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.
This commit is contained in:
@@ -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 \
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -50,12 +50,21 @@
|
||||
|
||||
#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];
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -25,11 +25,20 @@
|
||||
*/
|
||||
|
||||
#define LOG_TAG "EGL-GALLIUM"
|
||||
#include <cutils/log.h>
|
||||
#include <cutils/properties.h>
|
||||
#include <hardware/gralloc.h>
|
||||
#include <utils/Errors.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>
|
||||
|
||||
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;
|
||||
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
|
@@ -32,10 +32,12 @@
|
||||
#include "util/u_format.h"
|
||||
#include "state_tracker/sw_winsys.h"
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <private/ui/sw_gralloc_handle.h>
|
||||
|
||||
#include <hardware/gralloc.h>
|
||||
#include <utils/Errors.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;
|
||||
|
Reference in New Issue
Block a user