android_view_ThreadedRenderer.cpp revision b816087962aba0019b022303330f03b897b580ed
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> 23ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 243731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck#include <GraphicsJNI.h> 25edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <ScopedPrimitiveArray.h> 26cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 2784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl.h> 2884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/eglext.h> 2984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck#include <EGL/egl_cache.h> 3084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h> 324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <android_runtime/android_view_Surface.h> 334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <system/window.h> 344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include "android_view_GraphicBuffer.h" 3666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 3752244fff29042926e21fa897ef5ab11148e35299John Reck#include <Animator.h> 38119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <AnimationContext.h> 39119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <IContextFactory.h> 40edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <JankTracker.h> 41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <RenderNode.h> 4266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck#include <renderthread/CanvasContext.h> 434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <renderthread/RenderProxy.h> 44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderTask.h> 45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <renderthread/RenderThread.h> 46797b95b26bbb7557678af78b9a2a61830158920fChris Craik#include <Vector.h> 47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android { 49cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer; 514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckusing namespace android::uirenderer::renderthread; 52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 53c25e506f7fc08790c0532f927f31310a2ca778b7John Reckstatic JNIEnv* getenv(JavaVM* vm) { 54c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env; 55c25e506f7fc08790c0532f927f31310a2ca778b7John Reck if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { 56c25e506f7fc08790c0532f927f31310a2ca778b7John Reck LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm); 57c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 58c25e506f7fc08790c0532f927f31310a2ca778b7John Reck return env; 59c25e506f7fc08790c0532f927f31310a2ca778b7John Reck} 60c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 6152244fff29042926e21fa897ef5ab11148e35299John Reckclass OnFinishedEvent { 6252244fff29042926e21fa897ef5ab11148e35299John Reckpublic: 63ff941dcd815021bb20d6504eb486acb1e50592c3John Reck OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener) 6452244fff29042926e21fa897ef5ab11148e35299John Reck : animator(animator), listener(listener) {} 65ff941dcd815021bb20d6504eb486acb1e50592c3John Reck sp<BaseRenderNodeAnimator> animator; 6652244fff29042926e21fa897ef5ab11148e35299John Reck sp<AnimationListener> listener; 6752244fff29042926e21fa897ef5ab11148e35299John Reck}; 6852244fff29042926e21fa897ef5ab11148e35299John Reck 69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass InvokeAnimationListeners : public MessageHandler { 70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 7152244fff29042926e21fa897ef5ab11148e35299John Reck InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) { 7252244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.swap(events); 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 7552244fff29042926e21fa897ef5ab11148e35299John Reck static void callOnFinished(OnFinishedEvent& event) { 7652244fff29042926e21fa897ef5ab11148e35299John Reck event.listener->onAnimationFinished(event.animator.get()); 77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void handleMessage(const Message& message) { 8052244fff29042926e21fa897ef5ab11148e35299John Reck std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished); 8152244fff29042926e21fa897ef5ab11148e35299John Reck mOnFinishedEvents.clear(); 82e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 8552244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 88c25e506f7fc08790c0532f927f31310a2ca778b7John Reckclass RenderingException : public MessageHandler { 89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 90c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RenderingException(JavaVM* vm, const std::string& message) 91c25e506f7fc08790c0532f927f31310a2ca778b7John Reck : mVm(vm) 92c25e506f7fc08790c0532f927f31310a2ca778b7John Reck , mMessage(message) { 93c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 94c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 95c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void handleMessage(const Message&) { 96c25e506f7fc08790c0532f927f31310a2ca778b7John Reck throwException(mVm, mMessage); 97c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 98c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 99c25e506f7fc08790c0532f927f31310a2ca778b7John Reck static void throwException(JavaVM* vm, const std::string& message) { 100c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JNIEnv* env = getenv(vm); 101c25e506f7fc08790c0532f927f31310a2ca778b7John Reck jniThrowException(env, "java/lang/IllegalStateException", message.c_str()); 102c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 103c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 104c25e506f7fc08790c0532f927f31310a2ca778b7John Reckprivate: 105c25e506f7fc08790c0532f927f31310a2ca778b7John Reck JavaVM* mVm; 106c25e506f7fc08790c0532f927f31310a2ca778b7John Reck std::string mMessage; 107c25e506f7fc08790c0532f927f31310a2ca778b7John Reck}; 108c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 109119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass RootRenderNode : public RenderNode, ErrorHandler { 110c25e506f7fc08790c0532f927f31310a2ca778b7John Reckpublic: 111c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode(JNIEnv* env) : RenderNode() { 112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mLooper = Looper::getForThread(); 113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck LOG_ALWAYS_FATAL_IF(!mLooper.get(), 114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck "Must create RootRenderNode on a thread with a looper!"); 115c25e506f7fc08790c0532f927f31310a2ca778b7John Reck env->GetJavaVM(&mVm); 116e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 117e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual ~RootRenderNode() {} 119e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 120c25e506f7fc08790c0532f927f31310a2ca778b7John Reck virtual void onError(const std::string& message) { 121c25e506f7fc08790c0532f927f31310a2ca778b7John Reck mLooper->sendMessage(new RenderingException(mVm, message), 0); 122c25e506f7fc08790c0532f927f31310a2ca778b7John Reck } 123c25e506f7fc08790c0532f927f31310a2ca778b7John Reck 124e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void prepareTree(TreeInfo& info) { 125c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = this; 126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck RenderNode::prepareTree(info); 127c25e506f7fc08790c0532f927f31310a2ca778b7John Reck info.errorHandler = NULL; 128119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 129119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 130119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void sendMessage(const sp<MessageHandler>& handler) { 131119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mLooper->sendMessage(handler, 0); 132119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 133119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 134119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void attachAnimatingNode(RenderNode* animatingNode) { 135119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.push_back(animatingNode); 136119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 137119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 138119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck void doAttachAnimatingNodes(AnimationContext* context) { 139119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck for (size_t i = 0; i < mPendingAnimatingRenderNodes.size(); i++) { 140119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* node = mPendingAnimatingRenderNodes[i].get(); 141119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck context->addAnimatingRenderNode(*node); 142119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 143119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mPendingAnimatingRenderNodes.clear(); 144119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 145119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 146119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 147119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<Looper> mLooper; 148119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck JavaVM* mVm; 149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck std::vector< sp<RenderNode> > mPendingAnimatingRenderNodes; 150119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 151119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 152119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass AnimationContextBridge : public AnimationContext { 153119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 154119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContextBridge(renderthread::TimeLord& clock, RootRenderNode* rootNode) 155119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck : AnimationContext(clock), mRootNode(rootNode) { 156119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 157119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 158119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual ~AnimationContextBridge() {} 159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 160119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Marks the start of a frame, which will update the frame time and move all 161119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // next frame animations into the current frame 162ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck virtual void startFrame(TreeInfo::TraversalMode mode) { 163ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck if (mode == TreeInfo::MODE_FULL) { 164ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck mRootNode->doAttachAnimatingNodes(this); 165ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck } 166ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck AnimationContext::startFrame(mode); 167119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 168119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 169119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck // Runs any animations still left in mCurrentFrameAnimations 170119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void runRemainingAnimations(TreeInfo& info) { 171119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck AnimationContext::runRemainingAnimations(info); 172e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck } 174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 175119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) { 176119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck OnFinishedEvent event(animator, listener); 177119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck mOnFinishedEvents.push_back(event); 178119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 179119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 180e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck virtual void destroy() { 181e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck AnimationContext::destroy(); 182e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck postOnFinishedEvents(); 183e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 184e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 185e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprivate: 186119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck sp<RootRenderNode> mRootNode; 18752244fff29042926e21fa897ef5ab11148e35299John Reck std::vector<OnFinishedEvent> mOnFinishedEvents; 188e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck 189e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck void postOnFinishedEvents() { 190e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck if (mOnFinishedEvents.size()) { 191e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck sp<InvokeAnimationListeners> message 192e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck = new InvokeAnimationListeners(mOnFinishedEvents); 193e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck mRootNode->sendMessage(message); 194e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 195e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck } 196119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck}; 197119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 198119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass ContextFactoryImpl : public IContextFactory { 199119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckpublic: 200119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl(RootRenderNode* rootNode) : mRootNode(rootNode) {} 201119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 202119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) { 203119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return new AnimationContextBridge(clock, mRootNode); 204119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck } 205119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 206119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckprivate: 207119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* mRootNode; 208e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 209e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 21066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz, 2113b20251a355c88193c439f928a84ae69483fb488John Reck jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) { 21266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer); 21366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck jsize len = env->GetArrayLength(atlasMapArray); 21466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (len <= 0) { 21566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck ALOGW("Failed to initialize atlas, invalid map length: %d", len); 21666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck return; 21766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 21866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck int64_t* map = new int64_t[len]; 21966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck env->GetLongArrayRegion(atlasMapArray, 0, len, map); 22066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 2213b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2223b20251a355c88193c439f928a84ae69483fb488John Reck proxy->setTextureAtlas(buffer, map, len); 2234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 225edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, jobject clazz, 226edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck jlong proxyPtr, jint fd) { 227edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 228edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck proxy->setProcessStatsBuffer(fd); 229edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck} 230edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 231e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { 232c25e506f7fc08790c0532f927f31310a2ca778b7John Reck RootRenderNode* node = new RootRenderNode(env); 233e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->incStrong(0); 234e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck node->setName("RootRenderNode"); 235e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return reinterpret_cast<jlong>(node); 236e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} 237e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 2384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz, 239e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck jboolean translucent, jlong rootRenderNodePtr) { 240119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootRenderNodePtr); 241119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck ContextFactoryImpl factory(rootRenderNode); 242119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck return (jlong) new RenderProxy(translucent, rootRenderNode, &factory); 2434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz, 2464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 24719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck delete proxy; 2494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 251e4280baaa709c74d86cf6a389a4674ca665f5af6John Reckstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, 252e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck jlong proxyPtr) { 253e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 254e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck return proxy->loadSystemProperties(); 255e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck} 256e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck 257b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reckstatic void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz, 258b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck jlong proxyPtr, jstring jname) { 259b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 260b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck const char* name = env->GetStringUTFChars(jname, NULL); 261b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck proxy->setName(name); 262b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck env->ReleaseStringUTFChars(jname, name); 263b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck} 264b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck 2654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, 2664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 26719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface); 269f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck return proxy->initialize(window); 2704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, 2734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr, jobject jsurface) { 27419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 2754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck sp<ANativeWindow> window; 2764f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (jsurface) { 2774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 2784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 279f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck proxy->updateSurface(window); 280f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck} 281f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 28201a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reckstatic jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, 283f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck jlong proxyPtr, jobject jsurface) { 284f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 285f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck sp<ANativeWindow> window; 286f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (jsurface) { 287f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck window = android_view_Surface_getNativeWindow(env, jsurface); 288f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 28901a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck return proxy->pauseSurface(window); 2904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 292797b95b26bbb7557678af78b9a2a61830158920fChris Craikstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, 29350210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette jint width, jint height, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha) { 29419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 29550210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setup(width, height, lightRadius, ambientShadowAlpha, spotShadowAlpha); 29650210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette} 29750210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette 29850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverettestatic void android_view_ThreadedRenderer_setLightCenter(JNIEnv* env, jobject clazz, 29950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette jlong proxyPtr, jfloat lightX, jfloat lightY, jfloat lightZ) { 30050210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 30150210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette proxy->setLightCenter((Vector3){lightX, lightY, lightZ}); 3024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 30463a06673253914510bbeebd500655008682dade1John Reckstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, 30563a06673253914510bbeebd500655008682dade1John Reck jlong proxyPtr, jboolean opaque) { 30663a06673253914510bbeebd500655008682dade1John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 30763a06673253914510bbeebd500655008682dade1John Reck proxy->setOpaque(opaque); 30863a06673253914510bbeebd500655008682dade1John Reck} 30963a06673253914510bbeebd500655008682dade1John Reck 310f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, 311ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck jlong proxyPtr, jlongArray frameInfo, jint frameInfoSize) { 312ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck LOG_ALWAYS_FATAL_IF(frameInfoSize != UI_THREAD_FRAME_INFO_SIZE, 313ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck "Mismatched size expectations, given %d expected %d", 314ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck frameInfoSize, UI_THREAD_FRAME_INFO_SIZE); 31519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 316ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck env->GetLongArrayRegion(frameInfo, 0, frameInfoSize, proxy->frameInfo()); 317ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck return proxy->syncAndDrawFrame(); 3184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 32017035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckstatic void android_view_ThreadedRenderer_destroy(JNIEnv* env, jobject clazz, 3214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck jlong proxyPtr) { 32219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 32317035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck proxy->destroy(); 3244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 3254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 326119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckstatic void android_view_ThreadedRenderer_registerAnimatingRenderNode(JNIEnv* env, jobject clazz, 327119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck jlong rootNodePtr, jlong animatingNodePtr) { 328119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RootRenderNode* rootRenderNode = reinterpret_cast<RootRenderNode*>(rootNodePtr); 329119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck RenderNode* animatingNode = reinterpret_cast<RenderNode*>(animatingNodePtr); 330119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck rootRenderNode->attachAnimatingNode(animatingNode); 331119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck} 332119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 3330d1f634f4b5e1bb37aa51777efb6a68619488d01John Reckstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz, 3343b20251a355c88193c439f928a84ae69483fb488John Reck jlong functorPtr, jboolean waitForCompletion) { 3350d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck Functor* functor = reinterpret_cast<Functor*>(functorPtr); 3363b20251a355c88193c439f928a84ae69483fb488John Reck RenderProxy::invokeFunctor(functor, waitForCompletion); 3370d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck} 3380d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 33919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz, 34019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr) { 34119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 34219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = proxy->createTextureLayer(); 34319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return reinterpret_cast<jlong>(layer); 34419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 34519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 3463e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reckstatic void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz, 3473e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck jlong proxyPtr, jlong nodePtr) { 3483e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 3493e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr); 3503e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck proxy->buildLayer(node); 3513e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck} 3523e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 35319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz, 3543731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck jlong proxyPtr, jlong layerPtr, jobject jbitmap) { 35519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 35619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 3573731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck SkBitmap bitmap; 3583731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap); 35919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return proxy->copyLayerInto(layer, bitmap); 36019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 36119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 362d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_pushLayerUpdate(JNIEnv* env, jobject clazz, 36319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck jlong proxyPtr, jlong layerPtr) { 36419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 36519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 366d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->pushLayerUpdate(layer); 367d72e0a339b54af0c4e731513bbad120dff694723John Reck} 368d72e0a339b54af0c4e731513bbad120dff694723John Reck 369d72e0a339b54af0c4e731513bbad120dff694723John Reckstatic void android_view_ThreadedRenderer_cancelLayerUpdate(JNIEnv* env, jobject clazz, 370d72e0a339b54af0c4e731513bbad120dff694723John Reck jlong proxyPtr, jlong layerPtr) { 371d72e0a339b54af0c4e731513bbad120dff694723John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 372d72e0a339b54af0c4e731513bbad120dff694723John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 373d72e0a339b54af0c4e731513bbad120dff694723John Reck proxy->cancelLayerUpdate(layer); 37419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 37519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 376918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reckstatic void android_view_ThreadedRenderer_detachSurfaceTexture(JNIEnv* env, jobject clazz, 377918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck jlong proxyPtr, jlong layerPtr) { 378918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 379918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr); 380918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck proxy->detachSurfaceTexture(layer); 381918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck} 382918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck 383f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_destroyHardwareResources(JNIEnv* env, jobject clazz, 384f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 385e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 386f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->destroyHardwareResources(); 387f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 388f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 389f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_trimMemory(JNIEnv* env, jobject clazz, 390f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jint level) { 391f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy::trimMemory(level); 392e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck} 393e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 3942507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craikstatic void android_view_ThreadedRenderer_overrideProperty(JNIEnv* env, jobject clazz, 3952507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik jstring name, jstring value) { 3962507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik const char* nameCharArray = env->GetStringUTFChars(name, NULL); 3972507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik const char* valueCharArray = env->GetStringUTFChars(value, NULL); 3982507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik RenderProxy::overrideProperty(nameCharArray, valueCharArray); 3992507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik env->ReleaseStringUTFChars(name, nameCharArray); 4002507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik env->ReleaseStringUTFChars(name, valueCharArray); 4012507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik} 4022507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik 40328ad7b52e038ef0cdd89f753d9839444a434b299John Reckstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz, 40428ad7b52e038ef0cdd89f753d9839444a434b299John Reck jlong proxyPtr) { 40528ad7b52e038ef0cdd89f753d9839444a434b299John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 40628ad7b52e038ef0cdd89f753d9839444a434b299John Reck proxy->fence(); 40728ad7b52e038ef0cdd89f753d9839444a434b299John Reck} 40828ad7b52e038ef0cdd89f753d9839444a434b299John Reck 409f47a594f5250b1914c36423ee6b371f0b8db09d0John Reckstatic void android_view_ThreadedRenderer_stopDrawing(JNIEnv* env, jobject clazz, 410f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck jlong proxyPtr) { 411f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 412f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck proxy->stopDrawing(); 413f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck} 414f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 415a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reckstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz, 416a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck jlong proxyPtr) { 417a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 418a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck proxy->notifyFramePending(); 419a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck} 420a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 421e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reckstatic void android_view_ThreadedRenderer_serializeDisplayListTree(JNIEnv* env, jobject clazz, 422e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck jlong proxyPtr) { 423e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 424e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck proxy->serializeDisplayListTree(); 425e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck} 426e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck 427fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckstatic void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz, 428ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck jlong proxyPtr, jobject javaFileDescriptor, jint dumpFlags) { 429fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 430fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 431ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck proxy->dumpProfileInfo(fd, dumpFlags); 432fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck} 433fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 434edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstatic void android_view_ThreadedRenderer_dumpProfileData(JNIEnv* env, jobject clazz, 435edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck jbyteArray jdata, jobject javaFileDescriptor) { 436edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); 437edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck ScopedByteArrayRO buffer(env, jdata); 438edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck if (buffer.get()) { 439edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck JankTracker::dumpBuffer(buffer.get(), buffer.size(), fd); 440edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck } 441edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck} 442edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 443ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_addRenderNode(JNIEnv* env, jobject clazz, 444ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr, jboolean placeFront) { 445ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 446ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 447ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->addRenderNode(renderNode, placeFront); 448ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 449ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 450ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRenderer_removeRenderNode(JNIEnv* env, jobject clazz, 451ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr) { 452ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 453ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 454ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->removeRenderNode(renderNode); 455ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 456ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 457ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhnestatic void android_view_ThreadedRendererd_drawRenderNode(JNIEnv* env, jobject clazz, 458ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jlong proxyPtr, jlong renderNodePtr) { 459ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 460ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); 461ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne proxy->drawRenderNode(renderNode); 462ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 463ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne 464b816087962aba0019b022303330f03b897b580edSkuhnestatic void android_view_ThreadedRenderer_setContentDrawBounds(JNIEnv* env, 465ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne jobject clazz, jlong proxyPtr, jint left, jint top, jint right, jint bottom) { 466ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); 467b816087962aba0019b022303330f03b897b580edSkuhne proxy->setContentDrawBounds(left, top, right, bottom); 468ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne} 469edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck 470cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 47184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// Shaders 47284a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 47384a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 47484a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reckstatic void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz, 47584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck jstring diskCachePath) { 47684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL); 47784a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck egl_cache_t::get()->setCacheFilename(cacheArray); 47884a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck env->ReleaseStringUTFChars(diskCachePath, cacheArray); 47984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck} 48084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 48184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck// ---------------------------------------------------------------------------- 482cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// JNI Glue 483cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck// ---------------------------------------------------------------------------- 484cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 485cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckconst char* const kClassPathName = "android/view/ThreadedRenderer"; 486cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 48776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 4883b20251a355c88193c439f928a84ae69483fb488John Reck { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas }, 489edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer }, 490e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, 491e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, 4924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, 493e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, 494b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName }, 4954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, 4964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, 49701a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, 49850210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup }, 49950210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette { "nSetLightCenter", "(JFFF)V", (void*) android_view_ThreadedRenderer_setLightCenter }, 50063a06673253914510bbeebd500655008682dade1John Reck { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, 501ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck { "nSyncAndDrawFrame", "(J[JI)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, 50217035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy }, 503119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode }, 5043b20251a355c88193c439f928a84ae69483fb488John Reck { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, 50519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, 5063e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer }, 5073731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck { "nCopyLayerInto", "(JJLandroid/graphics/Bitmap;)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, 508d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate }, 509d72e0a339b54af0c4e731513bbad120dff694723John Reck { "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate }, 510918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck { "nDetachSurfaceTexture", "(JJ)V", (void*) android_view_ThreadedRenderer_detachSurfaceTexture }, 511f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nDestroyHardwareResources", "(J)V", (void*) android_view_ThreadedRenderer_destroyHardwareResources }, 512f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nTrimMemory", "(I)V", (void*) android_view_ThreadedRenderer_trimMemory }, 5132507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik { "nOverrideProperty", "(Ljava/lang/String;Ljava/lang/String;)V", (void*) android_view_ThreadedRenderer_overrideProperty }, 51428ad7b52e038ef0cdd89f753d9839444a434b299John Reck { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence }, 515f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck { "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing }, 516a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending }, 517e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck { "nSerializeDisplayListTree", "(J)V", (void*) android_view_ThreadedRenderer_serializeDisplayListTree }, 518ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck { "nDumpProfileInfo", "(JLjava/io/FileDescriptor;I)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo }, 519edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck { "nDumpProfileData", "([BLjava/io/FileDescriptor;)V", (void*) android_view_ThreadedRenderer_dumpProfileData }, 52084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck { "setupShadersDiskCache", "(Ljava/lang/String;)V", 52184a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck (void*) android_view_ThreadedRenderer_setupShadersDiskCache }, 522ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nAddRenderNode", "(JJZ)V", (void*) android_view_ThreadedRenderer_addRenderNode}, 523ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode}, 524ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne { "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode}, 525b816087962aba0019b022303330f03b897b580edSkuhne { "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds}, 526cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 527cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 528cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckint register_android_view_ThreadedRenderer(JNIEnv* env) { 529ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); 530cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 531cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 532cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; // namespace android 533