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
90244ada1d35419b7be9de0fc833bb03955b725ffaRomain Guy// ----------------------------------------------------------------------------
91e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// Setup
92e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
93e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
94c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
9586c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jlong canvasPtr, jboolean reorderEnable) {
966f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
9786c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->insertReorderBarrier(reorderEnable);
988afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik}
998afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
100530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
101530041d3191ce817832a0108514617768e43cda6Romain Guy// Functor
102530041d3191ce817832a0108514617768e43cda6Romain Guy// ----------------------------------------------------------------------------
103530041d3191ce817832a0108514617768e43cda6Romain Guy
104c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
105cd1c3eba69d044b551cededad75474038f919890John Reck        jlong canvasPtr, jlong functorPtr, jobject releasedCallback) {
1066f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
1079f66ea06ace80f60e049e3e7e778a8552cebe5b3Chris Craik    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
1084afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    sp<GlFunctorReleasedCallbackBridge> bridge;
1094afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    if (releasedCallback) {
1104afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck        bridge = new GlFunctorReleasedCallbackBridge(env, releasedCallback);
1114afbed15f3b4f88c0190bbb89deba7a6ceae2da7John Reck    }
112cd1c3eba69d044b551cededad75474038f919890John Reck    canvas->callDrawGLFunction(functor, bridge.get());
113daf98e941e140e8739458126640183b9f296a2abChet Haase}
114daf98e941e140e8739458126640183b9f296a2abChet Haase
1158f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
1168f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// Misc
1178f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy// ----------------------------------------------------------------------------
1188f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
119c9070ebd13263a341511cf779087a46750021196Chris Craikstatic jint android_view_DisplayListCanvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
120c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    if (!Caches::hasInstance()) {
121c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot        android::uirenderer::renderthread::RenderProxy::staticFence();
122c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    }
123f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
124f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
125f61970fc79e9c5cf340fa942597628242361864aRomain Guy
126c9070ebd13263a341511cf779087a46750021196Chris Craikstatic jint android_view_DisplayListCanvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
127c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    if (!Caches::hasInstance()) {
128c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot        android::uirenderer::renderthread::RenderProxy::staticFence();
129c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    }
130f61970fc79e9c5cf340fa942597628242361864aRomain Guy    return Caches::getInstance().maxTextureSize;
131f61970fc79e9c5cf340fa942597628242361864aRomain Guy}
132f61970fc79e9c5cf340fa942597628242361864aRomain Guy
133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
134bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy// Drawing
13585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy// ----------------------------------------------------------------------------
13685bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
137c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_drawRoundRectProps(JNIEnv* env, jobject clazz,
13886c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jlong canvasPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr,
139072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi        jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
1406f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
141072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
142072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
143072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
144072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
145072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
146072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
147072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
14886c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
149072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi}
150072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi
151c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_drawCircleProps(JNIEnv* env, jobject clazz,
15286c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jlong canvasPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
1536f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
15452244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
15552244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
15652244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
15752244fff29042926e21fa897ef5ab11148e35299John Reck    CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
15886c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->drawCircle(xProp, yProp, radiusProp, paintProp);
15952244fff29042926e21fa897ef5ab11148e35299John Reck}
16052244fff29042926e21fa897ef5ab11148e35299John Reck
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display lists
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// ----------------------------------------------------------------------------
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
165c9070ebd13263a341511cf779087a46750021196Chris Craikstatic jlong android_view_DisplayListCanvas_finishRecording(JNIEnv* env,
16686c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jobject clazz, jlong canvasPtr) {
1676f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
16886c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    return reinterpret_cast<jlong>(canvas->finishRecording());
169162a0217563f4665da6eb183dfce0fef740f641fJeff Brown}
170162a0217563f4665da6eb183dfce0fef740f641fJeff Brown
171cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenbergerstatic jlong android_view_DisplayListCanvas_createDisplayListCanvas(JNIEnv* env, jobject clazz,
172cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger        jint width, jint height) {
1736f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    return reinterpret_cast<jlong>(Canvas::create_recording_canvas(width, height));
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase
176cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenbergerstatic void android_view_DisplayListCanvas_resetDisplayListCanvas(JNIEnv* env, jobject clazz,
17786c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jlong canvasPtr, jint width, jint height) {
1786f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
1796f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    canvas->resetRecording(width, height);
180cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger}
181cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger
182cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger
183c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_drawRenderNode(JNIEnv* env,
18486c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jobject clazz, jlong canvasPtr, jlong renderNodePtr) {
1856f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
186a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
18786c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->drawRenderNode(renderNode);
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
1916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Layers
1926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// ----------------------------------------------------------------------------
1936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
194c9070ebd13263a341511cf779087a46750021196Chris Craikstatic void android_view_DisplayListCanvas_drawLayer(JNIEnv* env, jobject clazz,
19586c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik        jlong canvasPtr, jlong layerPtr) {
1966f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
19712f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
19886c03ca534755b2ed5fbbddabccb041f11eeacdfChris Craik    canvas->drawLayer(layer);
1996c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
2006c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
201163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
202163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// Common
203163935113919a184122b8b3bd672ef08c8df65dcRomain Guy// ----------------------------------------------------------------------------
204163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
205c9070ebd13263a341511cf779087a46750021196Chris Craikstatic jboolean android_view_DisplayListCanvas_isAvailable(JNIEnv* env, jobject clazz) {
206069fb3a03ad579ab3aa0ebcbe45a256f8185838fJohn Reck    char prop[PROPERTY_VALUE_MAX];
207069fb3a03ad579ab3aa0ebcbe45a256f8185838fJohn Reck    if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
208069fb3a03ad579ab3aa0ebcbe45a256f8185838fJohn Reck        // not in the emulator
209069fb3a03ad579ab3aa0ebcbe45a256f8185838fJohn Reck        return JNI_TRUE;
2104406345cd62d3687ce590c357854472f7f906e6cJesse Hall    }
211ac465cef41bbc618bc81bd331deb7c845af9b8ddNicolas Capens    // In the emulator this property will be set > 0 when OpenGL ES 2.0 is
212069fb3a03ad579ab3aa0ebcbe45a256f8185838fJohn Reck    // enabled, 0 otherwise. On old emulator versions it will be undefined.
213b73396b3f89de9620ab6e3d37b25f7451584789cbohu    property_get("qemu.gles", prop, "0");
214ac465cef41bbc618bc81bd331deb7c845af9b8ddNicolas Capens    return atoi(prop) > 0 ? JNI_TRUE : JNI_FALSE;
215163935113919a184122b8b3bd672ef08c8df65dcRomain Guy}
216163935113919a184122b8b3bd672ef08c8df65dcRomain Guy
217a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy// ----------------------------------------------------------------------------
2189c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// Logging
2199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
2209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
2219c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic void
22265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyandroid_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
223a2732a2bf98f7dbd063f4e5679f5b8bfcbec2698John Reck    int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
2242ae07339824efc50468f971ff8920ff0b894cad4Chris Craik    android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
2259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
2269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
2279c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase// ----------------------------------------------------------------------------
228e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// JNI Glue
229e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
230e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
231c9070ebd13263a341511cf779087a46750021196Chris Craikconst char* const kClassPathName = "android/view/DisplayListCanvas";
232e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
233e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic JNINativeMethod gMethods[] = {
2340dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nIsAvailable",       "!()Z",             (void*) android_view_DisplayListCanvas_isAvailable },
2350dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nInsertReorderBarrier","!(JZ)V",         (void*) android_view_DisplayListCanvas_insertReorderBarrier },
23661c8c9c5b2006d18e9310b6521c65b36ffe75ce4Romain Guy
237cd1c3eba69d044b551cededad75474038f919890John Reck    { "nCallDrawGLFunction", "!(JJLjava/lang/Runnable;)V",
238cd1c3eba69d044b551cededad75474038f919890John Reck            (void*) android_view_DisplayListCanvas_callDrawGLFunction },
2397d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
2400dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nDrawRoundRect",     "!(JJJJJJJJ)V",     (void*) android_view_DisplayListCanvas_drawRoundRectProps },
2410dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nDrawCircle",        "!(JJJJJ)V",        (void*) android_view_DisplayListCanvas_drawCircleProps },
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2430dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nFinishRecording",   "!(J)J",            (void*) android_view_DisplayListCanvas_finishRecording },
2440dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nDrawRenderNode",    "!(JJ)V",           (void*) android_view_DisplayListCanvas_drawRenderNode },
24513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
2460dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nCreateDisplayListCanvas", "!(II)J",     (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
2470dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nResetDisplayListCanvas", "!(JII)V",     (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
24813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
2490dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nDrawLayer",               "!(JJ)V",     (void*) android_view_DisplayListCanvas_drawLayer },
25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
2510dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nGetMaximumTextureWidth",  "!()I",       (void*) android_view_DisplayListCanvas_getMaxTextureWidth },
2520dba1f611410e5075a910fb73ff3d3c703bbc5ceJohn Reck    { "nGetMaximumTextureHeight", "!()I",       (void*) android_view_DisplayListCanvas_getMaxTextureHeight },
253e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
254e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2559c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasestatic JNINativeMethod gActivityThreadMethods[] = {
2569c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    { "dumpGraphicsInfo",        "(Ljava/io/FileDescriptor;)V",
2579c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase                                               (void*) android_app_ActivityThread_dumpGraphics }
2589c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase};
2599c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
260c9070ebd13263a341511cf779087a46750021196Chris Craikint register_android_view_DisplayListCanvas(JNIEnv* env) {
261cd1c3eba69d044b551cededad75474038f919890John Reck    jclass runnableClass = FindClassOrDie(env, "java/lang/Runnable");
262cd1c3eba69d044b551cededad75474038f919890John Reck    gRunnableMethodId = GetMethodIDOrDie(env, runnableClass, "run", "()V");
263cd1c3eba69d044b551cededad75474038f919890John Reck
264987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
265e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}
266e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
2676be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyint register_android_app_ActivityThread(JNIEnv* env) {
268ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, "android/app/ActivityThread",
2699c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase            gActivityThreadMethods, NELEM(gActivityThreadMethods));
2709c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
2719c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
272e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy};
273