android_view_ThreadedRenderer.cpp revision e4280baaa709c74d86cf6a389a4674ca665f5af6
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 15518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reckstatic void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, 15618f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck jlong proxyPtr, jlong frameIntervalNanos) { 15718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 15818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck proxy->setFrameInterval(frameIntervalNanos); 15918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck} 16018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 161e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, 162e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck jlong proxyPtr) { 163e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 164e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck return proxy->loadSystemProperties(); 165e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck} 166e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck 1674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, 1684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 16919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 1704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface); 171f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck return proxy->initialize(window); 1724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, 1754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 17619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 1774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window; 1784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (jsurface) { 1794f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 1804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 181f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck proxy->updateSurface(window); 182f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck} 183f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 184f7d9c1dc84671d4e99657ef071d275700d85bb11John Reckstatic void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, 185f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck jlong proxyPtr, jobject jsurface) { 186f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 187f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck sp<ANativeWindow> window; 188f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (jsurface) { 189f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 190f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 191f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck proxy->pauseSurface(window); 1924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, 1954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jint width, jint height) { 19619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 1974f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck proxy->setup(width, height); 1984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 200f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, 20118f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck jlong proxyPtr, jlong frameTimeNanos, jint dirtyLeft, jint dirtyTop, 2024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jint dirtyRight, jint dirtyBottom) { 20319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 204f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck return proxy->syncAndDrawFrame(frameTimeNanos, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); 2054f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2064f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 207fae904d63947fe1687d1d44be29234cc3d538f24John Reckstatic void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz, 2084f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 20919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 210fae904d63947fe1687d1d44be29234cc3d538f24John Reck proxy->destroyCanvasAndSurface(); 2114f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2130d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz, 2140d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) { 2150d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2160d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck Functor* functor = reinterpret_cast<Functor*>(functorPtr); 2170d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck proxy->invokeFunctor(functor, waitForCompletion); 2180d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck} 2190d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 220fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reckstatic void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz, 221fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck jlong proxyPtr, jobject jrunnable) { 22219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 223fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck RenderTask* task = new JavaTask(env, jrunnable); 224fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck proxy->runWithGlContext(task); 225fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck} 226fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck 22719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz, 22819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jint width, jint height) { 22919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 23019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height); 23119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 23219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 23319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 23419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz, 23519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr) { 23619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 23719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createTextureLayer(); 23819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 23919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 24019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 24119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz, 24219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) { 24319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 24419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 24519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 24619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return proxy->copyLayerInto(layer, bitmap); 24719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 24819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 24919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject clazz, 25019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr) { 25119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 25219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 25319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck proxy->destroyLayer(layer); 25419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 25519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 25628ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz, 25728ad7b52e038ef0cdd89f753d9839444a434b299John Reck jlong proxyPtr) { 25828ad7b52e038ef0cdd89f753d9839444a434b299John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 25928ad7b52e038ef0cdd89f753d9839444a434b299John Reck proxy->fence(); 26028ad7b52e038ef0cdd89f753d9839444a434b299John Reck} 26128ad7b52e038ef0cdd89f753d9839444a434b299John Reck 262cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif 263cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 264cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 265cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue 266cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 267cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 268cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer"; 269cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 270cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic JNINativeMethod gMethods[] = { 271cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER 272cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck { "postToRenderThread", "(Ljava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_postToRenderThread }, 273e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, 274e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, 2754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, 27618f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, 277e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, 2784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, 2794f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, 280f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, 2814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup }, 282f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck { "nSyncAndDrawFrame", "(JJIIII)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, 283fae904d63947fe1687d1d44be29234cc3d538f24John Reck { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface }, 2840d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, 285fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext }, 28619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer }, 28719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, 28819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, 28919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer }, 29028ad7b52e038ef0cdd89f753d9839444a434b299John Reck { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence }, 291cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif 292cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 293cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 294cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) { 295cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER 296cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck jclass cls = env->FindClass("java/lang/Runnable"); 297cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck gRunnableMethod = env->GetMethodID(cls, "run", "()V"); 298cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck env->DeleteLocalRef(cls); 299cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif 300cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 301cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 302cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 303cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android 304