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