android_view_ThreadedRenderer.cpp revision e45b1fd03b524d2b57cc6c222d89076a31a08bea
1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Copyright (C) 2010 The Android Open Source Project
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *      http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define LOG_TAG "ThreadedRenderer"
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <algorithm>
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "jni.h"
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <nativehelper/JNIHelp.h>
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <android_runtime/AndroidRuntime.h>
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <utils/StrongPointer.h>
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <android_runtime/android_view_Surface.h>
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <system/window.h>
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "android_view_RenderNodeAnimator.h"
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <RenderNode.h>
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <renderthread/RenderProxy.h>
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <renderthread/RenderTask.h>
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <renderthread/RenderThread.h>
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardnamespace android {
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_OPENGL_RENDERER
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardusing namespace android::uirenderer;
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardusing namespace android::uirenderer::renderthread;
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic jmethodID gRunnableMethod;
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardclass JavaTask : public RenderTask {
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardpublic:
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    JavaTask(JNIEnv* env, jobject jrunnable) {
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        env->GetJavaVM(&mVm);
48b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        mRunnable = env->NewGlobalRef(jrunnable);
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual void run() {
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        env()->CallVoidMethod(mRunnable, gRunnableMethod);
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        env()->DeleteGlobalRef(mRunnable);
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        delete this;
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    };
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardprivate:
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    JNIEnv* env() {
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        JNIEnv* env;
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            return 0;
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        return env;
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    JavaVM* mVm;
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    jobject mRunnable;
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardclass InvokeAnimationListeners : public MessageHandler {
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgardpublic:
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    InvokeAnimationListeners(std::vector< sp<RenderNodeAnimator> >& animators) {
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        mAnimators.swap(animators);
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    static void callOnFinished(const sp<RenderNodeAnimator>& animator) {
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        animator->callOnFinished();
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual void handleMessage(const Message& message) {
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        std::for_each(mAnimators.begin(), mAnimators.end(), callOnFinished);
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        mAnimators.clear();
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardprivate:
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    std::vector< sp<RenderNodeAnimator> > mAnimators;
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardclass RootRenderNode : public RenderNode, public AnimationListener {
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardpublic:
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RootRenderNode() : RenderNode() {
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        mLooper = Looper::getForThread();
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        LOG_ALWAYS_FATAL_IF(!mLooper.get(),
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                "Must create RootRenderNode on a thread with a looper!");
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual ~RootRenderNode() {}
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    void onAnimationFinished(const sp<RenderPropertyAnimator>& animator) {
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        mFinishedAnimators.push_back(
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                reinterpret_cast<RenderNodeAnimator*>(animator.get()));
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    virtual void prepareTree(TreeInfo& info) {
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        info.animationListener = this;
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        RenderNode::prepareTree(info);
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        info.animationListener = NULL;
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        // post all the finished stuff
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        if (mFinishedAnimators.size()) {
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            sp<InvokeAnimationListeners> message
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard                    = new InvokeAnimationListeners(mFinishedAnimators);
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard            mLooper->sendMessage(message, 0);
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        }
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardprivate:
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    sp<Looper> mLooper;
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    std::vector< sp<RenderNodeAnimator> > mFinishedAnimators;
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_postToRenderThread(JNIEnv* env, jobject clazz,
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jobject jrunnable) {
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderTask* task = new JavaTask(env, jrunnable);
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderThread::getInstance().queue(task);
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) {
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RootRenderNode* node = new RootRenderNode();
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    node->incStrong(0);
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    node->setName("RootRenderNode");
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return reinterpret_cast<jlong>(node);
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz,
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jboolean translucent, jlong rootRenderNodePtr) {
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderNode* rootRenderNode = reinterpret_cast<RenderNode*>(rootRenderNodePtr);
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return (jlong) new RenderProxy(translucent, rootRenderNode);
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr) {
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    delete proxy;
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz,
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jobject jsurface) {
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface);
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return proxy->initialize(window);
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz,
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jobject jsurface) {
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    sp<ANativeWindow> window;
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (jsurface) {
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        window = android_view_Surface_getNativeWindow(env, jsurface);
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->updateSurface(window);
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz,
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jobject jsurface) {
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    sp<ANativeWindow> window;
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    if (jsurface) {
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        window = android_view_Surface_getNativeWindow(env, jsurface);
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->pauseSurface(window);
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz,
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jint width, jint height) {
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->setup(width, height);
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz,
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jint dirtyLeft, jint dirtyTop,
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jint dirtyRight, jint dirtyBottom) {
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->syncAndDrawFrame(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom);
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz,
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr) {
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->destroyCanvasAndSurface();
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) {
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->invokeFunctor(functor, waitForCompletion);
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
200b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgardstatic void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jobject jrunnable) {
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderTask* task = new JavaTask(env, jrunnable);
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    proxy->runWithGlContext(task);
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        jlong proxyPtr, jint width, jint height) {
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    return reinterpret_cast<jlong>(layer);
212}
213
214static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
215        jlong proxyPtr) {
216    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
217    DeferredLayerUpdater* layer = proxy->createTextureLayer();
218    return reinterpret_cast<jlong>(layer);
219}
220
221static jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
222        jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
223    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
224    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
225    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
226    return proxy->copyLayerInto(layer, bitmap);
227}
228
229static void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject clazz,
230        jlong proxyPtr, jlong layerPtr) {
231    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
232    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
233    proxy->destroyLayer(layer);
234}
235
236static void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz,
237        jlong proxyPtr) {
238    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
239    proxy->fence();
240}
241
242#endif
243
244// ----------------------------------------------------------------------------
245// JNI Glue
246// ----------------------------------------------------------------------------
247
248const char* const kClassPathName = "android/view/ThreadedRenderer";
249
250static JNINativeMethod gMethods[] = {
251#ifdef USE_OPENGL_RENDERER
252    { "postToRenderThread", "(Ljava/lang/Runnable;)V",   (void*) android_view_ThreadedRenderer_postToRenderThread },
253    { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
254    { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy },
255    { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy },
256    { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize },
257    { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface },
258    { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface },
259    { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup },
260    { "nSyncAndDrawFrame", "(JIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame },
261    { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface },
262    { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
263    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
264    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
265    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
266    { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
267    { "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer },
268    { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
269#endif
270};
271
272int register_android_view_ThreadedRenderer(JNIEnv* env) {
273#ifdef USE_OPENGL_RENDERER
274    jclass cls = env->FindClass("java/lang/Runnable");
275    gRunnableMethod = env->GetMethodID(cls, "run", "()V");
276    env->DeleteLocalRef(cls);
277#endif
278    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
279}
280
281}; // namespace android
282