diff options
Diffstat (limited to 'libs/hwui/jni/android_graphics_HardwareRenderer.cpp')
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index bd1da985a33e..dd78d5869314 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -64,6 +64,10 @@ struct { } gHardwareRenderer; struct { + jmethodID onMergeTransaction; +} gASurfaceTransactionCallback; + +struct { jmethodID onFrameDraw; } gFrameDrawingCallback; @@ -509,6 +513,27 @@ static void android_view_ThreadedRenderer_setPictureCapturedCallbackJNI(JNIEnv* } } +static void android_view_ThreadedRenderer_setASurfaceTransactionCallback( + JNIEnv* env, jobject clazz, jlong proxyPtr, jobject aSurfaceTransactionCallback) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + if (!aSurfaceTransactionCallback) { + proxy->setASurfaceTransactionCallback(nullptr); + } else { + 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(aSurfaceTransactionCallback)); + proxy->setASurfaceTransactionCallback( + [globalCallbackRef](int64_t transObj, int64_t scObj, int64_t frameNr) { + JNIEnv* env = getenv(globalCallbackRef->vm()); + env->CallVoidMethod(globalCallbackRef->object(), + gASurfaceTransactionCallback.onMergeTransaction, + static_cast<jlong>(transObj), static_cast<jlong>(scObj), + static_cast<jlong>(frameNr)); + }); + } +} + static void android_view_ThreadedRenderer_setFrameCallback(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject frameCallback) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); @@ -605,7 +630,8 @@ static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode( nsecs_t vsync = systemTime(SYSTEM_TIME_MONOTONIC); UiFrameInfoBuilder(proxy.frameInfo()) .setVsync(vsync, vsync, UiFrameInfoBuilder::INVALID_VSYNC_ID, - std::numeric_limits<int64_t>::max()) + UiFrameInfoBuilder::UNKNOWN_DEADLINE, + UiFrameInfoBuilder::UNKNOWN_FRAME_INTERVAL) .addFlag(FrameInfoFlags::SurfaceCanvas); proxy.syncAndDrawFrame(); } @@ -761,8 +787,7 @@ static const JNINativeMethod gMethods[] = { {"nSetName", "(JLjava/lang/String;)V", (void*)android_view_ThreadedRenderer_setName}, {"nSetSurface", "(JLandroid/view/Surface;Z)V", (void*)android_view_ThreadedRenderer_setSurface}, - {"nSetSurfaceControl", "(JJ)V", - (void*)android_view_ThreadedRenderer_setSurfaceControl}, + {"nSetSurfaceControl", "(JJ)V", (void*)android_view_ThreadedRenderer_setSurfaceControl}, {"nPause", "(J)Z", (void*)android_view_ThreadedRenderer_pause}, {"nSetStopped", "(JZ)V", (void*)android_view_ThreadedRenderer_setStopped}, {"nSetLightAlpha", "(JFF)V", (void*)android_view_ThreadedRenderer_setLightAlpha}, @@ -803,6 +828,9 @@ static const JNINativeMethod gMethods[] = { {"nSetPictureCaptureCallback", "(JLandroid/graphics/HardwareRenderer$PictureCapturedCallback;)V", (void*)android_view_ThreadedRenderer_setPictureCapturedCallbackJNI}, + {"nSetASurfaceTransactionCallback", + "(JLandroid/graphics/HardwareRenderer$ASurfaceTransactionCallback;)V", + (void*)android_view_ThreadedRenderer_setASurfaceTransactionCallback}, {"nSetFrameCallback", "(JLandroid/graphics/HardwareRenderer$FrameDrawingCallback;)V", (void*)android_view_ThreadedRenderer_setFrameCallback}, {"nSetFrameCompleteCallback", @@ -865,6 +893,11 @@ int register_android_view_ThreadedRenderer(JNIEnv* env) { GetStaticMethodIDOrDie(env, hardwareRenderer, "closeHintSession", "(Landroid/os/PerformanceHintManager$Session;)V"); + jclass aSurfaceTransactionCallbackClass = + FindClassOrDie(env, "android/graphics/HardwareRenderer$ASurfaceTransactionCallback"); + gASurfaceTransactionCallback.onMergeTransaction = + GetMethodIDOrDie(env, aSurfaceTransactionCallbackClass, "onMergeTransaction", "(JJJ)V"); + jclass frameCallbackClass = FindClassOrDie(env, "android/graphics/HardwareRenderer$FrameDrawingCallback"); gFrameDrawingCallback.onFrameDraw = GetMethodIDOrDie(env, frameCallbackClass, |