android_view_ThreadedRenderer.cpp revision 119907cd2575c56b1ebf66348b52e67aaf6a88d8
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>
23cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <android_runtime/AndroidRuntime.h>
24cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
2584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl.h>
2684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/eglext.h>
2784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl_cache.h>
2884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck
294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h>
304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h>
314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h>
324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include "android_view_GraphicBuffer.h"
3466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck
3552244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h>
36119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <AnimationContext.h>
37119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <IContextFactory.h>
38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h>
3966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include <renderthread/CanvasContext.h>
404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h>
41cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h>
42cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h>
43797b95b26bbb7557678af78b9a2a61830158920fChris Craik#include <Vector.h>
44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android {
46cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer;
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread;
51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
52c25e506f7fc08790c0532f927f31310a2ca778b7John Reckstatic JNIEnv* getenv(JavaVM* vm) {
53c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    JNIEnv* env;
54c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
55c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm);
56c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
57c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    return env;
58c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}
59c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
6052244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent {
6152244fff29042926e21fa897ef5ab11148e35299John Reckpublic:
62ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener)
6352244fff29042926e21fa897ef5ab11148e35299John Reck            : animator(animator), listener(listener) {}
64ff941dcd815021bb20d6504eb486acb1e50592c3John Reck    sp<BaseRenderNodeAnimator> animator;
6552244fff29042926e21fa897ef5ab11148e35299John Reck    sp<AnimationListener> listener;
6652244fff29042926e21fa897ef5ab11148e35299John Reck};
6752244fff29042926e21fa897ef5ab11148e35299John Reck
68e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler {
69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
7052244fff29042926e21fa897ef5ab11148e35299John Reck    InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) {
7152244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.swap(events);
72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
7452244fff29042926e21fa897ef5ab11148e35299John Reck    static void callOnFinished(OnFinishedEvent& event) {
7552244fff29042926e21fa897ef5ab11148e35299John Reck        event.listener->onAnimationFinished(event.animator.get());
76e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void handleMessage(const Message& message) {
7952244fff29042926e21fa897ef5ab11148e35299John Reck        std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished);
8052244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.clear();
81e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
8452244fff29042926e21fa897ef5ab11148e35299John Reck    std::vector<OnFinishedEvent> mOnFinishedEvents;
85e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
87c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass RenderingException : public MessageHandler {
88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
89c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    RenderingException(JavaVM* vm, const std::string& message)
90c25e506f7fc08790c0532f927f31310a2ca778b7John Reck            : mVm(vm)
91c25e506f7fc08790c0532f927f31310a2ca778b7John Reck            , mMessage(message) {
92c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
93c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
94c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    virtual void handleMessage(const Message&) {
95c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        throwException(mVm, mMessage);
96c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
97c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
98c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    static void throwException(JavaVM* vm, const std::string& message) {
99c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        JNIEnv* env = getenv(vm);
100c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        jniThrowException(env, "java/lang/IllegalStateException", message.c_str());
101c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
102c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
103c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprivate:
104c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    JavaVM* mVm;
105c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    std::string mMessage;
106c25e506f7fc08790c0532f927f31310a2ca778b7John Reck};
107c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
108119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass RootRenderNode : public RenderNode, ErrorHandler {
109c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic:
110c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    RootRenderNode(JNIEnv* env) : RenderNode() {
111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mLooper = Looper::getForThread();
112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        LOG_ALWAYS_FATAL_IF(!mLooper.get(),
113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck                "Must create RootRenderNode on a thread with a looper!");
114c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        env->GetJavaVM(&mVm);
115e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual ~RootRenderNode() {}
118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
119c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    virtual void onError(const std::string& message) {
120c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        mLooper->sendMessage(new RenderingException(mVm, message), 0);
121c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    }
122c25e506f7fc08790c0532f927f31310a2ca778b7John Reck
123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void prepareTree(TreeInfo& info) {
124c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        info.errorHandler = this;
125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        RenderNode::prepareTree(info);
126c25e506f7fc08790c0532f927f31310a2ca778b7John Reck        info.errorHandler = NULL;
127119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
128119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
129119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void sendMessage(const sp<MessageHandler>& handler) {
130119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mLooper->sendMessage(handler, 0);
131119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
132119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
133119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void attachAnimatingNode(RenderNode* animatingNode) {
134119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mPendingAnimatingRenderNodes.push_back(animatingNode);
135119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
136119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
137119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    void doAttachAnimatingNodes(AnimationContext* context) {
138119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) {
139119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            RenderNode* node = mPendingAnimatingRenderNodes[i].get();
140119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            context->addAnimatingRenderNode(*node);
141119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        }
142119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mPendingAnimatingRenderNodes.clear();
143119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
144119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
145119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate:
146119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    sp<Looper> mLooper;
147119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    JavaVM* mVm;
148119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes;
149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck};
150119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
151119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass AnimationContextBridge : public AnimationContext {
152119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic:
153119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode)
154119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            : AnimationContext(clock), mRootNode(rootNode) {
155119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
156119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
157119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual ~AnimationContextBridge() {}
158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
159119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // Marks the start of a frame, which will update the frame time and move all
160119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // next frame animations into the current frame
161119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual void startFrame() {
162119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mRootNode->doAttachAnimatingNodes(this);
163119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        AnimationContext::startFrame();
164119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
165119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
166119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    // Runs any animations still left in mCurrentFrameAnimations
167119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual void runRemainingAnimations(TreeInfo& info) {
168119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        AnimationContext::runRemainingAnimations(info);
169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        // post all the finished stuff
17052244fff29042926e21fa897ef5ab11148e35299John Reck        if (mOnFinishedEvents.size()) {
171e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            sp<InvokeAnimationListeners> message
17252244fff29042926e21fa897ef5ab11148e35299John Reck                    = new InvokeAnimationListeners(mOnFinishedEvents);
173119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck            mRootNode->sendMessage(message);
174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        }
175e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
176e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
177119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) {
178119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        OnFinishedEvent event(animator, listener);
179119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        mOnFinishedEvents.push_back(event);
180119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
181119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
182e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
183119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    sp<RootRenderNode> mRootNode;
18452244fff29042926e21fa897ef5ab11148e35299John Reck    std::vector<OnFinishedEvent> mOnFinishedEvents;
185119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck};
186119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
187119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass ContextFactoryImpl : public IContextFactory {
188119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic:
189119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {}
190119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
191119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) {
192119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        return new AnimationContextBridge(clock, mRootNode);
193119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    }
194119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
195119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate:
196119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RootRenderNode* mRootNode;
197e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
198e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
19966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz,
2003b20251a355c88193c439f928a84ae69483fb488John Reck        jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) {
20166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
20266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    jsize len = env->GetArrayLength(atlasMapArray);
20366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    if (len <= 0) {
20466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck        ALOGW("Failed to initialize atlas, invalid map length: %d", len);
20566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck        return;
20666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    }
20766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    int64_t* map = new int64_t[len];
20866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck    env->GetLongArrayRegion(atlasMapArray, 0, len, map);
20966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck
2103b20251a355c88193c439f928a84ae69483fb488John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2113b20251a355c88193c439f928a84ae69483fb488John Reck    proxy->setTextureAtlas(buffer, map, len);
2124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
214e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) {
215c25e506f7fc08790c0532f927f31310a2ca778b7John Reck    RootRenderNode* node = new RootRenderNode(env);
216e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    node->incStrong(0);
217e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    node->setName("RootRenderNode");
218e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return reinterpret_cast<jlong>(node);
219e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
220e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
2214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz,
222e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        jboolean translucent, jlong rootRenderNodePtr) {
223119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr);
224119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    ContextFactoryImpl factory(rootRenderNode);
225119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    return (jlong) new RenderProxy(translucent, rootRenderNode, &factory);
2264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
2284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
2294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
23019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    delete proxy;
2324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
23418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reckstatic void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz,
23518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck        jlong proxyPtr, jlong frameIntervalNanos) {
23618f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
23718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    proxy->setFrameInterval(frameIntervalNanos);
23818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck}
23918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck
240e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz,
241e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck        jlong proxyPtr) {
242e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
243e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    return proxy->loadSystemProperties();
244e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck}
245e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck
2464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz,
2474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
24819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface);
250f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    return proxy->initialize(window);
2514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
2534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz,
2544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
25519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window;
2574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    if (jsurface) {
2584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
2594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    }
260f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    proxy->updateSurface(window);
261f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck}
262f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck
263f7d9c1dc84671d4e99657ef071d275700d85bb11John Reckstatic void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz,
264f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck        jlong proxyPtr, jobject jsurface) {
265f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
266f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    sp<ANativeWindow> window;
267f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    if (jsurface) {
268f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
269f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    }
270f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    proxy->pauseSurface(window);
2714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
273797b95b26bbb7557678af78b9a2a61830158920fChris Craikstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr,
274797b95b26bbb7557678af78b9a2a61830158920fChris Craik        jint width, jint height,
275058fc640017c90120c599d378a4cbc55668b05b7Chris Craik        jfloat lightX, jfloat lightY, jfloat lightZ, jfloat lightRadius,
276058fc640017c90120c599d378a4cbc55668b05b7Chris Craik        jint ambientShadowAlpha, jint spotShadowAlpha) {
27719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
27873e8205f75908521fb3dd7ffd29f51484b5e90a7John Reck    proxy->setup(width, height, (Vector3){lightX, lightY, lightZ}, lightRadius,
279058fc640017c90120c599d378a4cbc55668b05b7Chris Craik            ambientShadowAlpha, spotShadowAlpha);
2804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
28263a06673253914510bbeebd500655008682dade1John Reckstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz,
28363a06673253914510bbeebd500655008682dade1John Reck        jlong proxyPtr, jboolean opaque) {
28463a06673253914510bbeebd500655008682dade1John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
28563a06673253914510bbeebd500655008682dade1John Reck    proxy->setOpaque(opaque);
28663a06673253914510bbeebd500655008682dade1John Reck}
28763a06673253914510bbeebd500655008682dade1John Reck
288f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz,
289e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck        jlong proxyPtr, jlong frameTimeNanos, jlong recordDuration, jfloat density) {
29019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
291e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    return proxy->syncAndDrawFrame(frameTimeNanos, recordDuration, density);
2924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
294fae904d63947fe1687d1d44be29234cc3d538f24John Reckstatic void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz,
2954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
29619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
297fae904d63947fe1687d1d44be29234cc3d538f24John Reck    proxy->destroyCanvasAndSurface();
2984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
300119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_ThreadedRenderer_registerAnimatingRenderNode(JNIEnv* env, jobject clazz,
301119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck        jlong rootNodePtr, jlong animatingNodePtr) {
302119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr);
303119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    RenderNode* animatingNode = reinterpret_cast<RenderNode*>(animatingNodePtr);
304119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    rootRenderNode->attachAnimatingNode(animatingNode);
305119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}
306119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck
3070d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
3083b20251a355c88193c439f928a84ae69483fb488John Reck        jlong functorPtr, jboolean waitForCompletion) {
3090d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
3103b20251a355c88193c439f928a84ae69483fb488John Reck    RenderProxy::invokeFunctor(functor, waitForCompletion);
3110d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck}
3120d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck
31319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
31419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jint width, jint height) {
31519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
31619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
31719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
31819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
31919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
32019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
32119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr) {
32219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
32319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createTextureLayer();
32419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
32519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
32619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
3273e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reckstatic void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz,
3283e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck        jlong proxyPtr, jlong nodePtr) {
3293e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
3303e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr);
3313e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    proxy->buildLayer(node);
3323e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck}
3333e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck
33419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
33519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
33619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
33719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
33819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
33919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return proxy->copyLayerInto(layer, bitmap);
34019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
34119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
342d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_pushLayerUpdate(JNIEnv* env, jobject clazz,
34319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr) {
34419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
34519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
346d72e0a339b54af0c4e731513bbad120dff694723John Reck    proxy->pushLayerUpdate(layer);
347d72e0a339b54af0c4e731513bbad120dff694723John Reck}
348d72e0a339b54af0c4e731513bbad120dff694723John Reck
349d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_cancelLayerUpdate(JNIEnv* env, jobject clazz,
350d72e0a339b54af0c4e731513bbad120dff694723John Reck        jlong proxyPtr, jlong layerPtr) {
351d72e0a339b54af0c4e731513bbad120dff694723John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
352d72e0a339b54af0c4e731513bbad120dff694723John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
353d72e0a339b54af0c4e731513bbad120dff694723John Reck    proxy->cancelLayerUpdate(layer);
35419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
35519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
356918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reckstatic void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz,
357918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck        jlong proxyPtr, jlong layerPtr) {
358918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
359918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
360918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    proxy->detachSurfaceTexture(layer);
361918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck}
362918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck
363f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_destroyHardwareResources(JNIEnv* env, jobject clazz,
364f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck        jlong proxyPtr) {
365e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
366f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    proxy->destroyHardwareResources();
367f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck}
368f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck
369f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_trimMemory(JNIEnv* env, jobject clazz,
370f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck        jint level) {
371f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    RenderProxy::trimMemory(level);
372e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck}
373e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck
37428ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz,
37528ad7b52e038ef0cdd89f753d9839444a434b299John Reck        jlong proxyPtr) {
37628ad7b52e038ef0cdd89f753d9839444a434b299John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
37728ad7b52e038ef0cdd89f753d9839444a434b299John Reck    proxy->fence();
37828ad7b52e038ef0cdd89f753d9839444a434b299John Reck}
37928ad7b52e038ef0cdd89f753d9839444a434b299John Reck
380f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_stopDrawing(JNIEnv* env, jobject clazz,
381f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck        jlong proxyPtr) {
382f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
383f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    proxy->stopDrawing();
384f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck}
385f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck
386a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz,
387a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck        jlong proxyPtr) {
388a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
389a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    proxy->notifyFramePending();
390a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck}
391a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck
392fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz,
393fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck        jlong proxyPtr, jobject javaFileDescriptor) {
394fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
395fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
396fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    proxy->dumpProfileInfo(fd);
397fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck}
398fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck
399cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
400cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
401cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
40284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// Shaders
40384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ----------------------------------------------------------------------------
40484a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck
40584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reckstatic void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
40684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck        jstring diskCachePath) {
40784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck
40884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
40984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    egl_cache_t::get()->setCacheFilename(cacheArray);
41084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    env->ReleaseStringUTFChars(diskCachePath, cacheArray);
41184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck}
41284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck
41384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ----------------------------------------------------------------------------
414cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue
415cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
416cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
417cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer";
418cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
419cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic JNINativeMethod gMethods[] = {
420cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
4213b20251a355c88193c439f928a84ae69483fb488John Reck    { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V",   (void*) android_view_ThreadedRenderer_setAtlas },
422e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
423e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy },
4244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy },
42518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval },
426e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties },
4274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize },
4284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface },
429f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface },
430058fc640017c90120c599d378a4cbc55668b05b7Chris Craik    { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup },
43163a06673253914510bbeebd500655008682dade1John Reck    { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque },
432e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    { "nSyncAndDrawFrame", "(JJJF)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame },
433fae904d63947fe1687d1d44be29234cc3d538f24John Reck    { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface },
434119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode },
4353b20251a355c88193c439f928a84ae69483fb488John Reck    { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
43619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
43719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
4383e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck    { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
43919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
440d72e0a339b54af0c4e731513bbad120dff694723John Reck    { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate },
441d72e0a339b54af0c4e731513bbad120dff694723John Reck    { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate },
442918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture },
443f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    { "nDestroyHardwareResources", "(J)V", (void*) android_view_ThreadedRenderer_destroyHardwareResources },
444f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    { "nTrimMemory", "(I)V", (void*) android_view_ThreadedRenderer_trimMemory },
44528ad7b52e038ef0cdd89f753d9839444a434b299John Reck    { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
446f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    { "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing },
447a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
448fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    { "nDumpProfileInfo", "(JLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo },
449cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
45084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck    { "setupShadersDiskCache", "(Ljava/lang/String;)V",
45184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck                (void*) android_view_ThreadedRenderer_setupShadersDiskCache },
452cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
453cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
454cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) {
455cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
456cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}
457cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
458cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android
459