summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorLucas Crowthers <lucasc@codeaurora.org>2013-01-08 15:54:49 -0500
committerSteve Kondik <shade@chemlab.org>2013-02-27 14:15:29 -0800
commita2e20761b5ad646ce3f08ed24995799dd81acee0 (patch)
tree8aacdbf6447a4e9888cf55e44e853adab3466e83 /core/jni
parent320793c410094bda32c880acedf873c352eabd54 (diff)
downloadframeworks_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.mk15
-rw-r--r--core/jni/android/graphics/Bitmap.cpp26
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;