summaryrefslogtreecommitdiffstats
path: root/core/jni/android_view_HardwareRenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/jni/android_view_HardwareRenderer.cpp')
-rw-r--r--core/jni/android_view_HardwareRenderer.cpp107
1 files changed, 96 insertions, 11 deletions
diff --git a/core/jni/android_view_HardwareRenderer.cpp b/core/jni/android_view_HardwareRenderer.cpp
index cdcde51..4b62169 100644
--- a/core/jni/android_view_HardwareRenderer.cpp
+++ b/core/jni/android_view_HardwareRenderer.cpp
@@ -20,30 +20,105 @@
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
-#include <EGL/egl_cache.h>
-
-EGLAPI void EGLAPIENTRY eglBeginFrame(EGLDisplay dpy, EGLSurface surface);
+#ifdef USE_OPENGL_RENDERER
+ #include <EGL/egl_cache.h>
+ EGLAPI void EGLAPIENTRY eglBeginFrame(EGLDisplay dpy, EGLSurface surface);
+#endif
namespace android {
+/**
+ * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
+ * devices. This means all the logic must be compiled only when the
+ * preprocessor variable USE_OPENGL_RENDERER is defined.
+ */
+#ifdef USE_OPENGL_RENDERER
+
// ----------------------------------------------------------------------------
-// Misc
+// Defines
// ----------------------------------------------------------------------------
-static void android_view_HardwareRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
- jstring diskCachePath) {
+// Debug
+#define DEBUG_RENDERER 0
- const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
- egl_cache_t::get()->setCacheFilename(cacheArray);
- env->ReleaseStringUTFChars(diskCachePath, cacheArray);
+// Debug
+#if DEBUG_RENDERER
+ #define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
+#else
+ #define RENDERER_LOGD(...)
+#endif
+
+// ----------------------------------------------------------------------------
+// Surface and display management
+// ----------------------------------------------------------------------------
+
+static jboolean android_view_HardwareRenderer_preserveBackBuffer(JNIEnv* env, jobject clazz) {
+ EGLDisplay display = eglGetCurrentDisplay();
+ EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
+
+ eglGetError();
+ eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
+
+ EGLint error = eglGetError();
+ if (error != EGL_SUCCESS) {
+ RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error);
+ }
+
+ return error == EGL_SUCCESS;
}
+static jboolean android_view_HardwareRenderer_isBackBufferPreserved(JNIEnv* env, jobject clazz) {
+ EGLDisplay display = eglGetCurrentDisplay();
+ EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
+ EGLint value;
+
+ eglGetError();
+ eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &value);
+
+ EGLint error = eglGetError();
+ if (error != EGL_SUCCESS) {
+ RENDERER_LOGD("Could not query buffer preserved swap behavior (%x)", error);
+ }
+
+ return error == EGL_SUCCESS && value == EGL_BUFFER_PRESERVED;
+}
+
+static void android_view_HardwareRenderer_disableVsync(JNIEnv* env, jobject clazz) {
+ EGLDisplay display = eglGetCurrentDisplay();
+
+ eglGetError();
+ eglSwapInterval(display, 0);
+
+ EGLint error = eglGetError();
+ if (error != EGL_SUCCESS) {
+ RENDERER_LOGD("Could not disable v-sync (%x)", error);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Tracing and debugging
+// ----------------------------------------------------------------------------
+
static void android_view_HardwareRenderer_beginFrame(JNIEnv* env, jobject clazz) {
EGLDisplay dpy = eglGetCurrentDisplay();
EGLSurface surf = eglGetCurrentSurface(EGL_DRAW);
eglBeginFrame(dpy, surf);
}
+#endif // USE_OPENGL_RENDERER
+
+// ----------------------------------------------------------------------------
+// Shaders
+// ----------------------------------------------------------------------------
+
+static void android_view_HardwareRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
+ jstring diskCachePath) {
+
+ const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
+ egl_cache_t::get()->setCacheFilename(cacheArray);
+ env->ReleaseStringUTFChars(diskCachePath, cacheArray);
+}
+
// ----------------------------------------------------------------------------
// JNI Glue
// ----------------------------------------------------------------------------
@@ -51,10 +126,20 @@ static void android_view_HardwareRenderer_beginFrame(JNIEnv* env, jobject clazz)
const char* const kClassPathName = "android/view/HardwareRenderer";
static JNINativeMethod gMethods[] = {
- { "nSetupShadersDiskCache", "(Ljava/lang/String;)V",
- (void*) android_view_HardwareRenderer_setupShadersDiskCache },
+#ifdef USE_OPENGL_RENDERER
+ { "nIsBackBufferPreserved", "()Z",
+ (void*) android_view_HardwareRenderer_isBackBufferPreserved },
+ { "nPreserveBackBuffer", "()Z",
+ (void*) android_view_HardwareRenderer_preserveBackBuffer },
+ { "nDisableVsync", "()V",
+ (void*) android_view_HardwareRenderer_disableVsync },
+
{ "nBeginFrame", "()V",
(void*) android_view_HardwareRenderer_beginFrame },
+#endif
+
+ { "nSetupShadersDiskCache", "(Ljava/lang/String;)V",
+ (void*) android_view_HardwareRenderer_setupShadersDiskCache },
};
int register_android_view_HardwareRenderer(JNIEnv* env) {