diff options
author | Lucas Crowthers <lucasc@codeaurora.org> | 2013-01-08 15:54:49 -0500 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-02-27 14:15:29 -0800 |
commit | a2e20761b5ad646ce3f08ed24995799dd81acee0 (patch) | |
tree | 8aacdbf6447a4e9888cf55e44e853adab3466e83 /core/jni | |
parent | 320793c410094bda32c880acedf873c352eabd54 (diff) | |
download | frameworks_base-a2e20761b5ad646ce3f08ed24995799dd81acee0.zip frameworks_base-a2e20761b5ad646ce3f08ed24995799dd81acee0.tar.gz frameworks_base-a2e20761b5ad646ce3f08ed24995799dd81acee0.tar.bz2 |
frameworks/base: vectorize Bitmap operations
Enable gcc vectorizing optimizations for Bitmap operations within
libandroid_runtime.so. Adds -ftree-vectorize -mvectorize-with-neon-quad
-fprefetch-loop-arrays to functions and compiles Bitmap.cpp in ARM mode
(necessary to enable vectorizing optimizations) for appropriate targets.
Change-Id: I12defef6f47adf41af849df6e750097f5906d92d
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/Android.mk | 15 | ||||
-rw-r--r-- | core/jni/android/graphics/Bitmap.cpp | 26 |
2 files changed, 30 insertions, 11 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk index de1fb4e..8edf042 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -88,7 +88,6 @@ LOCAL_SRC_FILES:= \ android_util_XmlBlock.cpp \ android_util_PackageRedirectionMap.cpp \ android/graphics/AutoDecodeCancel.cpp \ - android/graphics/Bitmap.cpp \ android/graphics/BitmapFactory.cpp \ android/graphics/Camera.cpp \ android/graphics/Canvas.cpp \ @@ -226,6 +225,20 @@ LOCAL_SHARED_LIBRARIES += libselinux LOCAL_CFLAGS += -DHAVE_SELINUX endif # HAVE_SELINUX +ifeq ($(TARGET_ARCH), arm) + ifeq ($(TARGET_USE_KRAIT_BIONIC_OPTIMIZATION), true) + TARGET_arm_CFLAGS += -DUSE_NEON_BITMAP_OPTS -mvectorize-with-neon-quad + LOCAL_SRC_FILES+= \ + android/graphics/Bitmap.cpp.arm + else + LOCAL_SRC_FILES+= \ + android/graphics/Bitmap.cpp + endif +else + LOCAL_SRC_FILES+= \ + android/graphics/Bitmap.cpp +endif + ifeq ($(USE_OPENGL_RENDERER),true) LOCAL_SHARED_LIBRARIES += libhwui endif diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 63683b4..7c5da26 100644 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -22,6 +22,12 @@ #define TRACE_BITMAP(code)
#endif
+#ifdef USE_NEON_BITMAP_OPTS
+ #define __BITMAP_OPTS __attribute__((optimize("-ftree-vectorize", "-fprefetch-loop-arrays")))
+#else
+ #define __BITMAP_OPTS
+#endif
+
///////////////////////////////////////////////////////////////////////////////
// Conversions to/from SkColor, for get/setPixels, and the create method, which
// is basically like setPixels
@@ -29,7 +35,7 @@ typedef void (*FromColorProc)(void* dst, const SkColor src[], int width,
int x, int y);
-static void FromColor_D32(void* dst, const SkColor src[], int width,
+static void __BITMAP_OPTS FromColor_D32(void* dst, const SkColor src[], int width,
int, int) {
SkPMColor* d = (SkPMColor*)dst;
@@ -38,7 +44,7 @@ static void FromColor_D32(void* dst, const SkColor src[], int width, }
}
-static void FromColor_D565(void* dst, const SkColor src[], int width,
+static void __BITMAP_OPTS FromColor_D565(void* dst, const SkColor src[], int width,
int x, int y) {
uint16_t* d = (uint16_t*)dst;
@@ -50,7 +56,7 @@ static void FromColor_D565(void* dst, const SkColor src[], int width, }
}
-static void FromColor_D4444(void* dst, const SkColor src[], int width,
+static void __BITMAP_OPTS FromColor_D4444(void* dst, const SkColor src[], int width,
int x, int y) {
SkPMColor16* d = (SkPMColor16*)dst;
@@ -113,7 +119,7 @@ bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, typedef void (*ToColorProc)(SkColor dst[], const void* src, int width,
SkColorTable*);
-static void ToColor_S32_Alpha(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_S32_Alpha(SkColor dst[], const void* src, int width,
SkColorTable*) {
SkASSERT(width > 0);
const SkPMColor* s = (const SkPMColor*)src;
@@ -122,7 +128,7 @@ static void ToColor_S32_Alpha(SkColor dst[], const void* src, int width, } while (--width != 0);
}
-static void ToColor_S32_Opaque(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_S32_Opaque(SkColor dst[], const void* src, int width,
SkColorTable*) {
SkASSERT(width > 0);
const SkPMColor* s = (const SkPMColor*)src;
@@ -133,7 +139,7 @@ static void ToColor_S32_Opaque(SkColor dst[], const void* src, int width, } while (--width != 0);
}
-static void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_S4444_Alpha(SkColor dst[], const void* src, int width,
SkColorTable*) {
SkASSERT(width > 0);
const SkPMColor16* s = (const SkPMColor16*)src;
@@ -142,7 +148,7 @@ static void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width, } while (--width != 0);
}
-static void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_S4444_Opaque(SkColor dst[], const void* src, int width,
SkColorTable*) {
SkASSERT(width > 0);
const SkPMColor16* s = (const SkPMColor16*)src;
@@ -153,7 +159,7 @@ static void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width, } while (--width != 0);
}
-static void ToColor_S565(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_S565(SkColor dst[], const void* src, int width,
SkColorTable*) {
SkASSERT(width > 0);
const uint16_t* s = (const uint16_t*)src;
@@ -164,7 +170,7 @@ static void ToColor_S565(SkColor dst[], const void* src, int width, } while (--width != 0);
}
-static void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_SI8_Alpha(SkColor dst[], const void* src, int width,
SkColorTable* ctable) {
SkASSERT(width > 0);
const uint8_t* s = (const uint8_t*)src;
@@ -175,7 +181,7 @@ static void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width, ctable->unlockColors(false);
}
-static void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width,
+static void __BITMAP_OPTS ToColor_SI8_Opaque(SkColor dst[], const void* src, int width,
SkColorTable* ctable) {
SkASSERT(width > 0);
const uint8_t* s = (const uint8_t*)src;
|