android_view_ThreadedRenderer.cpp revision 06f5bc70a667a02b14e31d3f53f91d3661e30666
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> 20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 21cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include "jni.h" 22cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <nativehelper/JNIHelp.h> 23ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 243731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck#include <GraphicsJNI.h> 25edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <ScopedPrimitiveArray.h> 26cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 2784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl.h> 2884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/eglext.h> 2984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl_cache.h> 3084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 3106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include <utils/Looper.h> 3206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include <utils/RefBase.h> 334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h> 344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h> 354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h> 364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include "android_view_GraphicBuffer.h" 3806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include "android_os_MessageQueue.h" 3966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 4052244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h> 41119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <AnimationContext.h> 4206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales#include <FrameInfo.h> 43119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <IContextFactory.h> 44edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <JankTracker.h> 45e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h> 4666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include <renderthread/CanvasContext.h> 474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h> 48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h> 49cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h> 50797b95b26bbb7557678af78b9a2a61830158920fChris Craik#include <Vector.h> 51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android { 53cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer; 554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread; 56cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 5706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesstruct { 5806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jfieldID buffer; 5906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jfieldID messageQueue; 6006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jmethodID notifyData; 6106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} gFrameStatsObserverClassInfo; 6206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 63c25e506f7fc08790c0532f927f31310a2ca778b7John Reckstatic JNIEnv* getenv(JavaVM* vm) { 64c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env; 65c25e506f7fc08790c0532f927f31310a2ca778b7John Reck if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 66c25e506f7fc08790c0532f927f31310a2ca778b7John Reck LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm); 67c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 68c25e506f7fc08790c0532f927f31310a2ca778b7John Reck return env; 69c25e506f7fc08790c0532f927f31310a2ca778b7John Reck} 70c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 7152244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent { 7252244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 73ff941dcd815021bb20d6504eb486acb1e50592c3John Reck OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener) 7452244fff29042926e21fa897ef5ab11148e35299John Reck : animator(animator), listener(listener) {} 75ff941dcd815021bb20d6504eb486acb1e50592c3John Reck sp<BaseRenderNodeAnimator> animator; 7652244fff29042926e21fa897ef5ab11148e35299John Reck sp<AnimationListener> listener; 7752244fff29042926e21fa897ef5ab11148e35299John Reck}; 7852244fff29042926e21fa897ef5ab11148e35299John Reck 79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler { 80e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 8152244fff29042926e21fa897ef5ab11148e35299John Reck InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) { 8252244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.swap(events); 83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 8552244fff29042926e21fa897ef5ab11148e35299John Reck static void callOnFinished(OnFinishedEvent& event) { 8652244fff29042926e21fa897ef5ab11148e35299John Reck event.listener->onAnimationFinished(event.animator.get()); 87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void handleMessage(const Message& message) { 9052244fff29042926e21fa897ef5ab11148e35299John Reck std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished); 9152244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.clear(); 92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 93e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 94e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 9552244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 97e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 98c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass RenderingException : public MessageHandler { 99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 100c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RenderingException(JavaVM* vm, const std::string& message) 101c25e506f7fc08790c0532f927f31310a2ca778b7John Reck : mVm(vm) 102c25e506f7fc08790c0532f927f31310a2ca778b7John Reck , mMessage(message) { 103c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 104c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 105c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void handleMessage(const Message&) { 106c25e506f7fc08790c0532f927f31310a2ca778b7John Reck throwException(mVm, mMessage); 107c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 108c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 109c25e506f7fc08790c0532f927f31310a2ca778b7John Reck static void throwException(JavaVM* vm, const std::string& message) { 110c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env = getenv(vm); 111c25e506f7fc08790c0532f927f31310a2ca778b7John Reck jniThrowException(env, "java/lang/IllegalStateException", message.c_str()); 112c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 113c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 114c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprivate: 115c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JavaVM* mVm; 116c25e506f7fc08790c0532f927f31310a2ca778b7John Reck std::string mMessage; 117c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}; 118c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 119119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass RootRenderNode : public RenderNode, ErrorHandler { 120c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic: 121c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode(JNIEnv* env) : RenderNode() { 122e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mLooper = Looper::getForThread(); 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck LOG_ALWAYS_FATAL_IF(!mLooper.get(), 124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck "Must create RootRenderNode on a thread with a looper!"); 125c25e506f7fc08790c0532f927f31310a2ca778b7John Reck env->GetJavaVM(&mVm); 126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 127e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual ~RootRenderNode() {} 129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 130c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void onError(const std::string& message) { 131c25e506f7fc08790c0532f927f31310a2ca778b7John Reck mLooper->sendMessage(new RenderingException(mVm, message), 0); 132c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 133c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void prepareTree(TreeInfo& info) { 135c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = this; 136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderNode::prepareTree(info); 137c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = NULL; 138119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 139119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 140119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void sendMessage(const sp<MessageHandler>& handler) { 141119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mLooper->sendMessage(handler, 0); 142119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 143119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 144119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void attachAnimatingNode(RenderNode* animatingNode) { 145119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.push_back(animatingNode); 146119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 147119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 148119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void doAttachAnimatingNodes(AnimationContext* context) { 149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { 150119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* node = mPendingAnimatingRenderNodes[i].get(); 151119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck context->addAnimatingRenderNode(*node); 152119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 153119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.clear(); 154119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 155119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 156119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 157119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<Looper> mLooper; 158119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck JavaVM* mVm; 159119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes; 160119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 161119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 162119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass AnimationContextBridge : public AnimationContext { 163119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 164119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode) 165119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck : AnimationContext(clock), mRootNode(rootNode) { 166119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 167119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 168119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual ~AnimationContextBridge() {} 169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 170119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Marks the start of a frame, which will update the frame time and move all 171119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // next frame animations into the current frame 172ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck virtual void startFrame(TreeInfo::TraversalMode mode) { 173ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck if (mode == TreeInfo::MODE_FULL) { 174ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck mRootNode->doAttachAnimatingNodes(this); 175ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck } 176ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck AnimationContext::startFrame(mode); 177119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 178119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 179119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Runs any animations still left in mCurrentFrameAnimations 180119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void runRemainingAnimations(TreeInfo& info) { 181119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContext::runRemainingAnimations(info); 182e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 183e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 184e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 185119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { 186119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck OnFinishedEvent event(animator, listener); 187119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mOnFinishedEvents.push_back(event); 188119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 189119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 190e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck virtual void destroy() { 191e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck AnimationContext::destroy(); 192e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 193e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 194e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 195e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 196119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<RootRenderNode> mRootNode; 19752244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 198e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 199e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck void postOnFinishedEvents() { 200e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck if (mOnFinishedEvents.size()) { 201e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck sp<InvokeAnimationListeners> message 202e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck = new InvokeAnimationListeners(mOnFinishedEvents); 203e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck mRootNode->sendMessage(message); 204e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 205e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 206119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 207119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 208119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass ContextFactoryImpl : public IContextFactory { 209119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 210119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} 211119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 212119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) { 213119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return new AnimationContextBridge(clock, mRootNode); 214119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 215119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 216119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 217119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* mRootNode; 218e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 219e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 22006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesclass ObserverProxy; 22106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 22206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesclass NotifyHandler : public MessageHandler { 22306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralespublic: 22406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales NotifyHandler(JavaVM* vm) : mVm(vm) {} 22506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 22606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales void setObserver(ObserverProxy* observer) { 22706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mObserver = observer; 22806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 22906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 23006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales void setBuffer(BufferPool::Buffer* buffer) { 23106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mBuffer = buffer; 23206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 23306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 23406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales virtual void handleMessage(const Message& message); 23506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 23606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesprivate: 23706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JavaVM* mVm; 23806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 23906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales sp<ObserverProxy> mObserver; 24006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales BufferPool::Buffer* mBuffer; 24106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales}; 24206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 24306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesclass ObserverProxy : public FrameStatsObserver { 24406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralespublic: 24506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales ObserverProxy(JavaVM *vm, jobject fso) : mVm(vm) { 24606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JNIEnv* env = getenv(mVm); 24706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 24806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jlongArray longArrayLocal = env->NewLongArray(kBufferSize); 24906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL_IF(longArrayLocal == nullptr, 25006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "OOM: can't allocate frame stats buffer"); 25106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales env->SetObjectField(fso, gFrameStatsObserverClassInfo.buffer, longArrayLocal); 25206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 25306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mFsoWeak = env->NewWeakGlobalRef(fso); 25406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL_IF(mFsoWeak == nullptr, 25506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "unable to create frame stats observer reference"); 25606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 25706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jobject messageQueueLocal = 25806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales env->GetObjectField(fso, gFrameStatsObserverClassInfo.messageQueue); 25906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mMessageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueLocal); 26006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL_IF(mMessageQueue == nullptr, "message queue not available"); 26106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 26206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mMessageHandler = new NotifyHandler(mVm); 26306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL_IF(mMessageHandler == nullptr, 26406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "OOM: unable to allocate NotifyHandler"); 26506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 26606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 26706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales ~ObserverProxy() { 26806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JNIEnv* env = getenv(mVm); 26906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales env->DeleteWeakGlobalRef(mFsoWeak); 27006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 27106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 27206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jweak getJavaObjectRef() { 27306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales return mFsoWeak; 27406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 27506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 27606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales virtual void notify(BufferPool::Buffer* buffer) { 27706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales buffer->incRef(); 27806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mMessageHandler->setBuffer(buffer); 27906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mMessageHandler->setObserver(this); 28006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mMessageQueue->getLooper()->sendMessage(mMessageHandler, mMessage); 28106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 28206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 28306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesprivate: 28406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales static const int kBufferSize = static_cast<int>(FrameInfoIndex::NumIndexes); 28506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 28606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JavaVM* mVm; 28706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jweak mFsoWeak; 28806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 28906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales sp<MessageQueue> mMessageQueue; 29006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales sp<NotifyHandler> mMessageHandler; 29106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales Message mMessage; 29206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales}; 29306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 29406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesvoid NotifyHandler::handleMessage(const Message& message) { 29506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JNIEnv* env = getenv(mVm); 29606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 29706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jobject target = env->NewLocalRef(mObserver->getJavaObjectRef()); 29806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 29906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales if (target != nullptr) { 30006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jobject javaBuffer = env->GetObjectField(target, gFrameStatsObserverClassInfo.buffer); 30106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales if (javaBuffer != nullptr) { 30206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales env->SetLongArrayRegion(reinterpret_cast<jlongArray>(javaBuffer), 30306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 0, mBuffer->getSize(), mBuffer->getBuffer()); 30406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales env->CallVoidMethod(target, gFrameStatsObserverClassInfo.notifyData); 30506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales env->DeleteLocalRef(target); 30606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 30706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 30806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 30906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mBuffer->release(); 31006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales mObserver.clear(); 31106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 31206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 31366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz, 3143b20251a355c88193c439f928a84ae69483fb488John Reck jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) { 31566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer); 31666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck jsize len = env->GetArrayLength(atlasMapArray); 31766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (len <= 0) { 31866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck ALOGW("Failed to initialize atlas, invalid map length: %d", len); 31966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck return; 32066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 32166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck int64_t* map = new int64_t[len]; 32266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck env->GetLongArrayRegion(atlasMapArray, 0, len, map); 32366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 3243b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 3253b20251a355c88193c439f928a84ae69483fb488John Reck proxy->setTextureAtlas(buffer, map, len); 3264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 328edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, jobject clazz, 329edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck jlong proxyPtr, jint fd) { 330edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 331edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck proxy->setProcessStatsBuffer(fd); 332edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck} 333edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 334e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { 335c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode* node = new RootRenderNode(env); 336e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->incStrong(0); 337e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->setName("RootRenderNode"); 338e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return reinterpret_cast<jlong>(node); 339e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 340e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 3414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz, 342e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jboolean translucent, jlong rootRenderNodePtr) { 343119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr); 344119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl factory(rootRenderNode); 345119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return (jlong) new RenderProxy(translucent, rootRenderNode, &factory); 3464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz, 3494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 35019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 3514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck delete proxy; 3524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 354e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, 355e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck jlong proxyPtr) { 356e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 357e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck return proxy->loadSystemProperties(); 358e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck} 359e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck 360b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reckstatic void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz, 361b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck jlong proxyPtr, jstring jname) { 362b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 363b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck const char* name = env->GetStringUTFChars(jname, NULL); 364b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck proxy->setName(name); 365b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck env->ReleaseStringUTFChars(jname, name); 366b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck} 367b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck 3680bcd0cb6b1193168fa2840855195347488daab9eThomas Buhotstatic void android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, 3694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 37019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 3714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface); 3720bcd0cb6b1193168fa2840855195347488daab9eThomas Buhot proxy->initialize(window); 3734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, 3764f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 37719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 3784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window; 3794f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (jsurface) { 3804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 3814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 382f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck proxy->updateSurface(window); 383f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck} 384f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 38501a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reckstatic jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, 386f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck jlong proxyPtr, jobject jsurface) { 387f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 388f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck sp<ANativeWindow> window; 389f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (jsurface) { 390f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 391f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 39201a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck return proxy->pauseSurface(window); 3934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 395797b95b26bbb7557678af78b9a2a61830158920fChris Craikstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, 39650210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette jint width, jint height, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha) { 39719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 39850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setup(width, height, lightRadius, ambientShadowAlpha, spotShadowAlpha); 39950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette} 40050210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette 40150210d912925aef14e4ce69be82e4949122a3cd9Alan Viverettestatic void android_view_ThreadedRenderer_setLightCenter(JNIEnv* env, jobject clazz, 40250210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette jlong proxyPtr, jfloat lightX, jfloat lightY, jfloat lightZ) { 40350210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 40450210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setLightCenter((Vector3){lightX, lightY, lightZ}); 4054f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4064f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 40763a06673253914510bbeebd500655008682dade1John Reckstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, 40863a06673253914510bbeebd500655008682dade1John Reck jlong proxyPtr, jboolean opaque) { 40963a06673253914510bbeebd500655008682dade1John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 41063a06673253914510bbeebd500655008682dade1John Reck proxy->setOpaque(opaque); 41163a06673253914510bbeebd500655008682dade1John Reck} 41263a06673253914510bbeebd500655008682dade1John Reck 413f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, 414ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck jlong proxyPtr, jlongArray frameInfo, jint frameInfoSize) { 415ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck LOG_ALWAYS_FATAL_IF(frameInfoSize != UI_THREAD_FRAME_INFO_SIZE, 416ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck "Mismatched size expectations, given %d expected %d", 417ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck frameInfoSize, UI_THREAD_FRAME_INFO_SIZE); 41819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 419ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck env->GetLongArrayRegion(frameInfo, 0, frameInfoSize, proxy->frameInfo()); 420ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck return proxy->syncAndDrawFrame(); 4214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 42317035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckstatic void android_view_ThreadedRenderer_destroy(JNIEnv* env, jobject clazz, 4244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 42519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 42617035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck proxy->destroy(); 4274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 4284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 429119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_ThreadedRenderer_registerAnimatingRenderNode(JNIEnv* env, jobject clazz, 430119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong rootNodePtr, jlong animatingNodePtr) { 431119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr); 432119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* animatingNode = reinterpret_cast<RenderNode*>(animatingNodePtr); 433119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck rootRenderNode->attachAnimatingNode(animatingNode); 434119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck} 435119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 4360d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz, 4373b20251a355c88193c439f928a84ae69483fb488John Reck jlong functorPtr, jboolean waitForCompletion) { 4380d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck Functor* functor = reinterpret_cast<Functor*>(functorPtr); 4393b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy::invokeFunctor(functor, waitForCompletion); 4400d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck} 4410d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 44219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz, 44319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr) { 44419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 44519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createTextureLayer(); 44619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 44719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 44819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 4493e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reckstatic void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz, 4503e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck jlong proxyPtr, jlong nodePtr) { 4513e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 4523e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr); 4533e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck proxy->buildLayer(node); 4543e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck} 4553e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 45619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz, 4573731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck jlong proxyPtr, jlong layerPtr, jobject jbitmap) { 45819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 45919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 4603731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck SkBitmap bitmap; 4613731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap); 46219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return proxy->copyLayerInto(layer, bitmap); 46319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 46419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 465d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_pushLayerUpdate(JNIEnv* env, jobject clazz, 46619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr) { 46719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 46819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 469d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->pushLayerUpdate(layer); 470d72e0a339b54af0c4e731513bbad120dff694723John Reck} 471d72e0a339b54af0c4e731513bbad120dff694723John Reck 472d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_cancelLayerUpdate(JNIEnv* env, jobject clazz, 473d72e0a339b54af0c4e731513bbad120dff694723John Reck jlong proxyPtr, jlong layerPtr) { 474d72e0a339b54af0c4e731513bbad120dff694723John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 475d72e0a339b54af0c4e731513bbad120dff694723John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 476d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->cancelLayerUpdate(layer); 47719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 47819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 479918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reckstatic void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz, 480918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck jlong proxyPtr, jlong layerPtr) { 481918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 482918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 483918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck proxy->detachSurfaceTexture(layer); 484918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck} 485918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck 486f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_destroyHardwareResources(JNIEnv* env, jobject clazz, 487f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 488e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 489f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->destroyHardwareResources(); 490f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 491f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 492f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_trimMemory(JNIEnv* env, jobject clazz, 493f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jint level) { 494f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy::trimMemory(level); 495e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck} 496e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 4972507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craikstatic void android_view_ThreadedRenderer_overrideProperty(JNIEnv* env, jobject clazz, 4982507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik jstring name, jstring value) { 4992507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik const char* nameCharArray = env->GetStringUTFChars(name, NULL); 5002507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik const char* valueCharArray = env->GetStringUTFChars(value, NULL); 5012507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik RenderProxy::overrideProperty(nameCharArray, valueCharArray); 5022507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik env->ReleaseStringUTFChars(name, nameCharArray); 5032507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik env->ReleaseStringUTFChars(name, valueCharArray); 5042507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik} 5052507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik 50628ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz, 50728ad7b52e038ef0cdd89f753d9839444a434b299John Reck jlong proxyPtr) { 50828ad7b52e038ef0cdd89f753d9839444a434b299John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 50928ad7b52e038ef0cdd89f753d9839444a434b299John Reck proxy->fence(); 51028ad7b52e038ef0cdd89f753d9839444a434b299John Reck} 51128ad7b52e038ef0cdd89f753d9839444a434b299John Reck 512f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_stopDrawing(JNIEnv* env, jobject clazz, 513f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 514f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 515f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->stopDrawing(); 516f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 517f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 518a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz, 519a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck jlong proxyPtr) { 520a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 521a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck proxy->notifyFramePending(); 522a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck} 523a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 524e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckstatic void android_view_ThreadedRenderer_serializeDisplayListTree(JNIEnv* env, jobject clazz, 525e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck jlong proxyPtr) { 526e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 527e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck proxy->serializeDisplayListTree(); 528e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck} 529e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck 530fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz, 531ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck jlong proxyPtr, jobject javaFileDescriptor, jint dumpFlags) { 532fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 533fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 534ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck proxy->dumpProfileInfo(fd, dumpFlags); 535fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck} 536fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 537edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_dumpProfileData(JNIEnv* env, jobject clazz, 538edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck jbyteArray jdata, jobject javaFileDescriptor) { 539edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 540edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck ScopedByteArrayRO buffer(env, jdata); 541edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck if (buffer.get()) { 542edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck JankTracker::dumpBuffer(buffer.get(), buffer.size(), fd); 543edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck } 544edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck} 545edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 546ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_addRenderNode(JNIEnv* env, jobject clazz, 547ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr, jboolean placeFront) { 548ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 549ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 550ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->addRenderNode(renderNode, placeFront); 551ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 552ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 553ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_removeRenderNode(JNIEnv* env, jobject clazz, 554ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr) { 555ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 556ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 557ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->removeRenderNode(renderNode); 558ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 559ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 560ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRendererd_drawRenderNode(JNIEnv* env, jobject clazz, 561ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr) { 562ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 563ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 564ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->drawRenderNode(renderNode); 565ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 566ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 567b816087962aba0019b022303330f03b897b580edSkuhnestatic void android_view_ThreadedRenderer_setContentDrawBounds(JNIEnv* env, 568ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jobject clazz, jlong proxyPtr, jint left, jint top, jint right, jint bottom) { 569ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 570b816087962aba0019b022303330f03b897b580edSkuhne proxy->setContentDrawBounds(left, top, right, bottom); 571ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 572edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 573cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 57406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales// FrameStatsObserver 57506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales// ---------------------------------------------------------------------------- 57606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 57706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesstatic jlong android_view_ThreadedRenderer_addFrameStatsObserver(JNIEnv* env, 57806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jclass clazz, jlong proxyPtr, jobject fso) { 57906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales JavaVM* vm = nullptr; 58006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales if (env->GetJavaVM(&vm) != JNI_OK) { 58106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales LOG_ALWAYS_FATAL("Unable to get Java VM"); 58206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales return 0; 58306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales } 58406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 58506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderthread::RenderProxy* renderProxy = 58606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); 58706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 58806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales FrameStatsObserver* observer = new ObserverProxy(vm, fso); 58906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderProxy->addFrameStatsObserver(observer); 59006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales return reinterpret_cast<jlong>(observer); 59106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 59206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 59306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesstatic void android_view_ThreadedRenderer_removeFrameStatsObserver(JNIEnv* env, jclass clazz, 59406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jlong proxyPtr, jlong observerPtr) { 59506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales FrameStatsObserver* observer = reinterpret_cast<FrameStatsObserver*>(observerPtr); 59606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderthread::RenderProxy* renderProxy = 59706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); 59806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 59906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderProxy->removeFrameStatsObserver(observer); 60006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 60106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 60206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Moralesstatic jint android_view_ThreadedRenderer_getDroppedFrameReportCount(JNIEnv* env, jclass clazz, 60306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jlong proxyPtr) { 60406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales renderthread::RenderProxy* renderProxy = 60506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales reinterpret_cast<renderthread::RenderProxy*>(proxyPtr); 60606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales return renderProxy->getDroppedFrameReportCount(); 60706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales} 60806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 60906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales// ---------------------------------------------------------------------------- 61084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// Shaders 61184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 61284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 61384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reckstatic void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz, 61484a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck jstring diskCachePath) { 61584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL); 61684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck egl_cache_t::get()->setCacheFilename(cacheArray); 61784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck env->ReleaseStringUTFChars(diskCachePath, cacheArray); 61884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck} 61984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 62084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 621cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue 622cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 623cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 624cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer"; 625cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 62676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 6273b20251a355c88193c439f928a84ae69483fb488John Reck { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas }, 628edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer }, 629e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, 630e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, 6314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, 632e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, 633b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName }, 6340bcd0cb6b1193168fa2840855195347488daab9eThomas Buhot { "nInitialize", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_initialize }, 6354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, 63601a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, 63750210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup }, 63850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette { "nSetLightCenter", "(JFFF)V", (void*) android_view_ThreadedRenderer_setLightCenter }, 63963a06673253914510bbeebd500655008682dade1John Reck { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, 640ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck { "nSyncAndDrawFrame", "(J[JI)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, 64117035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy }, 642119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode }, 6433b20251a355c88193c439f928a84ae69483fb488John Reck { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, 64419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, 6453e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer }, 6463731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck { "nCopyLayerInto", "(JJLandroid/graphics/Bitmap;)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, 647d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate }, 648d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate }, 649918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture }, 650f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nDestroyHardwareResources", "(J)V", (void*) android_view_ThreadedRenderer_destroyHardwareResources }, 651f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nTrimMemory", "(I)V", (void*) android_view_ThreadedRenderer_trimMemory }, 6522507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik { "nOverrideProperty", "(Ljava/lang/String;Ljava/lang/String;)V", (void*) android_view_ThreadedRenderer_overrideProperty }, 65328ad7b52e038ef0cdd89f753d9839444a434b299John Reck { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence }, 654f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing }, 655a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending }, 656e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck { "nSerializeDisplayListTree", "(J)V", (void*) android_view_ThreadedRenderer_serializeDisplayListTree }, 657ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck { "nDumpProfileInfo", "(JLjava/io/FileDescriptor;I)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo }, 658edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck { "nDumpProfileData", "([BLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileData }, 65984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck { "setupShadersDiskCache", "(Ljava/lang/String;)V", 66084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck (void*) android_view_ThreadedRenderer_setupShadersDiskCache }, 661ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nAddRenderNode", "(JJZ)V", (void*) android_view_ThreadedRenderer_addRenderNode}, 662ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode}, 663ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode}, 664b816087962aba0019b022303330f03b897b580edSkuhne { "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds}, 66506f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales { "nAddFrameStatsObserver", 66606f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "(JLandroid/view/FrameStatsObserver;)J", 66706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales (void*)android_view_ThreadedRenderer_addFrameStatsObserver }, 66806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales { "nRemoveFrameStatsObserver", 66906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "(JJ)V", 67006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales (void*)android_view_ThreadedRenderer_removeFrameStatsObserver }, 67106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales { "nGetDroppedFrameReportCount", 67206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales "(J)J", 67306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales (void*)android_view_ThreadedRenderer_getDroppedFrameReportCount }, 674cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 675cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 676cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) { 67706f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales jclass clazz = FindClassOrDie(env, "android/view/FrameStatsObserver"); 67806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales gFrameStatsObserverClassInfo.messageQueue = 67906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales GetFieldIDOrDie(env, clazz, "mMessageQueue", "Landroid/os/MessageQueue;"); 68006f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales gFrameStatsObserverClassInfo.buffer = 68106f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales GetFieldIDOrDie(env, clazz, "mBuffer", "[J"); 68206f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales gFrameStatsObserverClassInfo.notifyData = 68306f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales GetMethodIDOrDie(env, clazz, "notifyDataAvailable", "()V"); 68406f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales 685ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); 686cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 687cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 688cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android 689