android_view_ThreadedRenderer.cpp revision 52244fff29042926e21fa897ef5ab11148e35299
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
254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h>
264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h>
274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h>
284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
2952244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h>
30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h>
314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h>
32cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h>
33cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h>
34cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
35cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android {
36cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
37cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
38cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer;
404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread;
41cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
42cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic jmethodID gRunnableMethod;
43cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass JavaTask : public RenderTask {
45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic:
46cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    JavaTask(JNIEnv* env, jobject jrunnable) {
47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        env->GetJavaVM(&mVm);
48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        mRunnable = env->NewGlobalRef(jrunnable);
49cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    }
50cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    virtual void run() {
52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        env()->CallVoidMethod(mRunnable, gRunnableMethod);
534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        env()->DeleteGlobalRef(mRunnable);
544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        delete this;
55cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    };
56cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
57cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprivate:
58cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    JNIEnv* env() {
59cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        JNIEnv* env;
60cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
61cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck            return 0;
62cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        }
63cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        return env;
64cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    }
65cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
66cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    JavaVM* mVm;
67cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    jobject mRunnable;
68cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
69cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
7052244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent {
7152244fff29042926e21fa897ef5ab11148e35299John Reckpublic:
7252244fff29042926e21fa897ef5ab11148e35299John Reck    OnFinishedEvent(BaseAnimator* animator, AnimationListener* listener)
7352244fff29042926e21fa897ef5ab11148e35299John Reck            : animator(animator), listener(listener) {}
7452244fff29042926e21fa897ef5ab11148e35299John Reck    sp<BaseAnimator> animator;
7552244fff29042926e21fa897ef5ab11148e35299John Reck    sp<AnimationListener> listener;
7652244fff29042926e21fa897ef5ab11148e35299John Reck};
7752244fff29042926e21fa897ef5ab11148e35299John Reck
78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler {
79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
8052244fff29042926e21fa897ef5ab11148e35299John Reck    InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) {
8152244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.swap(events);
82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
8452244fff29042926e21fa897ef5ab11148e35299John Reck    static void callOnFinished(OnFinishedEvent& event) {
8552244fff29042926e21fa897ef5ab11148e35299John Reck        event.listener->onAnimationFinished(event.animator.get());
86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void handleMessage(const Message& message) {
8952244fff29042926e21fa897ef5ab11148e35299John Reck        std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished);
9052244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.clear();
91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
93e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
9452244fff29042926e21fa897ef5ab11148e35299John Reck    std::vector<OnFinishedEvent> mOnFinishedEvents;
95e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
9752244fff29042926e21fa897ef5ab11148e35299John Reckclass RootRenderNode : public RenderNode, public AnimationHook {
98e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RootRenderNode() : RenderNode() {
100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        mLooper = Looper::getForThread();
101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        LOG_ALWAYS_FATAL_IF(!mLooper.get(),
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck                "Must create RootRenderNode on a thread with a looper!");
103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual ~RootRenderNode() {}
106e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
10752244fff29042926e21fa897ef5ab11148e35299John Reck    virtual void callOnFinished(BaseAnimator* animator, AnimationListener* listener) {
10852244fff29042926e21fa897ef5ab11148e35299John Reck        OnFinishedEvent event(animator, listener);
10952244fff29042926e21fa897ef5ab11148e35299John Reck        mOnFinishedEvents.push_back(event);
110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void prepareTree(TreeInfo& info) {
11352244fff29042926e21fa897ef5ab11148e35299John Reck        info.animationHook = this;
114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        RenderNode::prepareTree(info);
11552244fff29042926e21fa897ef5ab11148e35299John Reck        info.animationHook = NULL;
116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        // post all the finished stuff
11852244fff29042926e21fa897ef5ab11148e35299John Reck        if (mOnFinishedEvents.size()) {
119e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            sp<InvokeAnimationListeners> message
12052244fff29042926e21fa897ef5ab11148e35299John Reck                    = new InvokeAnimationListeners(mOnFinishedEvents);
121e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck            mLooper->sendMessage(message, 0);
122e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        }
123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate:
126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    sp<Looper> mLooper;
12752244fff29042926e21fa897ef5ab11148e35299John Reck    std::vector<OnFinishedEvent> mOnFinishedEvents;
128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
130cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic void android_view_ThreadedRenderer_postToRenderThread(JNIEnv* env, jobject clazz,
131cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck        jobject jrunnable) {
1324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* task = new JavaTask(env, jrunnable);
1334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread::getInstance().queue(task);
1344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) {
137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RootRenderNode* node = new RootRenderNode();
138e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    node->incStrong(0);
139e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    node->setName("RootRenderNode");
140e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return reinterpret_cast<jlong>(node);
141e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}
142e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
1434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz,
144e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        jboolean translucent, jlong rootRenderNodePtr) {
145e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    RenderNode* rootRenderNode = reinterpret_cast<RenderNode*>(rootRenderNodePtr);
146e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return (jlong) new RenderProxy(translucent, rootRenderNode);
1474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
1504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
15119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    delete proxy;
1534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz,
1564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
15719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface);
159f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    return proxy->initialize(window);
1604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz,
1634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jobject jsurface) {
16419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    sp<ANativeWindow> window;
1664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    if (jsurface) {
1674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
1684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    }
169f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    proxy->updateSurface(window);
170f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck}
171f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck
172f7d9c1dc84671d4e99657ef071d275700d85bb11John Reckstatic void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz,
173f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck        jlong proxyPtr, jobject jsurface) {
174f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
175f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    sp<ANativeWindow> window;
176f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    if (jsurface) {
177f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck        window = android_view_Surface_getNativeWindow(env, jsurface);
178f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    }
179f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    proxy->pauseSurface(window);
1804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz,
1834f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr, jint width, jint height) {
18419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    proxy->setup(width, height);
1864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1874f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
188e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic void android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz,
189e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        jlong proxyPtr, jint dirtyLeft, jint dirtyTop,
1904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jint dirtyRight, jint dirtyBottom) {
19119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
192e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    proxy->syncAndDrawFrame(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom);
1934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
1944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
195fae904d63947fe1687d1d44be29234cc3d538f24John Reckstatic void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz,
1964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        jlong proxyPtr) {
19719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
198fae904d63947fe1687d1d44be29234cc3d538f24John Reck    proxy->destroyCanvasAndSurface();
1994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}
2004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
2010d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
2020d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck        jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) {
2030d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2040d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
2050d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    proxy->invokeFunctor(functor, waitForCompletion);
2060d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck}
2070d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck
208fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reckstatic void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
209fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck        jlong proxyPtr, jobject jrunnable) {
21019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
211fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    RenderTask* task = new JavaTask(env, jrunnable);
212fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    proxy->runWithGlContext(task);
213fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck}
214fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
21519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
21619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jint width, jint height) {
21719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
21819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
21919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
22019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
22119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
22219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
22319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr) {
22419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
22519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = proxy->createTextureLayer();
22619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return reinterpret_cast<jlong>(layer);
22719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
22819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
22919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
23019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
23119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
23219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
23319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
23419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    return proxy->copyLayerInto(layer, bitmap);
23519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
23619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
23719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject clazz,
23819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck        jlong proxyPtr, jlong layerPtr) {
23919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
24019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
24119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    proxy->destroyLayer(layer);
24219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}
24319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
24428ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz,
24528ad7b52e038ef0cdd89f753d9839444a434b299John Reck        jlong proxyPtr) {
24628ad7b52e038ef0cdd89f753d9839444a434b299John Reck    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
24728ad7b52e038ef0cdd89f753d9839444a434b299John Reck    proxy->fence();
24828ad7b52e038ef0cdd89f753d9839444a434b299John Reck}
24928ad7b52e038ef0cdd89f753d9839444a434b299John Reck
250cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
251cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
252cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
253cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue
254cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ----------------------------------------------------------------------------
255cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
256cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer";
257cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
258cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic JNINativeMethod gMethods[] = {
259cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
260cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    { "postToRenderThread", "(Ljava/lang/Runnable;)V",   (void*) android_view_ThreadedRenderer_postToRenderThread },
261e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
262e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy },
2634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy },
2644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize },
2654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface },
266f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface },
2674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup },
268e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    { "nSyncAndDrawFrame", "(JIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame },
269fae904d63947fe1687d1d44be29234cc3d538f24John Reck    { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface },
2700d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
271fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
27219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
27319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
27419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
27519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    { "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer },
27628ad7b52e038ef0cdd89f753d9839444a434b299John Reck    { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
277cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
278cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
279cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
280cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) {
281cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER
282cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    jclass cls = env->FindClass("java/lang/Runnable");
283cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    gRunnableMethod = env->GetMethodID(cls, "run", "()V");
284cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    env->DeleteLocalRef(cls);
285cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif
286cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
287cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}
288cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
289cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android
290