android_view_ThreadedRenderer.cpp revision b816087962aba0019b022303330f03b897b580ed
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
314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h>
324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h>
334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h>
344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include "android_view_GraphicBuffer.h"
3666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck
3752244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h>
38119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <AnimationContext.h>
39119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <IContextFactory.h>
40edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <JankTracker.h>
41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h>
4266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include <renderthread/CanvasContext.h>
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h>
44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h>
45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h>
46797b95b26bbb7557678af78b9a2a61830158920fChris Craik#include <Vector.h>
47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android {
49cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer;
514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread;
52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
53c25e506f7fc08790c0532f927f31310a2ca778b7John Reckstatic JNIEnv* getenv(JavaVM* vm) {
54c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    JNIEnv* env;
55c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
56c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm);
57c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
58c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    return env;
59c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}
60c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
6152244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent {
6252244fff29042926e21fa897ef5ab11148e35299John Reckpublic:
63ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener)
6452244fff29042926e21fa897ef5ab11148e35299John Reck            : animator(animator), listener(listener) {}
65ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    sp<BaseRenderNodeAnimator> animator;
6652244fff29042926e21fa897ef5ab11148e35299John Reck    sp<AnimationListener> listener;
6752244fff29042926e21fa897ef5ab11148e35299John Reck};
6852244fff29042926e21fa897ef5ab11148e35299John Reck
69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler {
70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
7152244fff29042926e21fa897ef5ab11148e35299John Reck    InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) {
7252244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.swap(events);
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
7552244fff29042926e21fa897ef5ab11148e35299John Reck    static void callOnFinished(OnFinishedEvent& event) {
7652244fff29042926e21fa897ef5ab11148e35299John Reck        event.listener->onAnimationFinished(event.animator.get());
77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void handleMessage(const Message& message) {
8052244fff29042926e21fa897ef5ab11148e35299John Reck        std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished);
8152244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.clear();
82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
8552244fff29042926e21fa897ef5ab11148e35299John Reck    std::vector<OnFinishedEvent> mOnFinishedEvents;
86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
88c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass RenderingException : public MessageHandler {
89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
90c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    RenderingException(JavaVM* vm, const std::string& message)
91c25e506f7fc08790c0532f927f31310a2ca778b7John Reck            : mVm(vm)
92c25e506f7fc08790c0532f927f31310a2ca778b7John Reck            , mMessage(message) {
93c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
94c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
95c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    virtual void handleMessage(const Message&) {
96c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        throwException(mVm, mMessage);
97c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
98c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
99c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    static void throwException(JavaVM* vm, const std::string& message) {
100c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        JNIEnv* env = getenv(vm);
101c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        jniThrowException(env, "java/lang/IllegalStateException", message.c_str());
102c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
103c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
104c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprivate:
105c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    JavaVM* mVm;
106c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    std::string mMessage;
107c25e506f7fc08790c0532f927f31310a2ca778b7John Reck};
108c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
109119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass RootRenderNode : public RenderNode, ErrorHandler {
110c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic:
111c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    RootRenderNode(JNIEnv* env) : RenderNode() {
112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mLooper = Looper::getForThread();
113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        LOG_ALWAYS_FATAL_IF(!mLooper.get(),
114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck                "Must create RootRenderNode on a thread with a looper!");
115c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        env->GetJavaVM(&mVm);
116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual ~RootRenderNode() {}
119e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
120c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    virtual void onError(const std::string& message) {
121c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        mLooper->sendMessage(new RenderingException(mVm, message), 0);
122c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
123c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void prepareTree(TreeInfo& info) {
125c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        info.errorHandler = this;
126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        RenderNode::prepareTree(info);
127c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        info.errorHandler = NULL;
128119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
129119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
130119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void sendMessage(const sp<MessageHandler>& handler) {
131119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mLooper->sendMessage(handler, 0);
132119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
133119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
134119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void attachAnimatingNode(RenderNode* animatingNode) {
135119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mPendingAnimatingRenderNodes.push_back(animatingNode);
136119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
137119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
138119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void doAttachAnimatingNodes(AnimationContext* context) {
139119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) {
140119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            RenderNode* node = mPendingAnimatingRenderNodes[i].get();
141119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            context->addAnimatingRenderNode(*node);
142119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        }
143119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mPendingAnimatingRenderNodes.clear();
144119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
145119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
146119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate:
147119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    sp<Looper> mLooper;
148119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    JavaVM* mVm;
149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes;
150119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck};
151119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
152119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass AnimationContextBridge : public AnimationContext {
153119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic:
154119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode)
155119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            : AnimationContext(clock), mRootNode(rootNode) {
156119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
157119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
158119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual ~AnimationContextBridge() {}
159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
160119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // Marks the start of a frame, which will update the frame time and move all
161119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // next frame animations into the current frame
162ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck    virtual void startFrame(TreeInfo::TraversalMode mode) {
163ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck        if (mode == TreeInfo::MODE_FULL) {
164ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck            mRootNode->doAttachAnimatingNodes(this);
165ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck        }
166ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck        AnimationContext::startFrame(mode);
167119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
168119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
169119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // Runs any animations still left in mCurrentFrameAnimations
170119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual void runRemainingAnimations(TreeInfo& info) {
171119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        AnimationContext::runRemainingAnimations(info);
172e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck        postOnFinishedEvents();
173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
175119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) {
176119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        OnFinishedEvent event(animator, listener);
177119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mOnFinishedEvents.push_back(event);
178119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
179119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
180e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck    virtual void destroy() {
181e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck        AnimationContext::destroy();
182e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck        postOnFinishedEvents();
183e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck    }
184e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck
185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
186119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    sp<RootRenderNode> mRootNode;
18752244fff29042926e21fa897ef5ab11148e35299John Reck    std::vector<OnFinishedEvent> mOnFinishedEvents;
188e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck
189e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck    void postOnFinishedEvents() {
190e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck        if (mOnFinishedEvents.size()) {
191e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck            sp<InvokeAnimationListeners> message
192e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck                    = new InvokeAnimationListeners(mOnFinishedEvents);
193e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck            mRootNode->sendMessage(message);
194e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck        }
195e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck    }
196119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck};
197119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
198119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass ContextFactoryImpl : public IContextFactory {
199119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic:
200119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {}
201119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
202119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) {
203119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        return new AnimationContextBridge(clock, mRootNode);
204119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
205119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
206119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate:
207119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RootRenderNode* mRootNode;
208e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
209e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
21066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz,
2113b20251a355c88193c439f928a84ae69483fb488John Reck        jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) {
21266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
21366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    jsize len = env->GetArrayLength(atlasMapArray);
21466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    if (len <= 0) {
21566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck        ALOGW("Failed to initialize atlas, invalid map length: %d", len);
21666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck        return;
21766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    }
21866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    int64_t* map = new int64_t[len];
21966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    env->GetLongArrayRegion(atlasMapArray, 0, len, map);
22066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck
2213b20251a355c88193c439f928a84ae69483fb488John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2223b20251a355c88193c439f928a84ae69483fb488John Reck    proxy->setTextureAtlas(buffer, map, len);
2234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
225edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, jobject clazz,
226edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck        jlong proxyPtr, jint fd) {
227edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
228edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    proxy->setProcessStatsBuffer(fd);
229edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck}
230edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
231e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) {
232c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    RootRenderNode* node = new RootRenderNode(env);
233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    node->incStrong(0);
234e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    node->setName("RootRenderNode");
235e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return reinterpret_cast<jlong>(node);
236e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
237e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
2384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz,
239e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        jboolean translucent, jlong rootRenderNodePtr) {
240119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr);
241119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    ContextFactoryImpl factory(rootRenderNode);
242119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    return (jlong) new RenderProxy(translucent, rootRenderNode, &factory);
2434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
2454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
2464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
24719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    delete proxy;
2494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
251e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz,
252e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck        jlong proxyPtr) {
253e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
254e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    return proxy->loadSystemProperties();
255e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck}
256e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck
257b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reckstatic void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz,
258b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck        jlong proxyPtr, jstring jname) {
259b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
260b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    const char* name = env->GetStringUTFChars(jname, NULL);
261b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    proxy->setName(name);
262b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    env->ReleaseStringUTFChars(jname, name);
263b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck}
264b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck
2654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz,
2664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
26719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface);
269f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    return proxy->initialize(window);
2704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
2724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz,
2734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
27419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window;
2764f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    if (jsurface) {
2774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
2784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    }
279f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    proxy->updateSurface(window);
280f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck}
281f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck
28201a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reckstatic jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz,
283f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck        jlong proxyPtr, jobject jsurface) {
284f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
285f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    sp<ANativeWindow> window;
286f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    if (jsurface) {
287f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
288f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    }
28901a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck    return proxy->pauseSurface(window);
2904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
292797b95b26bbb7557678af78b9a2a61830158920fChris Craikstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr,
29350210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette        jint width, jint height, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha) {
29419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
29550210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    proxy->setup(width, height, lightRadius, ambientShadowAlpha, spotShadowAlpha);
29650210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette}
29750210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette
29850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverettestatic void android_view_ThreadedRenderer_setLightCenter(JNIEnv* env, jobject clazz,
29950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette        jlong proxyPtr, jfloat lightX, jfloat lightY, jfloat lightZ) {
30050210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
30150210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    proxy->setLightCenter((Vector3){lightX, lightY, lightZ});
3024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
3034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
30463a06673253914510bbeebd500655008682dade1John Reckstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz,
30563a06673253914510bbeebd500655008682dade1John Reck        jlong proxyPtr, jboolean opaque) {
30663a06673253914510bbeebd500655008682dade1John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
30763a06673253914510bbeebd500655008682dade1John Reck    proxy->setOpaque(opaque);
30863a06673253914510bbeebd500655008682dade1John Reck}
30963a06673253914510bbeebd500655008682dade1John Reck
310f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz,
311ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck        jlong proxyPtr, jlongArray frameInfo, jint frameInfoSize) {
312ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    LOG_ALWAYS_FATAL_IF(frameInfoSize != UI_THREAD_FRAME_INFO_SIZE,
313ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck            "Mismatched size expectations, given %d expected %d",
314ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck            frameInfoSize, UI_THREAD_FRAME_INFO_SIZE);
31519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
316ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    env->GetLongArrayRegion(frameInfo, 0, frameInfoSize, proxy->frameInfo());
317ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    return proxy->syncAndDrawFrame();
3184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
3194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
32017035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckstatic void android_view_ThreadedRenderer_destroy(JNIEnv* env, jobject clazz,
3214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
32219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
32317035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck    proxy->destroy();
3244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
3254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
326119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_ThreadedRenderer_registerAnimatingRenderNode(JNIEnv* env, jobject clazz,
327119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong rootNodePtr, jlong animatingNodePtr) {
328119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr);
329119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RenderNode* animatingNode = reinterpret_cast<RenderNode*>(animatingNodePtr);
330119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    rootRenderNode->attachAnimatingNode(animatingNode);
331119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}
332119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
3330d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
3343b20251a355c88193c439f928a84ae69483fb488John Reck        jlong functorPtr, jboolean waitForCompletion) {
3350d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
3363b20251a355c88193c439f928a84ae69483fb488John Reck    RenderProxy::invokeFunctor(functor, waitForCompletion);
3370d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck}
3380d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck
33919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
34019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr) {
34119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
34219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createTextureLayer();
34319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
34419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
34519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
3463e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reckstatic void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz,
3473e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck        jlong proxyPtr, jlong nodePtr) {
3483e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
3493e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr);
3503e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    proxy->buildLayer(node);
3513e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck}
3523e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck
35319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
3543731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck        jlong proxyPtr, jlong layerPtr, jobject jbitmap) {
35519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
35619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
3573731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck    SkBitmap bitmap;
3583731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck    GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
35919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return proxy->copyLayerInto(layer, bitmap);
36019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
36119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
362d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_pushLayerUpdate(JNIEnv* env, jobject clazz,
36319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr) {
36419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
36519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
366d72e0a339b54af0c4e731513bbad120dff694723John Reck    proxy->pushLayerUpdate(layer);
367d72e0a339b54af0c4e731513bbad120dff694723John Reck}
368d72e0a339b54af0c4e731513bbad120dff694723John Reck
369d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_cancelLayerUpdate(JNIEnv* env, jobject clazz,
370d72e0a339b54af0c4e731513bbad120dff694723John Reck        jlong proxyPtr, jlong layerPtr) {
371d72e0a339b54af0c4e731513bbad120dff694723John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
372d72e0a339b54af0c4e731513bbad120dff694723John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
373d72e0a339b54af0c4e731513bbad120dff694723John Reck    proxy->cancelLayerUpdate(layer);
37419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
37519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
376918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reckstatic void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz,
377918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck        jlong proxyPtr, jlong layerPtr) {
378918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
379918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
380918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    proxy->detachSurfaceTexture(layer);
381918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck}
382918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck
383f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_destroyHardwareResources(JNIEnv* env, jobject clazz,
384f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck        jlong proxyPtr) {
385e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
386f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    proxy->destroyHardwareResources();
387f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck}
388f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck
389f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_trimMemory(JNIEnv* env, jobject clazz,
390f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck        jint level) {
391f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    RenderProxy::trimMemory(level);
392e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck}
393e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck
3942507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craikstatic void android_view_ThreadedRenderer_overrideProperty(JNIEnv* env, jobject clazz,
3952507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik        jstring name, jstring value) {
3962507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    const char* nameCharArray = env->GetStringUTFChars(name, NULL);
3972507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    const char* valueCharArray = env->GetStringUTFChars(value, NULL);
3982507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    RenderProxy::overrideProperty(nameCharArray, valueCharArray);
3992507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    env->ReleaseStringUTFChars(name, nameCharArray);
4002507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    env->ReleaseStringUTFChars(name, valueCharArray);
4012507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik}
4022507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik
40328ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz,
40428ad7b52e038ef0cdd89f753d9839444a434b299John Reck        jlong proxyPtr) {
40528ad7b52e038ef0cdd89f753d9839444a434b299John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
40628ad7b52e038ef0cdd89f753d9839444a434b299John Reck    proxy->fence();
40728ad7b52e038ef0cdd89f753d9839444a434b299John Reck}
40828ad7b52e038ef0cdd89f753d9839444a434b299John Reck
409f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_stopDrawing(JNIEnv* env, jobject clazz,
410f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck        jlong proxyPtr) {
411f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
412f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    proxy->stopDrawing();
413f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck}
414f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck
415a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz,
416a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        jlong proxyPtr) {
417a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
418a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    proxy->notifyFramePending();
419a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck}
420a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck
421e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckstatic void android_view_ThreadedRenderer_serializeDisplayListTree(JNIEnv* env, jobject clazz,
422e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck        jlong proxyPtr) {
423e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
424e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck    proxy->serializeDisplayListTree();
425e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck}
426e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck
427fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz,
428ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck        jlong proxyPtr, jobject javaFileDescriptor, jint dumpFlags) {
429fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
430fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
431ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    proxy->dumpProfileInfo(fd, dumpFlags);
432fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck}
433fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck
434edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_dumpProfileData(JNIEnv* env, jobject clazz,
435edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck        jbyteArray jdata, jobject javaFileDescriptor) {
436edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
437edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    ScopedByteArrayRO buffer(env, jdata);
438edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    if (buffer.get()) {
439edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck        JankTracker::dumpBuffer(buffer.get(), buffer.size(), fd);
440edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    }
441edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck}
442edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
443ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_addRenderNode(JNIEnv* env, jobject clazz,
444ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne        jlong proxyPtr, jlong renderNodePtr, jboolean placeFront) {
445ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
446ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
447ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    proxy->addRenderNode(renderNode, placeFront);
448ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne}
449ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne
450ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_removeRenderNode(JNIEnv* env, jobject clazz,
451ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne        jlong proxyPtr, jlong renderNodePtr) {
452ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
453ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
454ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    proxy->removeRenderNode(renderNode);
455ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne}
456ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne
457ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRendererd_drawRenderNode(JNIEnv* env, jobject clazz,
458ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne        jlong proxyPtr, jlong renderNodePtr) {
459ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
460ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
461ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    proxy->drawRenderNode(renderNode);
462ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne}
463ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne
464b816087962aba0019b022303330f03b897b580edSkuhnestatic void android_view_ThreadedRenderer_setContentDrawBounds(JNIEnv* env,
465ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne        jobject clazz, jlong proxyPtr, jint left, jint top, jint right, jint bottom) {
466ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
467b816087962aba0019b022303330f03b897b580edSkuhne    proxy->setContentDrawBounds(left, top, right, bottom);
468ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne}
469edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
470cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
47184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// Shaders
47284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ----------------------------------------------------------------------------
47384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck
47484a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reckstatic void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
47584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck        jstring diskCachePath) {
47684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
47784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    egl_cache_t::get()->setCacheFilename(cacheArray);
47884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    env->ReleaseStringUTFChars(diskCachePath, cacheArray);
47984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck}
48084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck
48184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ----------------------------------------------------------------------------
482cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue
483cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
484cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
485cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer";
486cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
48776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
4883b20251a355c88193c439f928a84ae69483fb488John Reck    { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V",   (void*) android_view_ThreadedRenderer_setAtlas },
489edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer },
490e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
491e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy },
4924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy },
493e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties },
494b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName },
4954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize },
4964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface },
49701a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck    { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface },
49850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup },
49950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    { "nSetLightCenter", "(JFFF)V", (void*) android_view_ThreadedRenderer_setLightCenter },
50063a06673253914510bbeebd500655008682dade1John Reck    { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque },
501ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    { "nSyncAndDrawFrame", "(J[JI)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame },
50217035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck    { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy },
503119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode },
5043b20251a355c88193c439f928a84ae69483fb488John Reck    { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
50519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
5063e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
5073731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck    { "nCopyLayerInto", "(JJLandroid/graphics/Bitmap;)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
508d72e0a339b54af0c4e731513bbad120dff694723John Reck    { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate },
509d72e0a339b54af0c4e731513bbad120dff694723John Reck    { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate },
510918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture },
511f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    { "nDestroyHardwareResources", "(J)V", (void*) android_view_ThreadedRenderer_destroyHardwareResources },
512f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    { "nTrimMemory", "(I)V", (void*) android_view_ThreadedRenderer_trimMemory },
5132507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    { "nOverrideProperty", "(Ljava/lang/String;Ljava/lang/String;)V",  (void*) android_view_ThreadedRenderer_overrideProperty },
51428ad7b52e038ef0cdd89f753d9839444a434b299John Reck    { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
515f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    { "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing },
516a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
517e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck    { "nSerializeDisplayListTree", "(J)V", (void*) android_view_ThreadedRenderer_serializeDisplayListTree },
518ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    { "nDumpProfileInfo", "(JLjava/io/FileDescriptor;I)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo },
519edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    { "nDumpProfileData", "([BLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileData },
52084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    { "setupShadersDiskCache", "(Ljava/lang/String;)V",
52184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck                (void*) android_view_ThreadedRenderer_setupShadersDiskCache },
522ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    { "nAddRenderNode", "(JJZ)V", (void*) android_view_ThreadedRenderer_addRenderNode},
523ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    { "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode},
524ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    { "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode},
525b816087962aba0019b022303330f03b897b580edSkuhne    { "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds},
526cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
527cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
528cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) {
529ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
530cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}
531cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
532cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android
533