android_view_ThreadedRenderer.cpp revision e1628b7c6fc3822fa83cf02028ce8ad67abb0afe
14b3de47071d875faaa7d419d050a464b09538797Jason Sams/*
24b3de47071d875faaa7d419d050a464b09538797Jason Sams * Copyright (C) 2010 The Android Open Source Project
34b3de47071d875faaa7d419d050a464b09538797Jason Sams *
44b3de47071d875faaa7d419d050a464b09538797Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
54b3de47071d875faaa7d419d050a464b09538797Jason Sams * you may not use this file except in compliance with the License.
64b3de47071d875faaa7d419d050a464b09538797Jason Sams * You may obtain a copy of the License at
74b3de47071d875faaa7d419d050a464b09538797Jason Sams *
84b3de47071d875faaa7d419d050a464b09538797Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
94b3de47071d875faaa7d419d050a464b09538797Jason Sams *
104b3de47071d875faaa7d419d050a464b09538797Jason Sams * Unless required by applicable law or agreed to in writing, software
114b3de47071d875faaa7d419d050a464b09538797Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
124b3de47071d875faaa7d419d050a464b09538797Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b3de47071d875faaa7d419d050a464b09538797Jason Sams * See the License for the specific language governing permissions and
144b3de47071d875faaa7d419d050a464b09538797Jason Sams * limitations under the License.
154b3de47071d875faaa7d419d050a464b09538797Jason Sams */
164b3de47071d875faaa7d419d050a464b09538797Jason Sams
174b3de47071d875faaa7d419d050a464b09538797Jason Sams#define LOG_TAG "ThreadedRenderer"
184b3de47071d875faaa7d419d050a464b09538797Jason Sams
194b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <algorithm>
204b3de47071d875faaa7d419d050a464b09538797Jason Sams
214b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "jni.h"
224b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <nativehelper/JNIHelp.h>
234b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <android_runtime/AndroidRuntime.h>
244b3de47071d875faaa7d419d050a464b09538797Jason Sams
254b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <utils/StrongPointer.h>
264b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <android_runtime/android_view_Surface.h>
274b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <system/window.h>
284b3de47071d875faaa7d419d050a464b09538797Jason Sams
294b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "android_view_GraphicBuffer.h"
304b3de47071d875faaa7d419d050a464b09538797Jason Sams
314b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <Animator.h>
324b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <RenderNode.h>
334b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <renderthread/CanvasContext.h>
344b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <renderthread/RenderProxy.h>
354b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <renderthread/RenderTask.h>
364b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <renderthread/RenderThread.h>
374b3de47071d875faaa7d419d050a464b09538797Jason Sams#include <Vector.h>
384b3de47071d875faaa7d419d050a464b09538797Jason Sams
394b3de47071d875faaa7d419d050a464b09538797Jason Samsnamespace android {
40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifdef USE_OPENGL_RENDERER
42a94952436aeb251f587c1bccdf94c7f75285dfe2Alex Sakhartchouk
434b3de47071d875faaa7d419d050a464b09538797Jason Samsusing namespace android::uirenderer;
444b3de47071d875faaa7d419d050a464b09538797Jason Samsusing namespace android::uirenderer::renderthread;
454b3de47071d875faaa7d419d050a464b09538797Jason Sams
464b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jmethodID gRunnableMethod;
474b3de47071d875faaa7d419d050a464b09538797Jason Sams
484b3de47071d875faaa7d419d050a464b09538797Jason Samsclass JavaTask : public RenderTask {
494b3de47071d875faaa7d419d050a464b09538797Jason Samspublic:
504b3de47071d875faaa7d419d050a464b09538797Jason Sams    JavaTask(JNIEnv* env, jobject jrunnable) {
514b3de47071d875faaa7d419d050a464b09538797Jason Sams        env->GetJavaVM(&mVm);
524b3de47071d875faaa7d419d050a464b09538797Jason Sams        mRunnable = env->NewGlobalRef(jrunnable);
534b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
544b3de47071d875faaa7d419d050a464b09538797Jason Sams
554b3de47071d875faaa7d419d050a464b09538797Jason Sams    virtual void run() {
564b3de47071d875faaa7d419d050a464b09538797Jason Sams        env()->CallVoidMethod(mRunnable, gRunnableMethod);
574b3de47071d875faaa7d419d050a464b09538797Jason Sams        env()->DeleteGlobalRef(mRunnable);
584b3de47071d875faaa7d419d050a464b09538797Jason Sams        delete this;
594b3de47071d875faaa7d419d050a464b09538797Jason Sams    };
604b3de47071d875faaa7d419d050a464b09538797Jason Sams
614b3de47071d875faaa7d419d050a464b09538797Jason Samsprivate:
624b3de47071d875faaa7d419d050a464b09538797Jason Sams    JNIEnv* env() {
634b3de47071d875faaa7d419d050a464b09538797Jason Sams        JNIEnv* env;
644b3de47071d875faaa7d419d050a464b09538797Jason Sams        if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
654b3de47071d875faaa7d419d050a464b09538797Jason Sams            return 0;
664b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
674b3de47071d875faaa7d419d050a464b09538797Jason Sams        return env;
684b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
694b3de47071d875faaa7d419d050a464b09538797Jason Sams
704b3de47071d875faaa7d419d050a464b09538797Jason Sams    JavaVM* mVm;
714b3de47071d875faaa7d419d050a464b09538797Jason Sams    jobject mRunnable;
724b3de47071d875faaa7d419d050a464b09538797Jason Sams};
734b3de47071d875faaa7d419d050a464b09538797Jason Sams
744b3de47071d875faaa7d419d050a464b09538797Jason Samsclass SetAtlasTask : public RenderTask {
754b3de47071d875faaa7d419d050a464b09538797Jason Samspublic:
764b3de47071d875faaa7d419d050a464b09538797Jason Sams    SetAtlasTask(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size)
774b3de47071d875faaa7d419d050a464b09538797Jason Sams            : mBuffer(buffer)
784b3de47071d875faaa7d419d050a464b09538797Jason Sams            , mMap(map)
794b3de47071d875faaa7d419d050a464b09538797Jason Sams            , mMapSize(size) {
804b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
814b3de47071d875faaa7d419d050a464b09538797Jason Sams
824b3de47071d875faaa7d419d050a464b09538797Jason Sams    virtual void run() {
834b3de47071d875faaa7d419d050a464b09538797Jason Sams        CanvasContext::setTextureAtlas(mBuffer, mMap, mMapSize);
844b3de47071d875faaa7d419d050a464b09538797Jason Sams        mMap = 0;
854b3de47071d875faaa7d419d050a464b09538797Jason Sams        delete this;
864b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
874b3de47071d875faaa7d419d050a464b09538797Jason Sams
884b3de47071d875faaa7d419d050a464b09538797Jason Samsprivate:
894b3de47071d875faaa7d419d050a464b09538797Jason Sams    sp<GraphicBuffer> mBuffer;
904b3de47071d875faaa7d419d050a464b09538797Jason Sams    int64_t* mMap;
914b3de47071d875faaa7d419d050a464b09538797Jason Sams    size_t mMapSize;
924b3de47071d875faaa7d419d050a464b09538797Jason Sams};
934b3de47071d875faaa7d419d050a464b09538797Jason Sams
944b3de47071d875faaa7d419d050a464b09538797Jason Samsclass OnFinishedEvent {
954b3de47071d875faaa7d419d050a464b09538797Jason Samspublic:
964b3de47071d875faaa7d419d050a464b09538797Jason Sams    OnFinishedEvent(BaseRenderNodeAnimator* animator, AnimationListener* listener)
974b3de47071d875faaa7d419d050a464b09538797Jason Sams            : animator(animator), listener(listener) {}
984b3de47071d875faaa7d419d050a464b09538797Jason Sams    sp<BaseRenderNodeAnimator> animator;
994b3de47071d875faaa7d419d050a464b09538797Jason Sams    sp<AnimationListener> listener;
1004b3de47071d875faaa7d419d050a464b09538797Jason Sams};
1014b3de47071d875faaa7d419d050a464b09538797Jason Sams
10267605d7185c384469952b10d75c3d201b19cc07fMathias Agopianclass InvokeAnimationListeners : public MessageHandler {
10367605d7185c384469952b10d75c3d201b19cc07fMathias Agopianpublic:
1044b3de47071d875faaa7d419d050a464b09538797Jason Sams    InvokeAnimationListeners(std::vector<OnFinishedEvent>& events) {
1054b3de47071d875faaa7d419d050a464b09538797Jason Sams        mOnFinishedEvents.swap(events);
1064b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1074b3de47071d875faaa7d419d050a464b09538797Jason Sams
1084b3de47071d875faaa7d419d050a464b09538797Jason Sams    static void callOnFinished(OnFinishedEvent& event) {
10987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        event.listener->onAnimationFinished(event.animator.get());
1104b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1114b3de47071d875faaa7d419d050a464b09538797Jason Sams
1124b3de47071d875faaa7d419d050a464b09538797Jason Sams    virtual void handleMessage(const Message& message) {
1134b3de47071d875faaa7d419d050a464b09538797Jason Sams        std::for_each(mOnFinishedEvents.begin(), mOnFinishedEvents.end(), callOnFinished);
1144b3de47071d875faaa7d419d050a464b09538797Jason Sams        mOnFinishedEvents.clear();
1154b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1164b3de47071d875faaa7d419d050a464b09538797Jason Sams
1174b3de47071d875faaa7d419d050a464b09538797Jason Samsprivate:
1184b3de47071d875faaa7d419d050a464b09538797Jason Sams    std::vector<OnFinishedEvent> mOnFinishedEvents;
1194b3de47071d875faaa7d419d050a464b09538797Jason Sams};
1204b3de47071d875faaa7d419d050a464b09538797Jason Sams
1214b3de47071d875faaa7d419d050a464b09538797Jason Samsclass RootRenderNode : public RenderNode, public AnimationHook {
1224b3de47071d875faaa7d419d050a464b09538797Jason Samspublic:
1234b3de47071d875faaa7d419d050a464b09538797Jason Sams    RootRenderNode() : RenderNode() {
1244b3de47071d875faaa7d419d050a464b09538797Jason Sams        mLooper = Looper::getForThread();
1254b3de47071d875faaa7d419d050a464b09538797Jason Sams        LOG_ALWAYS_FATAL_IF(!mLooper.get(),
1264b3de47071d875faaa7d419d050a464b09538797Jason Sams                "Must create RootRenderNode on a thread with a looper!");
1274b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
12887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
1294b3de47071d875faaa7d419d050a464b09538797Jason Sams    virtual ~RootRenderNode() {}
130a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    virtual void callOnFinished(BaseRenderNodeAnimator* animator, AnimationListener* listener) {
132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        OnFinishedEvent event(animator, listener);
133a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mOnFinishedEvents.push_back(event);
134a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
1354b3de47071d875faaa7d419d050a464b09538797Jason Sams
1364b3de47071d875faaa7d419d050a464b09538797Jason Sams    virtual void prepareTree(TreeInfo& info) {
1374b3de47071d875faaa7d419d050a464b09538797Jason Sams        info.animationHook = this;
1382382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RenderNode::prepareTree(info);
1392382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        info.animationHook = NULL;
1402382aba4a55c6ae74789c478eead8fbd96593321Jason Sams
1414b3de47071d875faaa7d419d050a464b09538797Jason Sams        // post all the finished stuff
1422382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        if (mOnFinishedEvents.size()) {
1434b3de47071d875faaa7d419d050a464b09538797Jason Sams            sp<InvokeAnimationListeners> message
1442382aba4a55c6ae74789c478eead8fbd96593321Jason Sams                    = new InvokeAnimationListeners(mOnFinishedEvents);
1454b3de47071d875faaa7d419d050a464b09538797Jason Sams            mLooper->sendMessage(message, 0);
1464b3de47071d875faaa7d419d050a464b09538797Jason Sams        }
1474b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1484b3de47071d875faaa7d419d050a464b09538797Jason Sams
1494b3de47071d875faaa7d419d050a464b09538797Jason Samsprivate:
1502382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    sp<Looper> mLooper;
1514b3de47071d875faaa7d419d050a464b09538797Jason Sams    std::vector<OnFinishedEvent> mOnFinishedEvents;
1524b3de47071d875faaa7d419d050a464b09538797Jason Sams};
1534b3de47071d875faaa7d419d050a464b09538797Jason Sams
1544b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz,
15587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        jobject graphicBuffer, jlongArray atlasMapArray) {
1564b3de47071d875faaa7d419d050a464b09538797Jason Sams    sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
1574b3de47071d875faaa7d419d050a464b09538797Jason Sams    jsize len = env->GetArrayLength(atlasMapArray);
1584b3de47071d875faaa7d419d050a464b09538797Jason Sams    if (len <= 0) {
1594b3de47071d875faaa7d419d050a464b09538797Jason Sams        ALOGW("Failed to initialize atlas, invalid map length: %d", len);
1604b3de47071d875faaa7d419d050a464b09538797Jason Sams        return;
1614b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
1624b3de47071d875faaa7d419d050a464b09538797Jason Sams    int64_t* map = new int64_t[len];
1634b3de47071d875faaa7d419d050a464b09538797Jason Sams    env->GetLongArrayRegion(atlasMapArray, 0, len, map);
1644b3de47071d875faaa7d419d050a464b09538797Jason Sams
1654b3de47071d875faaa7d419d050a464b09538797Jason Sams    SetAtlasTask* task = new SetAtlasTask(buffer, map, len);
1664b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderThread::getInstance().queue(task);
1674b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1684b3de47071d875faaa7d419d050a464b09538797Jason Sams
1694b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) {
1704b3de47071d875faaa7d419d050a464b09538797Jason Sams    RootRenderNode* node = new RootRenderNode();
1714b3de47071d875faaa7d419d050a464b09538797Jason Sams    node->incStrong(0);
17267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    node->setName("RootRenderNode");
17367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    return reinterpret_cast<jlong>(node);
17467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
17567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
17667605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject clazz,
17767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jboolean translucent, jlong rootRenderNodePtr) {
17867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderNode* rootRenderNode = reinterpret_cast<RenderNode*>(rootRenderNodePtr);
17967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    return (jlong) new RenderProxy(translucent, rootRenderNode);
18067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
18167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
18267605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
18367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr) {
18467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
18567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    delete proxy;
18667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
18767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
18867605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz,
18967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr, jlong frameIntervalNanos) {
1904b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1914b3de47071d875faaa7d419d050a464b09538797Jason Sams    proxy->setFrameInterval(frameIntervalNanos);
1924b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1934b3de47071d875faaa7d419d050a464b09538797Jason Sams
1944b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz,
1954b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr) {
1964b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
1974b3de47071d875faaa7d419d050a464b09538797Jason Sams    return proxy->loadSystemProperties();
1984b3de47071d875faaa7d419d050a464b09538797Jason Sams}
1994b3de47071d875faaa7d419d050a464b09538797Jason Sams
2004b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz,
2014b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr, jobject jsurface) {
2024b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2034b3de47071d875faaa7d419d050a464b09538797Jason Sams    sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface);
2044b3de47071d875faaa7d419d050a464b09538797Jason Sams    return proxy->initialize(window);
2054b3de47071d875faaa7d419d050a464b09538797Jason Sams}
2062382aba4a55c6ae74789c478eead8fbd96593321Jason Sams
2074b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz,
2084b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr, jobject jsurface) {
2094b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2102382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    sp<ANativeWindow> window;
2112382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    if (jsurface) {
2124b3de47071d875faaa7d419d050a464b09538797Jason Sams        window = android_view_Surface_getNativeWindow(env, jsurface);
2134b3de47071d875faaa7d419d050a464b09538797Jason Sams    }
21467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    proxy->updateSurface(window);
21567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
21667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2172382aba4a55c6ae74789c478eead8fbd96593321Jason Samsstatic void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz,
21867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr, jobject jsurface) {
21967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
22067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    sp<ANativeWindow> window;
22167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    if (jsurface) {
22267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        window = android_view_Surface_getNativeWindow(env, jsurface);
22367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    }
2242382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    proxy->pauseSurface(window);
22567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
22667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
22767605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr,
22867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jint width, jint height,
22967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jfloat lightX, jfloat lightY, jfloat lightZ, jfloat lightRadius) {
23067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
23167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    proxy->setup(width, height, Vector3(lightX, lightY, lightZ), lightRadius);
23267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
23367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
23467605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz,
23567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr, jboolean opaque) {
23667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
23767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    proxy->setOpaque(opaque);
23867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
23967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
24067605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz,
24167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr, jlong frameTimeNanos, jint dirtyLeft, jint dirtyTop,
24267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jint dirtyRight, jint dirtyBottom) {
24367605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
24467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    return proxy->syncAndDrawFrame(frameTimeNanos, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom);
24567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
24667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
24767605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz,
24867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr) {
24967605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
25067605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    proxy->destroyCanvasAndSurface();
25167605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
25267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
25367605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
25467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian        jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) {
25567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
25667605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
25767605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    proxy->invokeFunctor(functor, waitForCompletion);
25867605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
2594b3de47071d875faaa7d419d050a464b09538797Jason Sams
26067605d7185c384469952b10d75c3d201b19cc07fMathias Agopianstatic void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
2614b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr, jobject jrunnable) {
26267605d7185c384469952b10d75c3d201b19cc07fMathias Agopian    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2634b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderTask* task = new JavaTask(env, jrunnable);
2649db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines    proxy->runWithGlContext(task);
2654b3de47071d875faaa7d419d050a464b09538797Jason Sams}
2669db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines
2674b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
2684b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr, jint width, jint height) {
2692382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2704b3de47071d875faaa7d419d050a464b09538797Jason Sams    DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
2714b3de47071d875faaa7d419d050a464b09538797Jason Sams    return reinterpret_cast<jlong>(layer);
2724b3de47071d875faaa7d419d050a464b09538797Jason Sams}
2734b3de47071d875faaa7d419d050a464b09538797Jason Sams
2744b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
2752382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        jlong proxyPtr) {
2764b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2774b3de47071d875faaa7d419d050a464b09538797Jason Sams    DeferredLayerUpdater* layer = proxy->createTextureLayer();
2784b3de47071d875faaa7d419d050a464b09538797Jason Sams    return reinterpret_cast<jlong>(layer);
2794b3de47071d875faaa7d419d050a464b09538797Jason Sams}
2804b3de47071d875faaa7d419d050a464b09538797Jason Sams
2814b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
2822382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
2834b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2844b3de47071d875faaa7d419d050a464b09538797Jason Sams    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
2854b3de47071d875faaa7d419d050a464b09538797Jason Sams    SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);
2864b3de47071d875faaa7d419d050a464b09538797Jason Sams    return proxy->copyLayerInto(layer, bitmap);
2874b3de47071d875faaa7d419d050a464b09538797Jason Sams}
2884b3de47071d875faaa7d419d050a464b09538797Jason Sams
2892382aba4a55c6ae74789c478eead8fbd96593321Jason Samsstatic void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject clazz,
2904b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr, jlong layerPtr) {
2914b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2924b3de47071d875faaa7d419d050a464b09538797Jason Sams    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
2932382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    proxy->destroyLayer(layer);
29467605d7185c384469952b10d75c3d201b19cc07fMathias Agopian}
29567605d7185c384469952b10d75c3d201b19cc07fMathias Agopian
2964b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void android_view_ThreadedRenderer_flushCaches(JNIEnv* env, jobject clazz,
2974b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr, jint flushMode) {
2984b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
2994b3de47071d875faaa7d419d050a464b09538797Jason Sams    proxy->flushCaches(static_cast<Caches::FlushMode>(flushMode));
3002382aba4a55c6ae74789c478eead8fbd96593321Jason Sams}
3014b3de47071d875faaa7d419d050a464b09538797Jason Sams
3024b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz,
3034b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr) {
3044b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
3054b3de47071d875faaa7d419d050a464b09538797Jason Sams    proxy->fence();
3064b3de47071d875faaa7d419d050a464b09538797Jason Sams}
3074b3de47071d875faaa7d419d050a464b09538797Jason Sams
3084b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobject clazz,
3094b3de47071d875faaa7d419d050a464b09538797Jason Sams        jlong proxyPtr) {
3104b3de47071d875faaa7d419d050a464b09538797Jason Sams    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
3114b3de47071d875faaa7d419d050a464b09538797Jason Sams    proxy->notifyFramePending();
3124b3de47071d875faaa7d419d050a464b09538797Jason Sams}
3134b3de47071d875faaa7d419d050a464b09538797Jason Sams
3144b3de47071d875faaa7d419d050a464b09538797Jason Sams#endif
3154b3de47071d875faaa7d419d050a464b09538797Jason Sams
3164b3de47071d875faaa7d419d050a464b09538797Jason Sams// ----------------------------------------------------------------------------
3174b3de47071d875faaa7d419d050a464b09538797Jason Sams// JNI Glue
3184b3de47071d875faaa7d419d050a464b09538797Jason Sams// ----------------------------------------------------------------------------
3194b3de47071d875faaa7d419d050a464b09538797Jason Sams
3204b3de47071d875faaa7d419d050a464b09538797Jason Samsconst char* const kClassPathName = "android/view/ThreadedRenderer";
3214b3de47071d875faaa7d419d050a464b09538797Jason Sams
3224b3de47071d875faaa7d419d050a464b09538797Jason Samsstatic JNINativeMethod gMethods[] = {
3234b3de47071d875faaa7d419d050a464b09538797Jason Sams#ifdef USE_OPENGL_RENDERER
3244b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nSetAtlas", "(Landroid/view/GraphicBuffer;[J)V",   (void*) android_view_ThreadedRenderer_setAtlas },
3254b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode },
3264b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy },
3274b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy },
3282382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval },
3294b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties },
3304b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize },
3314b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface },
3324b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface },
3334b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nSetup", "(JIIFFFF)V", (void*) android_view_ThreadedRenderer_setup },
3344b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque },
3354b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nSyncAndDrawFrame", "(JJIIII)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame },
3364b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface },
3374b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
3384b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
3394b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
3404b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
3414b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
3424b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer },
3434b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nFlushCaches", "(JI)V", (void*) android_view_ThreadedRenderer_flushCaches },
3444b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
3454b3de47071d875faaa7d419d050a464b09538797Jason Sams    { "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
3464b3de47071d875faaa7d419d050a464b09538797Jason Sams#endif
3474b3de47071d875faaa7d419d050a464b09538797Jason Sams};
3484b3de47071d875faaa7d419d050a464b09538797Jason Sams
3494b3de47071d875faaa7d419d050a464b09538797Jason Samsint register_android_view_ThreadedRenderer(JNIEnv* env) {
3504b3de47071d875faaa7d419d050a464b09538797Jason Sams#ifdef USE_OPENGL_RENDERER
3514b3de47071d875faaa7d419d050a464b09538797Jason Sams    jclass cls = env->FindClass("java/lang/Runnable");
3524b3de47071d875faaa7d419d050a464b09538797Jason Sams    gRunnableMethod = env->GetMethodID(cls, "run", "()V");
3534b3de47071d875faaa7d419d050a464b09538797Jason Sams    env->DeleteLocalRef(cls);
3544b3de47071d875faaa7d419d050a464b09538797Jason Sams#endif
3554b3de47071d875faaa7d419d050a464b09538797Jason Sams    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
3564b3de47071d875faaa7d419d050a464b09538797Jason Sams}
3579db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines
3589db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines}; // namespace android
3599db7fe256cf6b77eafafb42d024128701faee6bbStephen Hines