Merge "Greatly simplify sample code by using EGL_NATIVE_VISUAL_ID." into gingerbread
This commit is contained in:
committed by
Android (Google) Code Review
commit
5a2fb6ce28
@@ -36,7 +36,7 @@ LOCAL_C_INCLUDES += \
|
|||||||
$(TOPDIR)development/ndk/sources/android/native_app_glue
|
$(TOPDIR)development/ndk/sources/android/native_app_glue
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
jni/main.c jni/glutils.c \
|
jni/main.c \
|
||||||
../../../../sources/android/native_app_glue/android_native_app_glue.c
|
../../../../sources/android/native_app_glue/android_native_app_glue.c
|
||||||
|
|
||||||
LOCAL_NDK_VERSION := 4
|
LOCAL_NDK_VERSION := 4
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_MODULE := native-activity
|
LOCAL_MODULE := native-activity
|
||||||
LOCAL_SRC_FILES := main.c glutils.c
|
LOCAL_SRC_FILES := main.c
|
||||||
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
|
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
|
||||||
LOCAL_STATIC_LIBRARIES := android_native_app_glue
|
LOCAL_STATIC_LIBRARIES := android_native_app_glue
|
||||||
|
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "glutils.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
const char *EGLstrerror(EGLint err) {
|
|
||||||
switch (err) {
|
|
||||||
case EGL_SUCCESS: return "EGL_SUCCESS";
|
|
||||||
case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED";
|
|
||||||
case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS";
|
|
||||||
case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC";
|
|
||||||
case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE";
|
|
||||||
case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG";
|
|
||||||
case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT";
|
|
||||||
case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
|
|
||||||
case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY";
|
|
||||||
case EGL_BAD_MATCH: return "EGL_BAD_MATCH";
|
|
||||||
case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
|
|
||||||
case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
|
|
||||||
case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER";
|
|
||||||
case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE";
|
|
||||||
case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST";
|
|
||||||
default: return "UNKNOWN";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t selectConfigForPixelFormat(EGLDisplay dpy, EGLint const* attrs,
|
|
||||||
int32_t format, EGLConfig* outConfig) {
|
|
||||||
EGLint numConfigs = -1, n=0;
|
|
||||||
|
|
||||||
if (!attrs)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (outConfig == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
int fbSzA, fbSzR, fbSzG, fbSzB;
|
|
||||||
switch (format) {
|
|
||||||
case WINDOW_FORMAT_RGBA_8888:
|
|
||||||
fbSzA = fbSzR = fbSzG = fbSzB = 8;
|
|
||||||
break;
|
|
||||||
case WINDOW_FORMAT_RGBX_8888:
|
|
||||||
fbSzA = 0; fbSzR = fbSzG = fbSzB = 8;
|
|
||||||
break;
|
|
||||||
case WINDOW_FORMAT_RGB_565:
|
|
||||||
fbSzA = 0; fbSzR = 5; fbSzG = 6; fbSzB = 5;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOGW("Unknown format");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all the "potential match" configs...
|
|
||||||
if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE) {
|
|
||||||
LOGW("eglGetConfigs failed");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);
|
|
||||||
if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
|
|
||||||
free(configs);
|
|
||||||
LOGW("eglChooseConfig failed");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int i;
|
|
||||||
EGLConfig config = NULL;
|
|
||||||
for (i=0 ; i<n ; i++) {
|
|
||||||
EGLint r,g,b,a;
|
|
||||||
EGLConfig curr = configs[i];
|
|
||||||
eglGetConfigAttrib(dpy, curr, EGL_RED_SIZE, &r);
|
|
||||||
eglGetConfigAttrib(dpy, curr, EGL_GREEN_SIZE, &g);
|
|
||||||
eglGetConfigAttrib(dpy, curr, EGL_BLUE_SIZE, &b);
|
|
||||||
eglGetConfigAttrib(dpy, curr, EGL_ALPHA_SIZE, &a);
|
|
||||||
if (fbSzA == a && fbSzR == r && fbSzG == g && fbSzB == b) {
|
|
||||||
config = curr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(configs);
|
|
||||||
|
|
||||||
if (i<n) {
|
|
||||||
*outConfig = config;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOGW("No config with desired pixel format");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t selectConfigForNativeWindow(EGLDisplay dpy, EGLint const* attrs,
|
|
||||||
EGLNativeWindowType window, EGLConfig* outConfig) {
|
|
||||||
int err;
|
|
||||||
int format;
|
|
||||||
|
|
||||||
if (!window)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return selectConfigForPixelFormat(dpy, attrs,
|
|
||||||
ANativeWindow_getFormat(window), outConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <android/native_activity.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
|
|
||||||
#include <EGL/egl.h>
|
|
||||||
#include <GLES/gl.h>
|
|
||||||
#include <GLES/glext.h>
|
|
||||||
|
|
||||||
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
|
|
||||||
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
|
|
||||||
|
|
||||||
extern const char *EGLstrerror(EGLint err);
|
|
||||||
extern int32_t selectConfigForPixelFormat(EGLDisplay dpy, EGLint const* attrs,
|
|
||||||
int32_t format, EGLConfig* outConfig);
|
|
||||||
extern int32_t selectConfigForNativeWindow(EGLDisplay dpy, EGLint const* attrs,
|
|
||||||
EGLNativeWindowType window, EGLConfig* outConfig);
|
|
||||||
@@ -19,11 +19,15 @@
|
|||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <android/sensor.h>
|
#include <EGL/egl.h>
|
||||||
|
#include <GLES/gl.h>
|
||||||
|
|
||||||
|
#include <android/sensor.h>
|
||||||
|
#include <android/log.h>
|
||||||
#include <android_native_app_glue.h>
|
#include <android_native_app_glue.h>
|
||||||
|
|
||||||
#include "glutils.h"
|
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
|
||||||
|
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Our saved state data.
|
* Our saved state data.
|
||||||
@@ -57,12 +61,21 @@ struct engine {
|
|||||||
* Initialize an EGL context for the current display.
|
* Initialize an EGL context for the current display.
|
||||||
*/
|
*/
|
||||||
static int engine_init_display(struct engine* engine) {
|
static int engine_init_display(struct engine* engine) {
|
||||||
// initialize opengl and egl
|
// initialize OpenGL ES and EGL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Here specify the attributes of the desired configuration.
|
||||||
|
* Below, we select an EGLConfig with at least 8 bits per color
|
||||||
|
* component compatible with on-screen windows
|
||||||
|
*/
|
||||||
const EGLint attribs[] = {
|
const EGLint attribs[] = {
|
||||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
|
EGL_BLUE_SIZE, 8,
|
||||||
|
EGL_GREEN_SIZE, 8,
|
||||||
|
EGL_RED_SIZE, 8,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
EGLint w, h, dummy;
|
EGLint w, h, dummy, format;
|
||||||
EGLint numConfigs;
|
EGLint numConfigs;
|
||||||
EGLConfig config;
|
EGLConfig config;
|
||||||
EGLSurface surface;
|
EGLSurface surface;
|
||||||
@@ -71,7 +84,19 @@ static int engine_init_display(struct engine* engine) {
|
|||||||
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||||
|
|
||||||
eglInitialize(display, 0, 0);
|
eglInitialize(display, 0, 0);
|
||||||
selectConfigForNativeWindow(display, attribs, engine->app->window, &config);
|
|
||||||
|
/* Here, the application chooses the configuration it desires. In this
|
||||||
|
* sample, we have a very simplified selection process, where we pick
|
||||||
|
* the first EGLConfig that matches our criteria */
|
||||||
|
eglChooseConfig(display, attribs, &config, 1, &numConfigs);
|
||||||
|
|
||||||
|
/* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
|
||||||
|
* guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
|
||||||
|
* As soon as we picked a EGLConfig, we can safely reconfigure the
|
||||||
|
* ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
|
||||||
|
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
|
||||||
|
|
||||||
|
ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
|
||||||
|
|
||||||
surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
|
surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
|
||||||
context = eglCreateContext(display, config, NULL, NULL);
|
context = eglCreateContext(display, config, NULL, NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user