diff options
Diffstat (limited to 'libs/hwui/jni/android_graphics_HardwareRenderer.cpp')
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 54367b8334cb..b5536ad4830d 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -73,6 +73,10 @@ struct { } gFrameDrawingCallback; struct { + jmethodID onFrameCommit; +} gFrameCommitCallback; + +struct { jmethodID onFrameComplete; } gFrameCompleteCallback; @@ -101,22 +105,21 @@ private: JavaVM* mVm; }; -class FrameCompleteWrapper : public LightRefBase<FrameCompleteWrapper> { +class FrameCommitWrapper : public LightRefBase<FrameCommitWrapper> { public: - explicit FrameCompleteWrapper(JNIEnv* env, jobject jobject) { + explicit FrameCommitWrapper(JNIEnv* env, jobject jobject) { env->GetJavaVM(&mVm); mObject = env->NewGlobalRef(jobject); LOG_ALWAYS_FATAL_IF(!mObject, "Failed to make global ref"); } - ~FrameCompleteWrapper() { - releaseObject(); - } + ~FrameCommitWrapper() { releaseObject(); } - void onFrameComplete(int64_t frameNr) { + void onFrameCommit(bool didProduceBuffer) { if (mObject) { - ATRACE_FORMAT("frameComplete %" PRId64, frameNr); - getenv(mVm)->CallVoidMethod(mObject, gFrameCompleteCallback.onFrameComplete, frameNr); + ATRACE_FORMAT("frameCommit success=%d", didProduceBuffer); + getenv(mVm)->CallVoidMethod(mObject, gFrameCommitCallback.onFrameCommit, + didProduceBuffer); releaseObject(); } } @@ -637,15 +640,33 @@ static void android_view_ThreadedRenderer_setFrameCallback(JNIEnv* env, } } +static void android_view_ThreadedRenderer_setFrameCommitCallback(JNIEnv* env, jobject clazz, + jlong proxyPtr, jobject callback) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + if (!callback) { + proxy->setFrameCommitCallback(nullptr); + } else { + sp<FrameCommitWrapper> wrapper = new FrameCommitWrapper{env, callback}; + proxy->setFrameCommitCallback( + [wrapper](bool didProduceBuffer) { wrapper->onFrameCommit(didProduceBuffer); }); + } +} + static void android_view_ThreadedRenderer_setFrameCompleteCallback(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject callback) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); if (!callback) { proxy->setFrameCompleteCallback(nullptr); } else { - sp<FrameCompleteWrapper> wrapper = new FrameCompleteWrapper{env, callback}; - proxy->setFrameCompleteCallback([wrapper](int64_t frameNr) { - wrapper->onFrameComplete(frameNr); + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + JavaVM* vm = nullptr; + LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Unable to get Java VM"); + auto globalCallbackRef = + std::make_shared<JGlobalRefHolder>(vm, env->NewGlobalRef(callback)); + proxy->setFrameCompleteCallback([globalCallbackRef]() { + JNIEnv* env = getenv(globalCallbackRef->vm()); + env->CallVoidMethod(globalCallbackRef->object(), + gFrameCompleteCallback.onFrameComplete); }); } } @@ -929,6 +950,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_view_ThreadedRenderer_setPrepareSurfaceControlForWebviewCallback}, {"nSetFrameCallback", "(JLandroid/graphics/HardwareRenderer$FrameDrawingCallback;)V", (void*)android_view_ThreadedRenderer_setFrameCallback}, + {"nSetFrameCommitCallback", "(JLandroid/graphics/HardwareRenderer$FrameCommitCallback;)V", + (void*)android_view_ThreadedRenderer_setFrameCommitCallback}, {"nSetFrameCompleteCallback", "(JLandroid/graphics/HardwareRenderer$FrameCompleteCallback;)V", (void*)android_view_ThreadedRenderer_setFrameCompleteCallback}, @@ -994,10 +1017,15 @@ int register_android_view_ThreadedRenderer(JNIEnv* env) { gFrameDrawingCallback.onFrameDraw = GetMethodIDOrDie(env, frameCallbackClass, "onFrameDraw", "(J)V"); + jclass frameCommitClass = + FindClassOrDie(env, "android/graphics/HardwareRenderer$FrameCommitCallback"); + gFrameCommitCallback.onFrameCommit = + GetMethodIDOrDie(env, frameCommitClass, "onFrameCommit", "(Z)V"); + jclass frameCompleteClass = FindClassOrDie(env, "android/graphics/HardwareRenderer$FrameCompleteCallback"); - gFrameCompleteCallback.onFrameComplete = GetMethodIDOrDie(env, frameCompleteClass, - "onFrameComplete", "(J)V"); + gFrameCompleteCallback.onFrameComplete = + GetMethodIDOrDie(env, frameCompleteClass, "onFrameComplete", "()V"); void* handle_ = dlopen("libandroid.so", RTLD_NOW | RTLD_NODELETE); fromSurface = (ANW_fromSurface)dlsym(handle_, "ANativeWindow_fromSurface"); |