1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License.
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License.
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
17a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy#define LOG_TAG "OpenGLRenderer"
18a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy
19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include "jni.h"
20e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy#include "GraphicsJNI.h"
21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <nativehelper/JNIHelp.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy
23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <android_runtime/AndroidRuntime.h>
246554943a1dd6854c0f4976900956e556767b49e1Romain Guy
25cd1c3eba69d044b551cededad75474038f919890John Reck#include <utils/Looper.h>
266554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <cutils/properties.h>
278f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy
28ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h>
29079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h>
30e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
319d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <Rect.h>
32113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include <RenderNode.h>
3352244fff29042926e21fa897ef5ab11148e35299John Reck#include <CanvasProperty.h>
34dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <hwui/Canvas.h>
35dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include <hwui/Paint.h>
360e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck#include <renderthread/RenderProxy.h>
3785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
38987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
39987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
429d5316e3f56d138504565ff311145ac01621dff4Romain Guyusing namespace uirenderer;
439d5316e3f56d138504565ff311145ac01621dff4Romain Guy
44cd1c3eba69d044b551cededad75474038f919890John ReckjmethodID gRunnableMethodId;
45cd1c3eba69d044b551cededad75474038f919890John Reck
46cd1c3eba69d044b551cededad75474038f919890John Reckstatic JNIEnv* jnienv(JavaVM* vm) {
47cd1c3eba69d044b551cededad75474038f919890John Reck    JNIEnv* env;
48cd1c3eba69d044b551cededad75474038f919890John Reck    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
49cd1c3eba69d044b551cededad75474038f919890John Reck        LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm);
50cd1c3eba69d044b551cededad75474038f919890John Reck    }
51cd1c3eba69d044b551cededad75474038f919890John Reck    return env;
52cd1c3eba69d044b551cededad75474038f919890John Reck}
53cd1c3eba69d044b551cededad75474038f919890John Reck
54cd1c3eba69d044b551cededad75474038f919890John Reckclass InvokeRunnableMessage : public MessageHandler {
55cd1c3eba69d044b551cededad75474038f919890John Reckpublic:
56cd1c3eba69d044b551cededad75474038f919890John Reck    InvokeRunnableMessage(JNIEnv* env, jobject runnable) {
57cd1c3eba69d044b551cededad75474038f919890John Reck        mRunnable = env->NewGlobalRef(runnable);
58cd1c3eba69d044b551cededad75474038f919890John Reck        env->GetJavaVM(&mVm);
59cd1c3eba69d044b551cededad75474038f919890John Reck    }
60cd1c3eba69d044b551cededad75474038f919890John Reck
61cd1c3eba69d044b551cededad75474038f919890John Reck    virtual ~InvokeRunnableMessage() {
62cd1c3eba69d044b551cededad75474038f919890John Reck        jnienv(mVm)->DeleteGlobalRef(mRunnable);
63cd1c3eba69d044b551cededad75474038f919890John Reck    }
64cd1c3eba69d044b551cededad75474038f919890John Reck
65cd1c3eba69d044b551cededad75474038f919890John Reck    virtual void handleMessage(const Message&) {
66cd1c3eba69d044b551cededad75474038f919890John Reck        jnienv(mVm)->CallVoidMethod(mRunnable, gRunnableMethodId);
67cd1c3eba69d044b551cededad75474038f919890John Reck    }
68cd1c3eba69d044b551cededad75474038f919890John Reck
69cd1c3eba69d044b551cededad75474038f919890John Reckprivate:
70cd1c3eba69d044b551cededad75474038f919890John Reck    JavaVM* mVm;
71cd1c3eba69d044b551cededad75474038f919890John Reck    jobject mRunnable;
72cd1c3eba69d044b551cededad75474038f919890John Reck};
73cd1c3eba69d044b551cededad75474038f919890John Reck
74cd1c3eba69d044b551cededad75474038f919890John Reckclass GlFunctorReleasedCallbackBridge : public GlFunctorLifecycleListener {
75cd1c3eba69d044b551cededad75474038f919890John Reckpublic:
76cd1c3eba69d044b551cededad75474038f919890John Reck    GlFunctorReleasedCallbackBridge(JNIEnv* env, jobject javaCallback) {
77cd1c3eba69d044b551cededad75474038f919890John Reck        mLooper = Looper::getForThread();
78cd1c3eba69d044b551cededad75474038f919890John Reck        mMessage = new InvokeRunnableMessage(env, javaCallback);
79cd1c3eba69d044b551cededad75474038f919890John Reck    }
80cd1c3eba69d044b551cededad75474038f919890John Reck
81cd1c3eba69d044b551cededad75474038f919890John Reck    virtual void onGlFunctorReleased(Functor* functor) override {
82cd1c3eba69d044b551cededad75474038f919890John Reck        mLooper->sendMessage(mMessage, 0);
83cd1c3eba69d044b551cededad75474038f919890John Reck    }
84cd1c3eba69d044b551cededad75474038f919890John Reck
85cd1c3eba69d044b551cededad75474038f919890John Reckprivate:
86cd1c3eba69d044b551cededad75474038f919890John Reck    sp<Looper> mLooper;
87cd1c3eba69d044b551cededad75474038f919890John Reck    sp<InvokeRunnableMessage> mMessage;
88cd1c3eba69d044b551cededad75474038f919890John Reck};
89cd1c3eba69d044b551cededad75474038f919890John Reck
90e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
91fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik// ---------------- Regular JNI -----------------------------
92fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
93fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void
94fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
95fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
96fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
978afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik}
988afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
99fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
100fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik// ---------------- @FastNative -----------------------------
101530041d3191ce817832a0108514617768e43cda6Romain Guy
102c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
103cd1c3eba69d044b551cededad75474038f919890John Reck        jlong canvasPtr, jlong functorPtr, jobject releasedCallback) {
1046f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
1059f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
1064afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    sp<GlFunctorReleasedCallbackBridge> bridge;
1074afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    if (releasedCallback) {
1084afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck        bridge = new GlFunctorReleasedCallbackBridge(env, releasedCallback);
1094afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    }
110cd1c3eba69d044b551cededad75474038f919890John Reck    canvas->callDrawGLFunction(functor, bridge.get());
111daf98e941e140e8739458126640183b9f296a2abChet Haase}
112daf98e941e140e8739458126640183b9f296a2abChet Haase
1138f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
114fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik// ---------------- @CriticalNative -------------------------
115fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
116fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic jlong android_view_DisplayListCanvas_createDisplayListCanvas(jlong renderNodePtr,
117fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        jint width, jint height) {
118fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
119fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    return reinterpret_cast<jlong>(Canvas::create_recording_canvas(width, height, renderNode));
120fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik}
121fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
122fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void android_view_DisplayListCanvas_resetDisplayListCanvas(jlong canvasPtr,
123fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        jlong renderNodePtr, jint width, jint height) {
124fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
125fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
126fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    canvas->resetRecording(width, height, renderNode);
127fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik}
128fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik
129fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic jint android_view_DisplayListCanvas_getMaxTextureWidth() {
130c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    if (!Caches::hasInstance()) {
131c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot        android::uirenderer::renderthread::RenderProxy::staticFence();
132c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    }
133f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
134f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
135f61970fc79e9c5cf340fa942597628242361864aRomain Guy
136fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic jint android_view_DisplayListCanvas_getMaxTextureHeight() {
137c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    if (!Caches::hasInstance()) {
138c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot        android::uirenderer::renderthread::RenderProxy::staticFence();
139c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    }
140f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
141f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
142f61970fc79e9c5cf340fa942597628242361864aRomain Guy
143fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void android_view_DisplayListCanvas_insertReorderBarrier(jlong canvasPtr,
144fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        jboolean reorderEnable) {
1456f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
146fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    canvas->insertReorderBarrier(reorderEnable);
147072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi}
148072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi
149fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic jlong android_view_DisplayListCanvas_finishRecording(jlong canvasPtr) {
1506f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
15186c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    return reinterpret_cast<jlong>(canvas->finishRecording());
152162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
153162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
154fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void android_view_DisplayListCanvas_drawRenderNode(jlong canvasPtr, jlong renderNodePtr) {
1556f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
156a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
15786c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->drawRenderNode(renderNode);
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
160fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void android_view_DisplayListCanvas_drawLayer(jlong canvasPtr, jlong layerPtr) {
1616f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
16212f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
16386c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->drawLayer(layer);
1646c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
1656c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
166fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void android_view_DisplayListCanvas_drawRoundRectProps(jlong canvasPtr,
167fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr, jlong bottomPropPtr,
168fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
169fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
170fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
171fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
172fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
173fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
174fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
175fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
176fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
177fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    canvas->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
178fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik}
1799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
180fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craikstatic void android_view_DisplayListCanvas_drawCircleProps(jlong canvasPtr,
181fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
182fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
183fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
184fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
185fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
186fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
187fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    canvas->drawCircle(xProp, yProp, radiusProp, paintProp);
1889c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
1899c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
1909c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
191e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
192e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
193e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
194c9070ebd13263a341511cf779087a46750021196Chris Craikconst char* const kClassPathName = "android/view/DisplayListCanvas";
195e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
196e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
19761c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
1985cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    // ------------ @FastNative ------------------
1995cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck
2005cb74bca88268a8b9025be2cce81e1b4f967d19dJohn Reck    { "nCallDrawGLFunction", "(JJLjava/lang/Runnable;)V",
201cd1c3eba69d044b551cededad75474038f919890John Reck            (void*) android_view_DisplayListCanvas_callDrawGLFunction },
2027d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
203fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    // ------------ @CriticalNative --------------
204c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev    { "nCreateDisplayListCanvas", "(JII)J",     (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
205fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nResetDisplayListCanvas",  "(JJII)V",    (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
206fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nGetMaximumTextureWidth",  "()I",        (void*) android_view_DisplayListCanvas_getMaxTextureWidth },
207fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nGetMaximumTextureHeight", "()I",        (void*) android_view_DisplayListCanvas_getMaxTextureHeight },
208fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nInsertReorderBarrier",    "(JZ)V",      (void*) android_view_DisplayListCanvas_insertReorderBarrier },
209fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nFinishRecording",         "(J)J",       (void*) android_view_DisplayListCanvas_finishRecording },
210fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nDrawRenderNode",          "(JJ)V",      (void*) android_view_DisplayListCanvas_drawRenderNode },
211fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nDrawLayer",               "(JJ)V",      (void*) android_view_DisplayListCanvas_drawLayer },
212fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nDrawCircle",              "(JJJJJ)V",   (void*) android_view_DisplayListCanvas_drawCircleProps },
213fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nDrawRoundRect",           "(JJJJJJJJ)V",(void*) android_view_DisplayListCanvas_drawRoundRectProps },
214e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
215e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2169c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
217fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik        // ------------ Regular JNI ------------------
218fc29424a3c6c710c0b27d5b59e115fbbb6365192Chris Craik    { "nDumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
2199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
2209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
2219c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
222c9070ebd13263a341511cf779087a46750021196Chris Craikint register_android_view_DisplayListCanvas(JNIEnv* env) {
223cd1c3eba69d044b551cededad75474038f919890John Reck    jclass runnableClass = FindClassOrDie(env, "java/lang/Runnable");
224cd1c3eba69d044b551cededad75474038f919890John Reck    gRunnableMethodId = GetMethodIDOrDie(env, runnableClass, "run", "()V");
225cd1c3eba69d044b551cededad75474038f919890John Reck
226987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
227e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
228e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2296be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
230ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, "android/app/ActivityThread",
2319c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
2329c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
2339c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
234e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
235