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