Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23b797ab authored by John Reck's avatar John Reck
Browse files

EGL migration to native

 Move EGL state management to native side for RemoteGLRenderer

Change-Id: I12b0fed70246564d4caebf87374e8bbca655c572
parent dcd8258e
Loading
Loading
Loading
Loading
+52 −515

File changed.

Preview size limit exceeded, changes collapsed.

+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ LOCAL_SRC_FILES:= \
	android_view_GLRenderer.cpp \
	android_view_GLES20Canvas.cpp \
	android_view_ThreadedRenderer.cpp \
	android_view_RemoteGLRenderer.cpp \
	android_view_MotionEvent.cpp \
	android_view_PointerIcon.cpp \
	android_view_VelocityTracker.cpp \
+2 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ extern int register_android_view_GraphicBuffer(JNIEnv* env);
extern int register_android_view_GLES20Canvas(JNIEnv* env);
extern int register_android_view_GLRenderer(JNIEnv* env);
extern int register_android_view_ThreadedRenderer(JNIEnv* env);
extern int register_android_view_RemoteGLRenderer(JNIEnv* env);
extern int register_android_view_Surface(JNIEnv* env);
extern int register_android_view_SurfaceControl(JNIEnv* env);
extern int register_android_view_SurfaceSession(JNIEnv* env);
@@ -1129,6 +1130,7 @@ static const RegJNIRec gRegJNI[] = {
    REG_JNI(register_android_view_GLES20Canvas),
    REG_JNI(register_android_view_GLRenderer),
    REG_JNI(register_android_view_ThreadedRenderer),
    REG_JNI(register_android_view_RemoteGLRenderer),
    REG_JNI(register_android_view_Surface),
    REG_JNI(register_android_view_SurfaceControl),
    REG_JNI(register_android_view_SurfaceSession),
+99 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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.
 */

#define LOG_TAG "RemoteGLRenderer"

#include "jni.h"
#include <nativehelper/JNIHelp.h>

#include <utils/StrongPointer.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/AndroidRuntime.h>
#include <renderthread/CanvasContext.h>
#include <system/window.h>

namespace android {

#ifdef USE_OPENGL_RENDERER

#define CHECK_CONTEXT(c) if (!c) ALOGE("Null context passed to %s!", __func__ )

namespace RT = android::uirenderer::renderthread;

static jlong android_view_RemoteGLRenderer_createContext(JNIEnv* env, jobject clazz) {
    RT::CanvasContext* context = new RT::CanvasContext();
    return reinterpret_cast<jlong>(context);
}

static jboolean android_view_RemoteGLRenderer_usePBufferSurface(JNIEnv* env, jobject clazz) {
    return RT::CanvasContext::useGlobalPBufferSurface();
}

static jboolean android_view_RemoteGLRenderer_setSurface(JNIEnv* env, jobject clazz,
        jlong jcontextptr, jobject jsurface) {
    RT::CanvasContext* context = reinterpret_cast<RT::CanvasContext*>(jcontextptr);
    CHECK_CONTEXT(context);
    sp<ANativeWindow> window;
    if (jsurface) {
        window = android_view_Surface_getNativeWindow(env, jsurface);
    }
    return context->setSurface(window.get());
}

static jboolean android_view_RemoteGLRenderer_swapBuffers(JNIEnv* env, jobject clazz,
        jlong jcontextptr) {
    RT::CanvasContext* context = reinterpret_cast<RT::CanvasContext*>(jcontextptr);
    CHECK_CONTEXT(context);
    return context->swapBuffers();
}

static jboolean android_view_RemoteGLRenderer_makeCurrent(JNIEnv* env, jobject clazz,
        jlong jcontextptr) {
    RT::CanvasContext* context = reinterpret_cast<RT::CanvasContext*>(jcontextptr);
    CHECK_CONTEXT(context);
    return context->makeCurrent();
}

static void android_view_RemoteGLRenderer_destroyContext(JNIEnv* env, jobject clazz,
        jlong jcontextptr) {
    RT::CanvasContext* context = reinterpret_cast<RT::CanvasContext*>(jcontextptr);
    CHECK_CONTEXT(context);
    delete context;
}
#endif

// ----------------------------------------------------------------------------
// JNI Glue
// ----------------------------------------------------------------------------

const char* const kClassPathName = "android/view/RemoteGLRenderer";

static JNINativeMethod gMethods[] = {
#ifdef USE_OPENGL_RENDERER
    { "createContext", "()J",   (void*) android_view_RemoteGLRenderer_createContext },
    { "usePBufferSurface", "()Z",   (void*) android_view_RemoteGLRenderer_usePBufferSurface },
    { "setSurface", "(JLandroid/view/Surface;)Z",   (void*) android_view_RemoteGLRenderer_setSurface },
    { "swapBuffers", "(J)Z",   (void*) android_view_RemoteGLRenderer_swapBuffers },
    { "makeCurrent", "(J)Z",   (void*) android_view_RemoteGLRenderer_makeCurrent },
    { "destroyContext", "(J)V",   (void*) android_view_RemoteGLRenderer_destroyContext },
#endif
};

int register_android_view_RemoteGLRenderer(JNIEnv* env) {
    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
}

}; // namespace android
+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

#define LOG_TAG "GLRenderer"
#define LOG_TAG "ThreadedRenderer"

#include "jni.h"
#include <nativehelper/JNIHelp.h>
Loading