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