android_view_ThreadedRenderer.cpp revision ec845a215e343cdb3b2e4c7b6aff7b24beb0236b
1cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/* 2cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Copyright (C) 2010 The Android Open Source Project 3cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 4cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * you may not use this file except in compliance with the License. 6cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * You may obtain a copy of the License at 7cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 8cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 10cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Unless required by applicable law or agreed to in writing, software 11cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * See the License for the specific language governing permissions and 14cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * limitations under the License. 15cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */ 16cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define LOG_TAG "ThreadedRenderer" 18cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <algorithm> 20e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 21cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include "jni.h" 22cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <nativehelper/JNIHelp.h> 23cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <android_runtime/AndroidRuntime.h> 24cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 2584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl.h> 2684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/eglext.h> 2784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl_cache.h> 2884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h> 304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h> 314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h> 324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include "android_view_GraphicBuffer.h" 3466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 3552244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h> 36119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <AnimationContext.h> 37119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <IContextFactory.h> 38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h> 3966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include <renderthread/CanvasContext.h> 404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h> 41cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h> 42cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h> 43797b95b26bbb7557678af78b9a2a61830158920fChris Craik#include <Vector.h> 44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android { 46cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER 48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer; 504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread; 51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 52c25e506f7fc08790c0532f927f31310a2ca778b7John Reckstatic JNIEnv* getenv(JavaVM* vm) { 53c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env; 54c25e506f7fc08790c0532f927f31310a2ca778b7John Reck if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 55c25e506f7fc08790c0532f927f31310a2ca778b7John Reck LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm); 56c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 57c25e506f7fc08790c0532f927f31310a2ca778b7John Reck return env; 58c25e506f7fc08790c0532f927f31310a2ca778b7John Reck} 59c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 6052244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent { 6152244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 62ff941dcd815021bb20d6504eb486acb1e50592c3John Reck OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener) 6352244fff29042926e21fa897ef5ab11148e35299John Reck : animator(animator), listener(listener) {} 64ff941dcd815021bb20d6504eb486acb1e50592c3John Reck sp<BaseRenderNodeAnimator> animator; 6552244fff29042926e21fa897ef5ab11148e35299John Reck sp<AnimationListener> listener; 6652244fff29042926e21fa897ef5ab11148e35299John Reck}; 6752244fff29042926e21fa897ef5ab11148e35299John Reck 68e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler { 69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 7052244fff29042926e21fa897ef5ab11148e35299John Reck InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) { 7152244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.swap(events); 72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 7452244fff29042926e21fa897ef5ab11148e35299John Reck static void callOnFinished(OnFinishedEvent& event) { 7552244fff29042926e21fa897ef5ab11148e35299John Reck event.listener->onAnimationFinished(event.animator.get()); 76e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void handleMessage(const Message& message) { 7952244fff29042926e21fa897ef5ab11148e35299John Reck std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished); 8052244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.clear(); 81e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 8452244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 85e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 87c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass RenderingException : public MessageHandler { 88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 89c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RenderingException(JavaVM* vm, const std::string& message) 90c25e506f7fc08790c0532f927f31310a2ca778b7John Reck : mVm(vm) 91c25e506f7fc08790c0532f927f31310a2ca778b7John Reck , mMessage(message) { 92c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 93c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 94c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void handleMessage(const Message&) { 95c25e506f7fc08790c0532f927f31310a2ca778b7John Reck throwException(mVm, mMessage); 96c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 97c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 98c25e506f7fc08790c0532f927f31310a2ca778b7John Reck static void throwException(JavaVM* vm, const std::string& message) { 99c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env = getenv(vm); 100c25e506f7fc08790c0532f927f31310a2ca778b7John Reck jniThrowException(env, "java/lang/IllegalStateException", message.c_str()); 101c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 102c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 103c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprivate: 104c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JavaVM* mVm; 105c25e506f7fc08790c0532f927f31310a2ca778b7John Reck std::string mMessage; 106c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}; 107c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 108119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass RootRenderNode : public RenderNode, ErrorHandler { 109c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic: 110c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode(JNIEnv* env) : RenderNode() { 111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mLooper = Looper::getForThread(); 112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck LOG_ALWAYS_FATAL_IF(!mLooper.get(), 113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck "Must create RootRenderNode on a thread with a looper!"); 114c25e506f7fc08790c0532f927f31310a2ca778b7John Reck env->GetJavaVM(&mVm); 115e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual ~RootRenderNode() {} 118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 119c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void onError(const std::string& message) { 120c25e506f7fc08790c0532f927f31310a2ca778b7John Reck mLooper->sendMessage(new RenderingException(mVm, message), 0); 121c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 122c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 123e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void prepareTree(TreeInfo& info) { 124c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = this; 125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderNode::prepareTree(info); 126c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = NULL; 127119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 128119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 129119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void sendMessage(const sp<MessageHandler>& handler) { 130119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mLooper->sendMessage(handler, 0); 131119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 132119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 133119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void attachAnimatingNode(RenderNode* animatingNode) { 134119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.push_back(animatingNode); 135119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 136119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 137119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void doAttachAnimatingNodes(AnimationContext* context) { 138119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { 139119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* node = mPendingAnimatingRenderNodes[i].get(); 140119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck context->addAnimatingRenderNode(*node); 141119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 142119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.clear(); 143119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 144119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 145119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 146119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<Looper> mLooper; 147119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck JavaVM* mVm; 148119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes; 149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 150119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 151119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass AnimationContextBridge : public AnimationContext { 152119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 153119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode) 154119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck : AnimationContext(clock), mRootNode(rootNode) { 155119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 156119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 157119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual ~AnimationContextBridge() {} 158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 159119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Marks the start of a frame, which will update the frame time and move all 160119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // next frame animations into the current frame 161ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck virtual void startFrame(TreeInfo::TraversalMode mode) { 162ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck if (mode == TreeInfo::MODE_FULL) { 163ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck mRootNode->doAttachAnimatingNodes(this); 164ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck } 165ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck AnimationContext::startFrame(mode); 166119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 167119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 168119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Runs any animations still left in mCurrentFrameAnimations 169119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void runRemainingAnimations(TreeInfo& info) { 170119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContext::runRemainingAnimations(info); 171e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 172e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 174119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { 175119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck OnFinishedEvent event(animator, listener); 176119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mOnFinishedEvents.push_back(event); 177119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 178119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 179e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck virtual void destroy() { 180e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck AnimationContext::destroy(); 181e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 182e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 183e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 184e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 185119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<RootRenderNode> mRootNode; 18652244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 187e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 188e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck void postOnFinishedEvents() { 189e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck if (mOnFinishedEvents.size()) { 190e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck sp<InvokeAnimationListeners> message 191e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck = new InvokeAnimationListeners(mOnFinishedEvents); 192e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck mRootNode->sendMessage(message); 193e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 194e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 195119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 196119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 197119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass ContextFactoryImpl : public IContextFactory { 198119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 199119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} 200119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 201119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) { 202119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return new AnimationContextBridge(clock, mRootNode); 203119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 204119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 205119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 206119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* mRootNode; 207e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 208e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 20966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz, 2103b20251a355c88193c439f928a84ae69483fb488John Reck jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) { 21166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer); 21266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck jsize len = env->GetArrayLength(atlasMapArray); 21366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (len <= 0) { 21466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck ALOGW("Failed to initialize atlas, invalid map length: %d", len); 21566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck return; 21666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 21766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck int64_t* map = new int64_t[len]; 21866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck env->GetLongArrayRegion(atlasMapArray, 0, len, map); 21966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 2203b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2213b20251a355c88193c439f928a84ae69483fb488John Reck proxy->setTextureAtlas(buffer, map, len); 2224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 224e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { 225c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode* node = new RootRenderNode(env); 226e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->incStrong(0); 227e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->setName("RootRenderNode"); 228e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return reinterpret_cast<jlong>(node); 229e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 230e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 2314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz, 232e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jboolean translucent, jlong rootRenderNodePtr) { 233119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr); 234119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl factory(rootRenderNode); 235119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return (jlong) new RenderProxy(translucent, rootRenderNode, &factory); 2364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz, 2394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 24019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck delete proxy; 2424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 24418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reckstatic void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, 24518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck jlong proxyPtr, jlong frameIntervalNanos) { 24618f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 24718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck proxy->setFrameInterval(frameIntervalNanos); 24818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck} 24918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 250e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, 251e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck jlong proxyPtr) { 252e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 253e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck return proxy->loadSystemProperties(); 254e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck} 255e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck 2564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, 2574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 25819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface); 260f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck return proxy->initialize(window); 2614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, 2644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 26519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window; 2674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (jsurface) { 2684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 2694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 270f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck proxy->updateSurface(window); 271f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck} 272f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 273f7d9c1dc84671d4e99657ef071d275700d85bb11John Reckstatic void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, 274f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck jlong proxyPtr, jobject jsurface) { 275f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 276f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck sp<ANativeWindow> window; 277f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (jsurface) { 278f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 279f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 280f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck proxy->pauseSurface(window); 2814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 283797b95b26bbb7557678af78b9a2a61830158920fChris Craikstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, 284797b95b26bbb7557678af78b9a2a61830158920fChris Craik jint width, jint height, 285058fc640017c90120c599d378a4cbc55668b05b7Chris Craik jfloat lightX, jfloat lightY, jfloat lightZ, jfloat lightRadius, 286058fc640017c90120c599d378a4cbc55668b05b7Chris Craik jint ambientShadowAlpha, jint spotShadowAlpha) { 28719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 28873e8205f75908521fb3dd7ffd29f51484b5e90a7John Reck proxy->setup(width, height, (Vector3){lightX, lightY, lightZ}, lightRadius, 289058fc640017c90120c599d378a4cbc55668b05b7Chris Craik ambientShadowAlpha, spotShadowAlpha); 2904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 29263a06673253914510bbeebd500655008682dade1John Reckstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, 29363a06673253914510bbeebd500655008682dade1John Reck jlong proxyPtr, jboolean opaque) { 29463a06673253914510bbeebd500655008682dade1John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 29563a06673253914510bbeebd500655008682dade1John Reck proxy->setOpaque(opaque); 29663a06673253914510bbeebd500655008682dade1John Reck} 29763a06673253914510bbeebd500655008682dade1John Reck 298f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, 299e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck jlong proxyPtr, jlong frameTimeNanos, jlong recordDuration, jfloat density) { 30019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 301e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck return proxy->syncAndDrawFrame(frameTimeNanos, recordDuration, density); 3024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 30417035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckstatic void android_view_ThreadedRenderer_destroy(JNIEnv* env, jobject clazz, 3054f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 30619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 30717035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck proxy->destroy(); 3084f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3094f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 310119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_ThreadedRenderer_registerAnimatingRenderNode(JNIEnv* env, jobject clazz, 311119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong rootNodePtr, jlong animatingNodePtr) { 312119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr); 313119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* animatingNode = reinterpret_cast<RenderNode*>(animatingNodePtr); 314119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck rootRenderNode->attachAnimatingNode(animatingNode); 315119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck} 316119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 3170d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz, 3183b20251a355c88193c439f928a84ae69483fb488John Reck jlong functorPtr, jboolean waitForCompletion) { 3190d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck Functor* functor = reinterpret_cast<Functor*>(functorPtr); 3203b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy::invokeFunctor(functor, waitForCompletion); 3210d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck} 3220d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 32319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz, 32419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jint width, jint height) { 32519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 32619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height); 32719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 32819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 32919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 33019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz, 33119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr) { 33219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 33319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createTextureLayer(); 33419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 33519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 33619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 3373e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reckstatic void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz, 3383e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck jlong proxyPtr, jlong nodePtr) { 3393e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 3403e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr); 3413e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck proxy->buildLayer(node); 3423e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck} 3433e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 34419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz, 34519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) { 34619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 34719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 34819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr); 34919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return proxy->copyLayerInto(layer, bitmap); 35019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 35119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 352d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_pushLayerUpdate(JNIEnv* env, jobject clazz, 35319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr) { 35419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 35519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 356d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->pushLayerUpdate(layer); 357d72e0a339b54af0c4e731513bbad120dff694723John Reck} 358d72e0a339b54af0c4e731513bbad120dff694723John Reck 359d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_cancelLayerUpdate(JNIEnv* env, jobject clazz, 360d72e0a339b54af0c4e731513bbad120dff694723John Reck jlong proxyPtr, jlong layerPtr) { 361d72e0a339b54af0c4e731513bbad120dff694723John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 362d72e0a339b54af0c4e731513bbad120dff694723John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 363d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->cancelLayerUpdate(layer); 36419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 36519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 366918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reckstatic void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz, 367918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck jlong proxyPtr, jlong layerPtr) { 368918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 369918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 370918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck proxy->detachSurfaceTexture(layer); 371918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck} 372918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck 373f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_destroyHardwareResources(JNIEnv* env, jobject clazz, 374f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 375e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 376f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->destroyHardwareResources(); 377f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 378f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 379f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_trimMemory(JNIEnv* env, jobject clazz, 380f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jint level) { 381f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy::trimMemory(level); 382e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck} 383e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 38428ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz, 38528ad7b52e038ef0cdd89f753d9839444a434b299John Reck jlong proxyPtr) { 38628ad7b52e038ef0cdd89f753d9839444a434b299John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 38728ad7b52e038ef0cdd89f753d9839444a434b299John Reck proxy->fence(); 38828ad7b52e038ef0cdd89f753d9839444a434b299John Reck} 38928ad7b52e038ef0cdd89f753d9839444a434b299John Reck 390f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_stopDrawing(JNIEnv* env, jobject clazz, 391f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 392f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 393f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->stopDrawing(); 394f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 395f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 396a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz, 397a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck jlong proxyPtr) { 398a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 399a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck proxy->notifyFramePending(); 400a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck} 401a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 402fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz, 403fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck jlong proxyPtr, jobject javaFileDescriptor) { 404fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 405fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 406fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck proxy->dumpProfileInfo(fd); 407fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck} 408fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 409cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif 410cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 411cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 41284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// Shaders 41384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 41484a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 41584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reckstatic void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz, 41684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck jstring diskCachePath) { 41784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 41884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL); 41984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck egl_cache_t::get()->setCacheFilename(cacheArray); 42084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck env->ReleaseStringUTFChars(diskCachePath, cacheArray); 42184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck} 42284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 42384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 424cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue 425cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 426cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 427cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer"; 428cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 429cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckstatic JNINativeMethod gMethods[] = { 430cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifdef USE_OPENGL_RENDERER 4313b20251a355c88193c439f928a84ae69483fb488John Reck { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas }, 432e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, 433e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, 4344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, 43518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, 436e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, 4374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, 4384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, 439f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, 440058fc640017c90120c599d378a4cbc55668b05b7Chris Craik { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup }, 44163a06673253914510bbeebd500655008682dade1John Reck { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, 442e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck { "nSyncAndDrawFrame", "(JJJF)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, 44317035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy }, 444119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode }, 4453b20251a355c88193c439f928a84ae69483fb488John Reck { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, 44619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer }, 44719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, 4483e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer }, 44919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, 450d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate }, 451d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate }, 452918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture }, 453f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nDestroyHardwareResources", "(J)V", (void*) android_view_ThreadedRenderer_destroyHardwareResources }, 454f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nTrimMemory", "(I)V", (void*) android_view_ThreadedRenderer_trimMemory }, 45528ad7b52e038ef0cdd89f753d9839444a434b299John Reck { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence }, 456f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing }, 457a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending }, 458fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck { "nDumpProfileInfo", "(JLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo }, 459cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif 46084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck { "setupShadersDiskCache", "(Ljava/lang/String;)V", 46184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck (void*) android_view_ThreadedRenderer_setupShadersDiskCache }, 462cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 463cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 464cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) { 465cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); 466cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 467cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 468cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android 469