android_view_ThreadedRenderer.cpp revision 8afcc76920499d0a384dba1470c5a377f80ed768
1cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/* 2cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Copyright (C) 2010 The Android Open Source Project 3cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 4cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * you may not use this file except in compliance with the License. 6cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * You may obtain a copy of the License at 7cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 8cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 10cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Unless required by applicable law or agreed to in writing, software 11cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * See the License for the specific language governing permissions and 14cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * limitations under the License. 15cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */ 16cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define LOG_TAG "ThreadedRenderer" 18cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <algorithm> 2011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales#include <atomic> 21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 22cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include "jni.h" 23cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <nativehelper/JNIHelp.h> 24ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 253731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck#include <GraphicsJNI.h> 26edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <ScopedPrimitiveArray.h> 27cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 2884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl.h> 2984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/eglext.h> 3084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl_cache.h> 3103d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine#include <vulkan/vulkan_loader_data.h> 3284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 3306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include <utils/Looper.h> 3406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include <utils/RefBase.h> 354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h> 364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h> 374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h> 384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include "android_view_GraphicBuffer.h" 4006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include "android_os_MessageQueue.h" 4166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 4252244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h> 43119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <AnimationContext.h> 4406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include <FrameInfo.h> 45910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales#include <FrameMetricsObserver.h> 46119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <IContextFactory.h> 47edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <JankTracker.h> 48e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h> 4966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include <renderthread/CanvasContext.h> 504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h> 51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h> 52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h> 53797b95b26bbb7557678af78b9a2a61830158920fChris Craik#include <Vector.h> 54cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 55cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android { 56cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer; 584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread; 59cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 6006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesstruct { 61910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jfieldID frameMetrics; 62910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jfieldID timingDataBuffer; 6306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jfieldID messageQueue; 64910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jmethodID callback; 65910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales} gFrameMetricsObserverClassInfo; 6606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 67c25e506f7fc08790c0532f927f31310a2ca778b7John Reckstatic JNIEnv* getenv(JavaVM* vm) { 68c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env; 69c25e506f7fc08790c0532f927f31310a2ca778b7John Reck if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 70c25e506f7fc08790c0532f927f31310a2ca778b7John Reck LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm); 71c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 72c25e506f7fc08790c0532f927f31310a2ca778b7John Reck return env; 73c25e506f7fc08790c0532f927f31310a2ca778b7John Reck} 74c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 7551f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck// TODO: Clean this up, it's a bit odd to need to call over to 7651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck// rendernode's jni layer. Probably means RootRenderNode should be pulled 7751f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck// into HWUI with appropriate callbacks for the various JNI hooks so 7851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck// that RenderNode's JNI layer can handle its own thing 7951f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reckvoid onRenderNodeRemoved(JNIEnv* env, RenderNode* node); 8051f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck 8151f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reckclass ScopedRemovedRenderNodeObserver : public TreeObserver { 8251f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reckpublic: 8351f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck ScopedRemovedRenderNodeObserver(JNIEnv* env) : mEnv(env) {} 8451f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck ~ScopedRemovedRenderNodeObserver() { 8551f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck for (auto& node : mMaybeRemovedNodes) { 8651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck if (node->hasParents()) continue; 8751f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck onRenderNodeRemoved(mEnv, node.get()); 8851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck } 8951f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck } 9051f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck 9151f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck virtual void onMaybeRemovedFromTree(RenderNode* node) override { 9251f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck mMaybeRemovedNodes.insert(sp<RenderNode>(node)); 9351f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck } 9451f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck 9551f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reckprivate: 9651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck JNIEnv* mEnv; 9751f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck std::set< sp<RenderNode> > mMaybeRemovedNodes; 9851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck}; 9951f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck 10052244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent { 10152244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 102ff941dcd815021bb20d6504eb486acb1e50592c3John Reck OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener) 10352244fff29042926e21fa897ef5ab11148e35299John Reck : animator(animator), listener(listener) {} 104ff941dcd815021bb20d6504eb486acb1e50592c3John Reck sp<BaseRenderNodeAnimator> animator; 10552244fff29042926e21fa897ef5ab11148e35299John Reck sp<AnimationListener> listener; 10652244fff29042926e21fa897ef5ab11148e35299John Reck}; 10752244fff29042926e21fa897ef5ab11148e35299John Reck 108e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler { 109e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 11052244fff29042926e21fa897ef5ab11148e35299John Reck InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) { 11152244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.swap(events); 112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 11452244fff29042926e21fa897ef5ab11148e35299John Reck static void callOnFinished(OnFinishedEvent& event) { 11552244fff29042926e21fa897ef5ab11148e35299John Reck event.listener->onAnimationFinished(event.animator.get()); 116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void handleMessage(const Message& message) { 11952244fff29042926e21fa897ef5ab11148e35299John Reck std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished); 12052244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.clear(); 121e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 122e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 12452244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 127c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass RenderingException : public MessageHandler { 128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 129c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RenderingException(JavaVM* vm, const std::string& message) 130c25e506f7fc08790c0532f927f31310a2ca778b7John Reck : mVm(vm) 131c25e506f7fc08790c0532f927f31310a2ca778b7John Reck , mMessage(message) { 132c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 133c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 134c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void handleMessage(const Message&) { 135c25e506f7fc08790c0532f927f31310a2ca778b7John Reck throwException(mVm, mMessage); 136c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 137c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 138c25e506f7fc08790c0532f927f31310a2ca778b7John Reck static void throwException(JavaVM* vm, const std::string& message) { 139c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env = getenv(vm); 140c25e506f7fc08790c0532f927f31310a2ca778b7John Reck jniThrowException(env, "java/lang/IllegalStateException", message.c_str()); 141c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 142c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 143c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprivate: 144c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JavaVM* mVm; 145c25e506f7fc08790c0532f927f31310a2ca778b7John Reck std::string mMessage; 146c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}; 147c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 14851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reckclass RootRenderNode : public RenderNode, ErrorHandler { 149c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic: 150c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode(JNIEnv* env) : RenderNode() { 151e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mLooper = Looper::getForThread(); 152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck LOG_ALWAYS_FATAL_IF(!mLooper.get(), 153e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck "Must create RootRenderNode on a thread with a looper!"); 154c25e506f7fc08790c0532f927f31310a2ca778b7John Reck env->GetJavaVM(&mVm); 155e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual ~RootRenderNode() {} 158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 15944b49f070aafe8ad44efae87341121cce49ff11cJohn Reck virtual void onError(const std::string& message) override { 160c25e506f7fc08790c0532f927f31310a2ca778b7John Reck mLooper->sendMessage(new RenderingException(mVm, message), 0); 161c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 162c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 16344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck virtual void prepareTree(TreeInfo& info) override { 164c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = this; 165f648108f83d4e74811919e9811efb8fcc184b8a3John Reck // TODO: This is hacky 166f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.windowInsetLeft = -stagingProperties().getLeft(); 167f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.windowInsetTop = -stagingProperties().getTop(); 168f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.updateWindowPositions = true; 169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderNode::prepareTree(info); 170f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.updateWindowPositions = false; 171f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.windowInsetLeft = 0; 172f648108f83d4e74811919e9811efb8fcc184b8a3John Reck info.windowInsetTop = 0; 17344b49f070aafe8ad44efae87341121cce49ff11cJohn Reck info.errorHandler = nullptr; 174119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 175119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 176119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void sendMessage(const sp<MessageHandler>& handler) { 177119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mLooper->sendMessage(handler, 0); 178119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 179119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 180119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void attachAnimatingNode(RenderNode* animatingNode) { 181119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.push_back(animatingNode); 182119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 183119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 184119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void doAttachAnimatingNodes(AnimationContext* context) { 185119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { 186119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* node = mPendingAnimatingRenderNodes[i].get(); 187119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck context->addAnimatingRenderNode(*node); 188119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 189119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.clear(); 190119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 191119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 192350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu void destroy() { 193350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu for (auto& renderNode : mPendingAnimatingRenderNodes) { 194350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu renderNode->animators().endAllStagingAnimators(); 195350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu } 196350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu mPendingAnimatingRenderNodes.clear(); 197350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu } 198350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu 199119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 200119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<Looper> mLooper; 201119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck JavaVM* mVm; 202119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes; 203119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 204119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 205119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass AnimationContextBridge : public AnimationContext { 206119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 207119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode) 208119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck : AnimationContext(clock), mRootNode(rootNode) { 209119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 210119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 211119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual ~AnimationContextBridge() {} 212e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 213119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Marks the start of a frame, which will update the frame time and move all 214119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // next frame animations into the current frame 215ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck virtual void startFrame(TreeInfo::TraversalMode mode) { 216ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck if (mode == TreeInfo::MODE_FULL) { 217ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck mRootNode->doAttachAnimatingNodes(this); 218ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck } 219ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck AnimationContext::startFrame(mode); 220119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 221119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 222119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Runs any animations still left in mCurrentFrameAnimations 223119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void runRemainingAnimations(TreeInfo& info) { 224119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContext::runRemainingAnimations(info); 225e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 226e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 227e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 228119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { 229119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck OnFinishedEvent event(animator, listener); 230119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mOnFinishedEvents.push_back(event); 231119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 232119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 233e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck virtual void destroy() { 234e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck AnimationContext::destroy(); 235e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 236e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 237e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 238e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 239119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<RootRenderNode> mRootNode; 24052244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 241e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 242e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck void postOnFinishedEvents() { 243e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck if (mOnFinishedEvents.size()) { 244e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck sp<InvokeAnimationListeners> message 245e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck = new InvokeAnimationListeners(mOnFinishedEvents); 246e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck mRootNode->sendMessage(message); 247e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 248e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 249119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 250119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 251119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass ContextFactoryImpl : public IContextFactory { 252119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 253119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} 254119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 255119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) { 256119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return new AnimationContextBridge(clock, mRootNode); 257119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 258119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 259119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 260119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* mRootNode; 261e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 262e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 26306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesclass ObserverProxy; 26406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 26506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesclass NotifyHandler : public MessageHandler { 26606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralespublic: 26711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales NotifyHandler(JavaVM* vm, ObserverProxy* observer) : mVm(vm), mObserver(observer) {} 268910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 26906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales virtual void handleMessage(const Message& message); 27006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 27106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesprivate: 27211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales JavaVM* const mVm; 27311f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales ObserverProxy* const mObserver; 27406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales}; 27506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 276910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesstatic jlongArray get_metrics_buffer(JNIEnv* env, jobject observer) { 277910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jobject frameMetrics = env->GetObjectField( 278910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales observer, gFrameMetricsObserverClassInfo.frameMetrics); 279910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales LOG_ALWAYS_FATAL_IF(frameMetrics == nullptr, "unable to retrieve data sink object"); 280910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jobject buffer = env->GetObjectField( 281910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales frameMetrics, gFrameMetricsObserverClassInfo.timingDataBuffer); 282910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales LOG_ALWAYS_FATAL_IF(buffer == nullptr, "unable to retrieve data sink buffer"); 283910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales return reinterpret_cast<jlongArray>(buffer); 284910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales} 285910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 28611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales/* 28711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales * Implements JNI layer for hwui frame metrics reporting. 28811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales */ 289910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesclass ObserverProxy : public FrameMetricsObserver { 29006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralespublic: 291910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales ObserverProxy(JavaVM *vm, jobject observer) : mVm(vm) { 29206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JNIEnv* env = getenv(mVm); 29306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 294910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales mObserverWeak = env->NewWeakGlobalRef(observer); 295910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales LOG_ALWAYS_FATAL_IF(mObserverWeak == nullptr, 29606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "unable to create frame stats observer reference"); 29706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 298910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jlongArray buffer = get_metrics_buffer(env, observer); 299910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jsize bufferSize = env->GetArrayLength(reinterpret_cast<jarray>(buffer)); 300910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales LOG_ALWAYS_FATAL_IF(bufferSize != kBufferSize, 301910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales "Mismatched Java/Native FrameMetrics data format."); 302910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 303910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jobject messageQueueLocal = env->GetObjectField( 304910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales observer, gFrameMetricsObserverClassInfo.messageQueue); 30506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mMessageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueLocal); 30606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL_IF(mMessageQueue == nullptr, "message queue not available"); 30706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 30811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mMessageHandler = new NotifyHandler(mVm, this); 30906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL_IF(mMessageHandler == nullptr, 31006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "OOM: unable to allocate NotifyHandler"); 31106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 31206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 31306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales ~ObserverProxy() { 31406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JNIEnv* env = getenv(mVm); 315910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales env->DeleteWeakGlobalRef(mObserverWeak); 31606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 31706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 318910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jweak getObserverReference() { 319910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales return mObserverWeak; 32006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 32106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 32211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales bool getNextBuffer(JNIEnv* env, jlongArray sink, int* dropCount) { 32311f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales FrameMetricsNotification& elem = mRingBuffer[mNextInQueue]; 32411f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 32511f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales if (elem.hasData.load()) { 32611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales env->SetLongArrayRegion(sink, 0, kBufferSize, elem.buffer); 32711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales *dropCount = elem.dropCount; 32811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mNextInQueue = (mNextInQueue + 1) % kRingSize; 32911f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales elem.hasData = false; 33011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales return true; 33111f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales } 33211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 33311f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales return false; 33411f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales } 33511f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 33611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales virtual void notify(const int64_t* stats) { 33711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales FrameMetricsNotification& elem = mRingBuffer[mNextFree]; 33811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 33911f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales if (!elem.hasData.load()) { 34011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales memcpy(elem.buffer, stats, kBufferSize * sizeof(stats[0])); 34111f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 34211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales elem.dropCount = mDroppedReports; 34311f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mDroppedReports = 0; 34411f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 34511f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales incStrong(nullptr); 34611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mNextFree = (mNextFree + 1) % kRingSize; 34711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales elem.hasData = true; 34811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 34911f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mMessageQueue->getLooper()->sendMessage(mMessageHandler, mMessage); 35011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales } else { 35111f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mDroppedReports++; 35211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales } 35306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 35406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 35506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesprivate: 35606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales static const int kBufferSize = static_cast<int>(FrameInfoIndex::NumIndexes); 35711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales static constexpr int kRingSize = 3; 35806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 35911f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales class FrameMetricsNotification { 36011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales public: 36111f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales FrameMetricsNotification() : hasData(false) {} 36211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 36311f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales std::atomic_bool hasData; 36411f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales int64_t buffer[kBufferSize]; 36511f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales int dropCount = 0; 36611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales }; 36711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 36811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales JavaVM* const mVm; 369910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jweak mObserverWeak; 370910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jobject mJavaBufferGlobal; 37106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 37206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales sp<MessageQueue> mMessageQueue; 37306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales sp<NotifyHandler> mMessageHandler; 37406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales Message mMessage; 375910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 37611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales int mNextFree = 0; 37711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales int mNextInQueue = 0; 37811f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales FrameMetricsNotification mRingBuffer[kRingSize]; 37911f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales 38011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales int mDroppedReports = 0; 38106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales}; 38206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 38306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesvoid NotifyHandler::handleMessage(const Message& message) { 38406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JNIEnv* env = getenv(mVm); 38506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 38611f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales jobject target = env->NewLocalRef(mObserver->getObserverReference()); 38706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 38806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales if (target != nullptr) { 389910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jlongArray javaBuffer = get_metrics_buffer(env, target); 39011f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales int dropCount = 0; 39111f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales while (mObserver->getNextBuffer(env, javaBuffer, &dropCount)) { 39211f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales env->CallVoidMethod(target, gFrameMetricsObserverClassInfo.callback, dropCount); 39311f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales } 394910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales env->DeleteLocalRef(target); 39506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 39606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 39711f02d7e522ec8742f7ef533c252e04e24b93f6bAndres Morales mObserver->decStrong(nullptr); 39806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 39906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 40066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz, 4013b20251a355c88193c439f928a84ae69483fb488John Reck jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) { 40266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer); 40366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck jsize len = env->GetArrayLength(atlasMapArray); 40466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (len <= 0) { 40566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck ALOGW("Failed to initialize atlas, invalid map length: %d", len); 40666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck return; 40766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 40866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck int64_t* map = new int64_t[len]; 40966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck env->GetLongArrayRegion(atlasMapArray, 0, len, map); 41066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 4113b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 4123b20251a355c88193c439f928a84ae69483fb488John Reck proxy->setTextureAtlas(buffer, map, len); 4134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4144f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 415edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, jobject clazz, 416edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck jlong proxyPtr, jint fd) { 417edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 418edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck proxy->setProcessStatsBuffer(fd); 419edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck} 420edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 421e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { 422c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode* node = new RootRenderNode(env); 423e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->incStrong(0); 424e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->setName("RootRenderNode"); 425e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return reinterpret_cast<jlong>(node); 426e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 427e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 4284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz, 429e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jboolean translucent, jlong rootRenderNodePtr) { 430119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr); 431119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl factory(rootRenderNode); 432119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return (jlong) new RenderProxy(translucent, rootRenderNode, &factory); 4334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 4354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz, 4364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 43719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 4384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck delete proxy; 4394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 441e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, 442e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck jlong proxyPtr) { 443e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 444e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck return proxy->loadSystemProperties(); 445e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck} 446e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck 447b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reckstatic void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz, 448b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck jlong proxyPtr, jstring jname) { 449b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 450b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck const char* name = env->GetStringUTFChars(jname, NULL); 451b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck proxy->setName(name); 452b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck env->ReleaseStringUTFChars(jname, name); 453b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck} 454b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck 4550bcd0cb6b1193168fa2840855195347488daab9eThomas Buhotstatic void android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, 4564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 45719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 458f648108f83d4e74811919e9811efb8fcc184b8a3John Reck sp<Surface> surface = android_view_Surface_getSurface(env, jsurface); 459f648108f83d4e74811919e9811efb8fcc184b8a3John Reck proxy->initialize(surface); 4604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 4624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, 4634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 46419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 465f648108f83d4e74811919e9811efb8fcc184b8a3John Reck sp<Surface> surface; 4664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (jsurface) { 467f648108f83d4e74811919e9811efb8fcc184b8a3John Reck surface = android_view_Surface_getSurface(env, jsurface); 4684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 469f648108f83d4e74811919e9811efb8fcc184b8a3John Reck proxy->updateSurface(surface); 470f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck} 471f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 47201a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reckstatic jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, 473f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck jlong proxyPtr, jobject jsurface) { 474f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 475f648108f83d4e74811919e9811efb8fcc184b8a3John Reck sp<Surface> surface; 476f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (jsurface) { 477f648108f83d4e74811919e9811efb8fcc184b8a3John Reck surface = android_view_Surface_getSurface(env, jsurface); 478f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 479f648108f83d4e74811919e9811efb8fcc184b8a3John Reck return proxy->pauseSurface(surface); 4804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 4828afcc76920499d0a384dba1470c5a377f80ed768John Reckstatic void android_view_ThreadedRenderer_setStopped(JNIEnv* env, jobject clazz, 4838afcc76920499d0a384dba1470c5a377f80ed768John Reck jlong proxyPtr, jboolean stopped) { 4848afcc76920499d0a384dba1470c5a377f80ed768John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 4858afcc76920499d0a384dba1470c5a377f80ed768John Reck proxy->setStopped(stopped); 4868afcc76920499d0a384dba1470c5a377f80ed768John Reck} 4878afcc76920499d0a384dba1470c5a377f80ed768John Reck 488797b95b26bbb7557678af78b9a2a61830158920fChris Craikstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, 48950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette jint width, jint height, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha) { 49019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 49150210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setup(width, height, lightRadius, ambientShadowAlpha, spotShadowAlpha); 49250210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette} 49350210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette 49450210d912925aef14e4ce69be82e4949122a3cd9Alan Viverettestatic void android_view_ThreadedRenderer_setLightCenter(JNIEnv* env, jobject clazz, 49550210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette jlong proxyPtr, jfloat lightX, jfloat lightY, jfloat lightZ) { 49650210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 49750210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setLightCenter((Vector3){lightX, lightY, lightZ}); 4984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 50063a06673253914510bbeebd500655008682dade1John Reckstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, 50163a06673253914510bbeebd500655008682dade1John Reck jlong proxyPtr, jboolean opaque) { 50263a06673253914510bbeebd500655008682dade1John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 50363a06673253914510bbeebd500655008682dade1John Reck proxy->setOpaque(opaque); 50463a06673253914510bbeebd500655008682dade1John Reck} 50563a06673253914510bbeebd500655008682dade1John Reck 506f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, 50751f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck jlong proxyPtr, jlongArray frameInfo, jint frameInfoSize) { 508ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck LOG_ALWAYS_FATAL_IF(frameInfoSize != UI_THREAD_FRAME_INFO_SIZE, 509ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck "Mismatched size expectations, given %d expected %d", 510ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck frameInfoSize, UI_THREAD_FRAME_INFO_SIZE); 51119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 51251f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck ScopedRemovedRenderNodeObserver observer(env); 513ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck env->GetLongArrayRegion(frameInfo, 0, frameInfoSize, proxy->frameInfo()); 51451f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck return proxy->syncAndDrawFrame(&observer); 5154f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 5164f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 51717035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckstatic void android_view_ThreadedRenderer_destroy(JNIEnv* env, jobject clazz, 518350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu jlong proxyPtr, jlong rootNodePtr) { 51951f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck ScopedRemovedRenderNodeObserver observer(env); 520350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr); 521350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu rootRenderNode->destroy(); 52219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 52351f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck proxy->destroy(&observer); 5244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 5254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 526119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_ThreadedRenderer_registerAnimatingRenderNode(JNIEnv* env, jobject clazz, 527119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong rootNodePtr, jlong animatingNodePtr) { 528119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr); 529119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* animatingNode = reinterpret_cast<RenderNode*>(animatingNodePtr); 530119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck rootRenderNode->attachAnimatingNode(animatingNode); 531119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck} 532119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 5330d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz, 5343b20251a355c88193c439f928a84ae69483fb488John Reck jlong functorPtr, jboolean waitForCompletion) { 5350d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck Functor* functor = reinterpret_cast<Functor*>(functorPtr); 5363b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy::invokeFunctor(functor, waitForCompletion); 5370d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck} 5380d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 53919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz, 54019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr) { 54119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 54219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createTextureLayer(); 54319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 54419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 54519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 5463e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reckstatic void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz, 5473e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck jlong proxyPtr, jlong nodePtr) { 54851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck ScopedRemovedRenderNodeObserver observer(env); 5493e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 5503e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr); 55151f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck proxy->buildLayer(node, &observer); 5523e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck} 5533e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 55419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz, 5553731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck jlong proxyPtr, jlong layerPtr, jobject jbitmap) { 55619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 55719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 5583731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck SkBitmap bitmap; 5593731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap); 56019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return proxy->copyLayerInto(layer, bitmap); 56119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 56219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 563d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_pushLayerUpdate(JNIEnv* env, jobject clazz, 56419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr) { 56519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 56619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 567d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->pushLayerUpdate(layer); 568d72e0a339b54af0c4e731513bbad120dff694723John Reck} 569d72e0a339b54af0c4e731513bbad120dff694723John Reck 570d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_cancelLayerUpdate(JNIEnv* env, jobject clazz, 571d72e0a339b54af0c4e731513bbad120dff694723John Reck jlong proxyPtr, jlong layerPtr) { 572d72e0a339b54af0c4e731513bbad120dff694723John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 573d72e0a339b54af0c4e731513bbad120dff694723John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 574d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->cancelLayerUpdate(layer); 57519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 57619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 577918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reckstatic void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz, 578918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck jlong proxyPtr, jlong layerPtr) { 579918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 580918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 581918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck proxy->detachSurfaceTexture(layer); 582918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck} 583918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck 584f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_destroyHardwareResources(JNIEnv* env, jobject clazz, 585f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 58651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck ScopedRemovedRenderNodeObserver observer(env); 587e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 58851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck proxy->destroyHardwareResources(&observer); 589f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 590f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 591f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_trimMemory(JNIEnv* env, jobject clazz, 592f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jint level) { 593f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy::trimMemory(level); 594e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck} 595e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 5962507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craikstatic void android_view_ThreadedRenderer_overrideProperty(JNIEnv* env, jobject clazz, 5972507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik jstring name, jstring value) { 5982507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik const char* nameCharArray = env->GetStringUTFChars(name, NULL); 5992507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik const char* valueCharArray = env->GetStringUTFChars(value, NULL); 6002507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik RenderProxy::overrideProperty(nameCharArray, valueCharArray); 6012507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik env->ReleaseStringUTFChars(name, nameCharArray); 6022507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik env->ReleaseStringUTFChars(name, valueCharArray); 6032507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik} 6042507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik 60528ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz, 60628ad7b52e038ef0cdd89f753d9839444a434b299John Reck jlong proxyPtr) { 60728ad7b52e038ef0cdd89f753d9839444a434b299John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 60828ad7b52e038ef0cdd89f753d9839444a434b299John Reck proxy->fence(); 60928ad7b52e038ef0cdd89f753d9839444a434b299John Reck} 61028ad7b52e038ef0cdd89f753d9839444a434b299John Reck 611f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_stopDrawing(JNIEnv* env, jobject clazz, 612f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 613f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 614f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->stopDrawing(); 615f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 616f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 617a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz, 618a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck jlong proxyPtr) { 619a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 620a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck proxy->notifyFramePending(); 621a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck} 622a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 623e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckstatic void android_view_ThreadedRenderer_serializeDisplayListTree(JNIEnv* env, jobject clazz, 624e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck jlong proxyPtr) { 625e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 626e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck proxy->serializeDisplayListTree(); 627e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck} 628e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck 629fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz, 630ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck jlong proxyPtr, jobject javaFileDescriptor, jint dumpFlags) { 631fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 632fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 633ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck proxy->dumpProfileInfo(fd, dumpFlags); 634fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck} 635fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 636edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_dumpProfileData(JNIEnv* env, jobject clazz, 637edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck jbyteArray jdata, jobject javaFileDescriptor) { 638edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 639edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck ScopedByteArrayRO buffer(env, jdata); 640edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck if (buffer.get()) { 641edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck JankTracker::dumpBuffer(buffer.get(), buffer.size(), fd); 642edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck } 643edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck} 644edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 645ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_addRenderNode(JNIEnv* env, jobject clazz, 646ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr, jboolean placeFront) { 647ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 648ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 649ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->addRenderNode(renderNode, placeFront); 650ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 651ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 652ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_removeRenderNode(JNIEnv* env, jobject clazz, 653ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr) { 654ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 655ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 656ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->removeRenderNode(renderNode); 657ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 658ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 659ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRendererd_drawRenderNode(JNIEnv* env, jobject clazz, 660ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr) { 661ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 662ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 663ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->drawRenderNode(renderNode); 664ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 665ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 666b816087962aba0019b022303330f03b897b580edSkuhnestatic void android_view_ThreadedRenderer_setContentDrawBounds(JNIEnv* env, 667ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jobject clazz, jlong proxyPtr, jint left, jint top, jint right, jint bottom) { 668ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 669b816087962aba0019b022303330f03b897b580edSkuhne proxy->setContentDrawBounds(left, top, right, bottom); 670ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 671edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 67210dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reckstatic jboolean android_view_ThreadedRenderer_copySurfaceInto(JNIEnv* env, 67310dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck jobject clazz, jobject jsurface, jobject jbitmap) { 67410dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck SkBitmap bitmap; 67510dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap); 67610dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck sp<Surface> surface = android_view_Surface_getSurface(env, jsurface); 67710dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck return RenderProxy::copySurfaceInto(surface, &bitmap); 67810dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck} 67910dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck 680cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 681910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales// FrameMetricsObserver 68206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales// ---------------------------------------------------------------------------- 68306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 684910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesstatic jlong android_view_ThreadedRenderer_addFrameMetricsObserver(JNIEnv* env, 68506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jclass clazz, jlong proxyPtr, jobject fso) { 68606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JavaVM* vm = nullptr; 68706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales if (env->GetJavaVM(&vm) != JNI_OK) { 68806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL("Unable to get Java VM"); 68906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales return 0; 69006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 69106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 69206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderthread::RenderProxy* renderProxy = 69306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); 69406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 695910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales FrameMetricsObserver* observer = new ObserverProxy(vm, fso); 696910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales renderProxy->addFrameMetricsObserver(observer); 69706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales return reinterpret_cast<jlong>(observer); 69806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 69906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 700910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesstatic void android_view_ThreadedRenderer_removeFrameMetricsObserver(JNIEnv* env, jclass clazz, 70106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jlong proxyPtr, jlong observerPtr) { 702910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales FrameMetricsObserver* observer = reinterpret_cast<FrameMetricsObserver*>(observerPtr); 70306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderthread::RenderProxy* renderProxy = 70406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); 70506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 706910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales renderProxy->removeFrameMetricsObserver(observer); 70706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 70806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 70906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales// ---------------------------------------------------------------------------- 71084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// Shaders 71184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 71284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 71384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reckstatic void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz, 71484a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck jstring diskCachePath) { 71584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL); 71684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck egl_cache_t::get()->setCacheFilename(cacheArray); 71784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck env->ReleaseStringUTFChars(diskCachePath, cacheArray); 71884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck} 71984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 72084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 72103d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine// Layers 72203d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine// ---------------------------------------------------------------------------- 72303d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine 72403d8f76836c5950374bc9030a78706d25ac233e9Michael Lentinestatic void android_view_ThreadedRenderer_setupVulkanLayerPath(JNIEnv* env, jobject clazz, 72503d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine jstring layerPath) { 72603d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine 72703d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine const char* layerArray = env->GetStringUTFChars(layerPath, NULL); 72803d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine vulkan::LoaderData::GetInstance().layer_path = layerArray; 72903d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine env->ReleaseStringUTFChars(layerPath, layerArray); 73003d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine} 73103d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine 73203d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine// ---------------------------------------------------------------------------- 733cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue 734cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 735cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 736cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer"; 737cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 73876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 7393b20251a355c88193c439f928a84ae69483fb488John Reck { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas }, 740edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer }, 741e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, 742e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, 7434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, 744e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, 745b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName }, 7460bcd0cb6b1193168fa2840855195347488daab9eThomas Buhot { "nInitialize", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_initialize }, 7474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, 74801a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, 7498afcc76920499d0a384dba1470c5a377f80ed768John Reck { "nSetStopped", "(JZ)V", (void*) android_view_ThreadedRenderer_setStopped }, 75050210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup }, 75150210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette { "nSetLightCenter", "(JFFF)V", (void*) android_view_ThreadedRenderer_setLightCenter }, 75263a06673253914510bbeebd500655008682dade1John Reck { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, 75351f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck { "nSyncAndDrawFrame", "(J[JI)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, 754350e65206cfbd86484fcfda77bb988e270606ddaDoris Liu { "nDestroy", "(JJ)V", (void*) android_view_ThreadedRenderer_destroy }, 755119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode }, 7563b20251a355c88193c439f928a84ae69483fb488John Reck { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, 75719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, 7583e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer }, 7593731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck { "nCopyLayerInto", "(JJLandroid/graphics/Bitmap;)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, 760d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate }, 761d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate }, 762918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture }, 763f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nDestroyHardwareResources", "(J)V", (void*) android_view_ThreadedRenderer_destroyHardwareResources }, 764f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nTrimMemory", "(I)V", (void*) android_view_ThreadedRenderer_trimMemory }, 7652507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik { "nOverrideProperty", "(Ljava/lang/String;Ljava/lang/String;)V", (void*) android_view_ThreadedRenderer_overrideProperty }, 76628ad7b52e038ef0cdd89f753d9839444a434b299John Reck { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence }, 767f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing }, 768a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending }, 769e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck { "nSerializeDisplayListTree", "(J)V", (void*) android_view_ThreadedRenderer_serializeDisplayListTree }, 770ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck { "nDumpProfileInfo", "(JLjava/io/FileDescriptor;I)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo }, 771edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck { "nDumpProfileData", "([BLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileData }, 77284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck { "setupShadersDiskCache", "(Ljava/lang/String;)V", 77384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck (void*) android_view_ThreadedRenderer_setupShadersDiskCache }, 77403d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine { "setupVulkanLayerPath", "(Ljava/lang/String;)V", 77503d8f76836c5950374bc9030a78706d25ac233e9Michael Lentine (void*) android_view_ThreadedRenderer_setupVulkanLayerPath }, 776ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nAddRenderNode", "(JJZ)V", (void*) android_view_ThreadedRenderer_addRenderNode}, 777ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode}, 778ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode}, 779b816087962aba0019b022303330f03b897b580edSkuhne { "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds}, 780910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales { "nAddFrameMetricsObserver", 781910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales "(JLandroid/view/FrameMetricsObserver;)J", 782910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales (void*)android_view_ThreadedRenderer_addFrameMetricsObserver }, 783910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales { "nRemoveFrameMetricsObserver", 78406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "(JJ)V", 785910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales (void*)android_view_ThreadedRenderer_removeFrameMetricsObserver }, 78610dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck { "nCopySurfaceInto", "(Landroid/view/Surface;Landroid/graphics/Bitmap;)Z", 78710dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck (void*)android_view_ThreadedRenderer_copySurfaceInto }, 788cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 789cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 790cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) { 791910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jclass observerClass = FindClassOrDie(env, "android/view/FrameMetricsObserver"); 792910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales gFrameMetricsObserverClassInfo.frameMetrics = GetFieldIDOrDie( 793910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales env, observerClass, "mFrameMetrics", "Landroid/view/FrameMetrics;"); 794910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales gFrameMetricsObserverClassInfo.messageQueue = GetFieldIDOrDie( 795910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales env, observerClass, "mMessageQueue", "Landroid/os/MessageQueue;"); 796910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales gFrameMetricsObserverClassInfo.callback = GetMethodIDOrDie( 797910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales env, observerClass, "notifyDataAvailable", "(I)V"); 798910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 799910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales jclass metricsClass = FindClassOrDie(env, "android/view/FrameMetrics"); 800910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales gFrameMetricsObserverClassInfo.timingDataBuffer = GetFieldIDOrDie( 801910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales env, metricsClass, "mTimingData", "[J"); 80206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 803ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); 804cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 805cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 806cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android 807