• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

frameworks/base


Commit MetaInfo

修訂88993bf2bcb3ff0895a47d8d82a555b7afefddfa (tree)
時間2014-08-27 19:18:34
作者Chih-Wei Huang <cwhuang@linu...>
CommiterChih-Wei Huang

Log Message

libandroid_runtime: determine whether to use OpenGL renderer at runtime

Change Summary

差異

--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -335,7 +335,7 @@ static jobject Bitmap_copy(JNIEnv* env, jobject, const SkBitmap* src,
335335
336336 static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) {
337337 #ifdef USE_OPENGL_RENDERER
338- if (android::uirenderer::Caches::hasInstance()) {
338+ if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) {
339339 android::uirenderer::Caches::getInstance().resourceCache.destructor(bitmap);
340340 return;
341341 }
@@ -345,7 +345,7 @@ static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) {
345345
346346 static jboolean Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) {
347347 #ifdef USE_OPENGL_RENDERER
348- if (android::uirenderer::Caches::hasInstance()) {
348+ if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) {
349349 return android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap);
350350 }
351351 #endif // USE_OPENGL_RENDERER
--- a/core/jni/android/graphics/ColorFilter.cpp
+++ b/core/jni/android/graphics/ColorFilter.cpp
@@ -36,6 +36,7 @@ public:
3636 SkSafeUnref(obj);
3737 // f == NULL when not !USE_OPENGL_RENDERER, so no need to delete outside the ifdef
3838 #ifdef USE_OPENGL_RENDERER
39+ if (!GraphicsJNI::useOpenglRenderer()) return;
3940 if (android::uirenderer::Caches::hasInstance()) {
4041 android::uirenderer::Caches::getInstance().resourceCache.destructor(f);
4142 } else {
@@ -47,6 +48,7 @@ public:
4748 static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
4849 jint srcColor, SkPorterDuff::Mode mode) {
4950 #ifdef USE_OPENGL_RENDERER
51+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
5052 return new SkiaBlendFilter(skFilter, srcColor, SkPorterDuff::ToXfermodeMode(mode));
5153 #else
5254 return NULL;
@@ -56,6 +58,7 @@ public:
5658 static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
5759 jint mul, jint add) {
5860 #ifdef USE_OPENGL_RENDERER
61+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
5962 return new SkiaLightingFilter(skFilter, mul, add);
6063 #else
6164 return NULL;
@@ -65,6 +68,7 @@ public:
6568 static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
6669 jfloatArray jarray) {
6770 #ifdef USE_OPENGL_RENDERER
71+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
6872 AutoJavaFloatArray autoArray(env, jarray, 20);
6973 const float* src = autoArray.ptr();
7074
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -8,6 +8,7 @@
88 #include "SkDevice.h"
99 #include "SkPicture.h"
1010 #include "SkRegion.h"
11+#include <cutils/properties.h>
1112 #include <android_runtime/AndroidRuntime.h>
1213
1314 void doThrowNPE(JNIEnv* env) {
@@ -38,6 +39,17 @@ void doThrowIOE(JNIEnv* env, const char* msg) {
3839 jniThrowException(env, "java/io/IOException", msg);
3940 }
4041
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+
4153 bool GraphicsJNI::hasException(JNIEnv *env) {
4254 if (env->ExceptionCheck() != 0) {
4355 ALOGE("*** Uncaught exception returned from Java call!\n");
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -23,6 +23,8 @@ public:
2323 kBitmapCreateFlag_Premultiplied = 0x2,
2424 };
2525
26+ static bool useOpenglRenderer();
27+
2628 // returns true if an exception is set (and dumps it out to the Log)
2729 static bool hasException(JNIEnv*);
2830
--- a/core/jni/android/graphics/NinePatch.cpp
+++ b/core/jni/android/graphics/NinePatch.cpp
@@ -77,7 +77,7 @@ public:
7777
7878 static void finalize(JNIEnv* env, jobject, int8_t* patch) {
7979 #ifdef USE_OPENGL_RENDERER
80- if (android::uirenderer::Caches::hasInstance()) {
80+ if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) {
8181 Res_png_9patch* p = (Res_png_9patch*) patch;
8282 android::uirenderer::Caches::getInstance().resourceCache.destructor(p);
8383 return;
--- a/core/jni/android/graphics/Path.cpp
+++ b/core/jni/android/graphics/Path.cpp
@@ -36,7 +36,7 @@ public:
3636
3737 static void finalizer(JNIEnv* env, jobject clazz, SkPath* obj) {
3838 #ifdef USE_OPENGL_RENDERER
39- if (android::uirenderer::Caches::hasInstance()) {
39+ if (GraphicsJNI::useOpenglRenderer() && android::uirenderer::Caches::hasInstance()) {
4040 android::uirenderer::Caches::getInstance().resourceCache.destructor(obj);
4141 return;
4242 }
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -56,6 +56,7 @@ static void Shader_destructor(JNIEnv* env, jobject o, SkShader* shader, SkiaShad
5656 SkSafeUnref(shader);
5757 // skiaShader == NULL when not !USE_OPENGL_RENDERER, so no need to delete it outside the ifdef
5858 #ifdef USE_OPENGL_RENDERER
59+ if (!GraphicsJNI::useOpenglRenderer()) return;
5960 if (android::uirenderer::Caches::hasInstance()) {
6061 android::uirenderer::Caches::getInstance().resourceCache.destructor(skiaShader);
6162 } else {
@@ -75,6 +76,7 @@ static void Shader_setLocalMatrix(JNIEnv* env, jobject o, SkShader* shader, Skia
7576 shader->setLocalMatrix(*matrix);
7677 }
7778 #ifdef USE_OPENGL_RENDERER
79+ if (!GraphicsJNI::useOpenglRenderer()) return;
7880 skiaShader->setMatrix(const_cast<SkMatrix*>(matrix));
7981 #endif
8082 }
@@ -96,6 +98,7 @@ static SkShader* BitmapShader_constructor(JNIEnv* env, jobject o, const SkBitmap
9698 static SkiaShader* BitmapShader_postConstructor(JNIEnv* env, jobject o, SkShader* shader,
9799 SkBitmap* bitmap, int tileModeX, int tileModeY) {
98100 #ifdef USE_OPENGL_RENDERER
101+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
99102 SkiaShader* skiaShader = new SkiaBitmapShader(bitmap, shader,
100103 static_cast<SkShader::TileMode>(tileModeX), static_cast<SkShader::TileMode>(tileModeY),
101104 NULL, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0);
@@ -144,6 +147,7 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader*
144147 float x0, float y0, float x1, float y1, jintArray colorArray,
145148 jfloatArray posArray, int tileMode) {
146149 #ifdef USE_OPENGL_RENDERER
150+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
147151 size_t count = env->GetArrayLength(colorArray);
148152 const jint* colorValues = env->GetIntArrayElements(colorArray, NULL);
149153
@@ -215,6 +219,7 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader*
215219 static SkiaShader* LinearGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader,
216220 float x0, float y0, float x1, float y1, int color0, int color1, int tileMode) {
217221 #ifdef USE_OPENGL_RENDERER
222+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
218223 float* storedBounds = new float[4];
219224 storedBounds[0] = x0; storedBounds[1] = y0;
220225 storedBounds[2] = x1; storedBounds[3] = y1;
@@ -306,6 +311,7 @@ static SkShader* RadialGradient_create2(JNIEnv* env, jobject, float x, float y,
306311 static SkiaShader* RadialGradient_postCreate1(JNIEnv* env, jobject o, SkShader* shader,
307312 float x, float y, float radius, jintArray colorArray, jfloatArray posArray, int tileMode) {
308313 #ifdef USE_OPENGL_RENDERER
314+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
309315 size_t count = env->GetArrayLength(colorArray);
310316 const jint* colorValues = env->GetIntArrayElements(colorArray, NULL);
311317
@@ -344,6 +350,7 @@ static SkiaShader* RadialGradient_postCreate1(JNIEnv* env, jobject o, SkShader*
344350 static SkiaShader* RadialGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader,
345351 float x, float y, float radius, int color0, int color1, int tileMode) {
346352 #ifdef USE_OPENGL_RENDERER
353+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
347354 float* storedPositions = new float[2];
348355 storedPositions[0] = 0.0f;
349356 storedPositions[1] = 1.0f;
@@ -405,6 +412,7 @@ static SkShader* SweepGradient_create2(JNIEnv* env, jobject, float x, float y,
405412 static SkiaShader* SweepGradient_postCreate1(JNIEnv* env, jobject o, SkShader* shader,
406413 float x, float y, jintArray colorArray, jfloatArray posArray) {
407414 #ifdef USE_OPENGL_RENDERER
415+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
408416 size_t count = env->GetArrayLength(colorArray);
409417 const jint* colorValues = env->GetIntArrayElements(colorArray, NULL);
410418
@@ -442,6 +450,7 @@ static SkiaShader* SweepGradient_postCreate1(JNIEnv* env, jobject o, SkShader* s
442450 static SkiaShader* SweepGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader,
443451 float x, float y, int color0, int color1) {
444452 #ifdef USE_OPENGL_RENDERER
453+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
445454 float* storedPositions = new float[2];
446455 storedPositions[0] = 0.0f;
447456 storedPositions[1] = 1.0f;
@@ -478,6 +487,7 @@ static SkShader* ComposeShader_create2(JNIEnv* env, jobject o,
478487 static SkiaShader* ComposeShader_postCreate2(JNIEnv* env, jobject o, SkShader* shader,
479488 SkiaShader* shaderA, SkiaShader* shaderB, SkPorterDuff::Mode porterDuffMode) {
480489 #ifdef USE_OPENGL_RENDERER
490+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
481491 SkXfermode::Mode mode = SkPorterDuff::ToXfermodeMode(porterDuffMode);
482492 return new SkiaComposeShader(shaderA, shaderB, mode, shader);
483493 #else
@@ -488,6 +498,7 @@ static SkiaShader* ComposeShader_postCreate2(JNIEnv* env, jobject o, SkShader* s
488498 static SkiaShader* ComposeShader_postCreate1(JNIEnv* env, jobject o, SkShader* shader,
489499 SkiaShader* shaderA, SkiaShader* shaderB, SkXfermode* mode) {
490500 #ifdef USE_OPENGL_RENDERER
501+ if (!GraphicsJNI::useOpenglRenderer()) return NULL;
491502 SkXfermode::Mode skiaMode;
492503 if (!SkXfermode::IsMode(mode, &skiaMode)) {
493504 // TODO: Support other modes
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -968,7 +968,7 @@ static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz
968968 char prop[PROPERTY_VALUE_MAX];
969969 if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
970970 // not in the emulator
971- return JNI_TRUE;
971+ return GraphicsJNI::useOpenglRenderer() ? JNI_TRUE : JNI_FALSE;
972972 }
973973 // In the emulator this property will be set to 1 when hardware GLES is
974974 // 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
986986 static void
987987 android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
988988 #ifdef USE_OPENGL_RENDERER
989+ if (!GraphicsJNI::useOpenglRenderer()) return;
989990 int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
990991 android::uirenderer::DisplayList::outputLogBuffer(fd);
991992 #endif // USE_OPENGL_RENDERER
@@ -1162,8 +1163,10 @@ static JNINativeMethod gActivityThreadMethods[] = {
11621163
11631164 int register_android_view_GLES20Canvas(JNIEnv* env) {
11641165 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+ }
11671170
11681171 return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
11691172 }