Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2e20761 authored by Lucas Crowthers's avatar Lucas Crowthers Committed by Steve Kondik
Browse files

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
parent 320793c4
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -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
+16 −10
Original line number Diff line number Diff line
@@ -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;