frameworks/base
修訂 | 88993bf2bcb3ff0895a47d8d82a555b7afefddfa (tree) |
---|---|
時間 | 2014-08-27 19:18:34 |
作者 | Chih-Wei Huang <cwhuang@linu...> |
Commiter | Chih-Wei Huang |
libandroid_runtime: determine whether to use OpenGL renderer at runtime
@@ -335,7 +335,7 @@ static jobject Bitmap_copy(JNIEnv* env, jobject, const SkBitmap* src, | ||
335 | 335 | |
336 | 336 | static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) { |
337 | 337 | #ifdef USE_OPENGL_RENDERER |
338 | - if (android::uirenderer::Caches::hasInstance()) { | |
338 | + if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) { | |
339 | 339 | android::uirenderer::Caches::getInstance().resourceCache.destructor(bitmap); |
340 | 340 | return; |
341 | 341 | } |
@@ -345,7 +345,7 @@ static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) { | ||
345 | 345 | |
346 | 346 | static jboolean Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { |
347 | 347 | #ifdef USE_OPENGL_RENDERER |
348 | - if (android::uirenderer::Caches::hasInstance()) { | |
348 | + if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) { | |
349 | 349 | return android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); |
350 | 350 | } |
351 | 351 | #endif // USE_OPENGL_RENDERER |
@@ -36,6 +36,7 @@ public: | ||
36 | 36 | SkSafeUnref(obj); |
37 | 37 | // f == NULL when not !USE_OPENGL_RENDERER, so no need to delete outside the ifdef |
38 | 38 | #ifdef USE_OPENGL_RENDERER |
39 | + if (!GraphicsJNI::useOpenglRenderer()) return; | |
39 | 40 | if (android::uirenderer::Caches::hasInstance()) { |
40 | 41 | android::uirenderer::Caches::getInstance().resourceCache.destructor(f); |
41 | 42 | } else { |
@@ -47,6 +48,7 @@ public: | ||
47 | 48 | static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, SkColorFilter *skFilter, |
48 | 49 | jint srcColor, SkPorterDuff::Mode mode) { |
49 | 50 | #ifdef USE_OPENGL_RENDERER |
51 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
50 | 52 | return new SkiaBlendFilter(skFilter, srcColor, SkPorterDuff::ToXfermodeMode(mode)); |
51 | 53 | #else |
52 | 54 | return NULL; |
@@ -56,6 +58,7 @@ public: | ||
56 | 58 | static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, SkColorFilter *skFilter, |
57 | 59 | jint mul, jint add) { |
58 | 60 | #ifdef USE_OPENGL_RENDERER |
61 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
59 | 62 | return new SkiaLightingFilter(skFilter, mul, add); |
60 | 63 | #else |
61 | 64 | return NULL; |
@@ -65,6 +68,7 @@ public: | ||
65 | 68 | static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, SkColorFilter *skFilter, |
66 | 69 | jfloatArray jarray) { |
67 | 70 | #ifdef USE_OPENGL_RENDERER |
71 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
68 | 72 | AutoJavaFloatArray autoArray(env, jarray, 20); |
69 | 73 | const float* src = autoArray.ptr(); |
70 | 74 |
@@ -8,6 +8,7 @@ | ||
8 | 8 | #include "SkDevice.h" |
9 | 9 | #include "SkPicture.h" |
10 | 10 | #include "SkRegion.h" |
11 | +#include <cutils/properties.h> | |
11 | 12 | #include <android_runtime/AndroidRuntime.h> |
12 | 13 | |
13 | 14 | void doThrowNPE(JNIEnv* env) { |
@@ -38,6 +39,17 @@ void doThrowIOE(JNIEnv* env, const char* msg) { | ||
38 | 39 | jniThrowException(env, "java/io/IOException", msg); |
39 | 40 | } |
40 | 41 | |
42 | +static bool checkOpenglRenderer() { | |
43 | + char prop[PROPERTY_VALUE_MAX]; | |
44 | + property_get("debug.egl.hw", prop, "1"); | |
45 | + return atoi(prop) == 1; | |
46 | +} | |
47 | + | |
48 | +bool GraphicsJNI::useOpenglRenderer() { | |
49 | + static bool use_opengl_renderer = checkOpenglRenderer(); | |
50 | + return use_opengl_renderer; | |
51 | +} | |
52 | + | |
41 | 53 | bool GraphicsJNI::hasException(JNIEnv *env) { |
42 | 54 | if (env->ExceptionCheck() != 0) { |
43 | 55 | ALOGE("*** Uncaught exception returned from Java call!\n"); |
@@ -23,6 +23,8 @@ public: | ||
23 | 23 | kBitmapCreateFlag_Premultiplied = 0x2, |
24 | 24 | }; |
25 | 25 | |
26 | + static bool useOpenglRenderer(); | |
27 | + | |
26 | 28 | // returns true if an exception is set (and dumps it out to the Log) |
27 | 29 | static bool hasException(JNIEnv*); |
28 | 30 |
@@ -77,7 +77,7 @@ public: | ||
77 | 77 | |
78 | 78 | static void finalize(JNIEnv* env, jobject, int8_t* patch) { |
79 | 79 | #ifdef USE_OPENGL_RENDERER |
80 | - if (android::uirenderer::Caches::hasInstance()) { | |
80 | + if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) { | |
81 | 81 | Res_png_9patch* p = (Res_png_9patch*) patch; |
82 | 82 | android::uirenderer::Caches::getInstance().resourceCache.destructor(p); |
83 | 83 | return; |
@@ -36,7 +36,7 @@ public: | ||
36 | 36 | |
37 | 37 | static void finalizer(JNIEnv* env, jobject clazz, SkPath* obj) { |
38 | 38 | #ifdef USE_OPENGL_RENDERER |
39 | - if (android::uirenderer::Caches::hasInstance()) { | |
39 | + if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) { | |
40 | 40 | android::uirenderer::Caches::getInstance().resourceCache.destructor(obj); |
41 | 41 | return; |
42 | 42 | } |
@@ -56,6 +56,7 @@ static void Shader_destructor(JNIEnv* env, jobject o, SkShader* shader, SkiaShad | ||
56 | 56 | SkSafeUnref(shader); |
57 | 57 | // skiaShader == NULL when not !USE_OPENGL_RENDERER, so no need to delete it outside the ifdef |
58 | 58 | #ifdef USE_OPENGL_RENDERER |
59 | + if (!GraphicsJNI::useOpenglRenderer()) return; | |
59 | 60 | if (android::uirenderer::Caches::hasInstance()) { |
60 | 61 | android::uirenderer::Caches::getInstance().resourceCache.destructor(skiaShader); |
61 | 62 | } else { |
@@ -75,6 +76,7 @@ static void Shader_setLocalMatrix(JNIEnv* env, jobject o, SkShader* shader, Skia | ||
75 | 76 | shader->setLocalMatrix(*matrix); |
76 | 77 | } |
77 | 78 | #ifdef USE_OPENGL_RENDERER |
79 | + if (!GraphicsJNI::useOpenglRenderer()) return; | |
78 | 80 | skiaShader->setMatrix(const_cast<SkMatrix*>(matrix)); |
79 | 81 | #endif |
80 | 82 | } |
@@ -96,6 +98,7 @@ static SkShader* BitmapShader_constructor(JNIEnv* env, jobject o, const SkBitmap | ||
96 | 98 | static SkiaShader* BitmapShader_postConstructor(JNIEnv* env, jobject o, SkShader* shader, |
97 | 99 | SkBitmap* bitmap, int tileModeX, int tileModeY) { |
98 | 100 | #ifdef USE_OPENGL_RENDERER |
101 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
99 | 102 | SkiaShader* skiaShader = new SkiaBitmapShader(bitmap, shader, |
100 | 103 | static_cast<SkShader::TileMode>(tileModeX), static_cast<SkShader::TileMode>(tileModeY), |
101 | 104 | NULL, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0); |
@@ -144,6 +147,7 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader* | ||
144 | 147 | float x0, float y0, float x1, float y1, jintArray colorArray, |
145 | 148 | jfloatArray posArray, int tileMode) { |
146 | 149 | #ifdef USE_OPENGL_RENDERER |
150 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
147 | 151 | size_t count = env->GetArrayLength(colorArray); |
148 | 152 | const jint* colorValues = env->GetIntArrayElements(colorArray, NULL); |
149 | 153 |
@@ -215,6 +219,7 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader* | ||
215 | 219 | static SkiaShader* LinearGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader, |
216 | 220 | float x0, float y0, float x1, float y1, int color0, int color1, int tileMode) { |
217 | 221 | #ifdef USE_OPENGL_RENDERER |
222 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
218 | 223 | float* storedBounds = new float[4]; |
219 | 224 | storedBounds[0] = x0; storedBounds[1] = y0; |
220 | 225 | storedBounds[2] = x1; storedBounds[3] = y1; |
@@ -306,6 +311,7 @@ static SkShader* RadialGradient_create2(JNIEnv* env, jobject, float x, float y, | ||
306 | 311 | static SkiaShader* RadialGradient_postCreate1(JNIEnv* env, jobject o, SkShader* shader, |
307 | 312 | float x, float y, float radius, jintArray colorArray, jfloatArray posArray, int tileMode) { |
308 | 313 | #ifdef USE_OPENGL_RENDERER |
314 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
309 | 315 | size_t count = env->GetArrayLength(colorArray); |
310 | 316 | const jint* colorValues = env->GetIntArrayElements(colorArray, NULL); |
311 | 317 |
@@ -344,6 +350,7 @@ static SkiaShader* RadialGradient_postCreate1(JNIEnv* env, jobject o, SkShader* | ||
344 | 350 | static SkiaShader* RadialGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader, |
345 | 351 | float x, float y, float radius, int color0, int color1, int tileMode) { |
346 | 352 | #ifdef USE_OPENGL_RENDERER |
353 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
347 | 354 | float* storedPositions = new float[2]; |
348 | 355 | storedPositions[0] = 0.0f; |
349 | 356 | storedPositions[1] = 1.0f; |
@@ -405,6 +412,7 @@ static SkShader* SweepGradient_create2(JNIEnv* env, jobject, float x, float y, | ||
405 | 412 | static SkiaShader* SweepGradient_postCreate1(JNIEnv* env, jobject o, SkShader* shader, |
406 | 413 | float x, float y, jintArray colorArray, jfloatArray posArray) { |
407 | 414 | #ifdef USE_OPENGL_RENDERER |
415 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
408 | 416 | size_t count = env->GetArrayLength(colorArray); |
409 | 417 | const jint* colorValues = env->GetIntArrayElements(colorArray, NULL); |
410 | 418 |
@@ -442,6 +450,7 @@ static SkiaShader* SweepGradient_postCreate1(JNIEnv* env, jobject o, SkShader* s | ||
442 | 450 | static SkiaShader* SweepGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader, |
443 | 451 | float x, float y, int color0, int color1) { |
444 | 452 | #ifdef USE_OPENGL_RENDERER |
453 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
445 | 454 | float* storedPositions = new float[2]; |
446 | 455 | storedPositions[0] = 0.0f; |
447 | 456 | storedPositions[1] = 1.0f; |
@@ -478,6 +487,7 @@ static SkShader* ComposeShader_create2(JNIEnv* env, jobject o, | ||
478 | 487 | static SkiaShader* ComposeShader_postCreate2(JNIEnv* env, jobject o, SkShader* shader, |
479 | 488 | SkiaShader* shaderA, SkiaShader* shaderB, SkPorterDuff::Mode porterDuffMode) { |
480 | 489 | #ifdef USE_OPENGL_RENDERER |
490 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
481 | 491 | SkXfermode::Mode mode = SkPorterDuff::ToXfermodeMode(porterDuffMode); |
482 | 492 | return new SkiaComposeShader(shaderA, shaderB, mode, shader); |
483 | 493 | #else |
@@ -488,6 +498,7 @@ static SkiaShader* ComposeShader_postCreate2(JNIEnv* env, jobject o, SkShader* s | ||
488 | 498 | static SkiaShader* ComposeShader_postCreate1(JNIEnv* env, jobject o, SkShader* shader, |
489 | 499 | SkiaShader* shaderA, SkiaShader* shaderB, SkXfermode* mode) { |
490 | 500 | #ifdef USE_OPENGL_RENDERER |
501 | + if (!GraphicsJNI::useOpenglRenderer()) return NULL; | |
491 | 502 | SkXfermode::Mode skiaMode; |
492 | 503 | if (!SkXfermode::IsMode(mode, &skiaMode)) { |
493 | 504 | // TODO: Support other modes |
@@ -968,7 +968,7 @@ static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz | ||
968 | 968 | char prop[PROPERTY_VALUE_MAX]; |
969 | 969 | if (property_get("ro.kernel.qemu", prop, NULL) == 0) { |
970 | 970 | // not in the emulator |
971 | - return JNI_TRUE; | |
971 | + return GraphicsJNI::useOpenglRenderer() ? JNI_TRUE : JNI_FALSE; | |
972 | 972 | } |
973 | 973 | // In the emulator this property will be set to 1 when hardware GLES is |
974 | 974 | // enabled, 0 otherwise. On old emulator versions it will be undefined. |
@@ -986,6 +986,7 @@ static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz | ||
986 | 986 | static void |
987 | 987 | android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) { |
988 | 988 | #ifdef USE_OPENGL_RENDERER |
989 | + if (!GraphicsJNI::useOpenglRenderer()) return; | |
989 | 990 | int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor); |
990 | 991 | android::uirenderer::DisplayList::outputLogBuffer(fd); |
991 | 992 | #endif // USE_OPENGL_RENDERER |
@@ -1162,8 +1163,10 @@ static JNINativeMethod gActivityThreadMethods[] = { | ||
1162 | 1163 | |
1163 | 1164 | int register_android_view_GLES20Canvas(JNIEnv* env) { |
1164 | 1165 | jclass clazz; |
1165 | - FIND_CLASS(clazz, "android/graphics/Rect"); | |
1166 | - GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V"); | |
1166 | + if (GraphicsJNI::useOpenglRenderer()) { | |
1167 | + FIND_CLASS(clazz, "android/graphics/Rect"); | |
1168 | + GET_METHOD_ID(gRectClassInfo.set, clazz, "set", "(IIII)V"); | |
1169 | + } | |
1167 | 1170 | |
1168 | 1171 | return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); |
1169 | 1172 | } |