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

Commit 63e7778f 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: If52a789b6f592b137e64e85077665c9ce5957f79
parent c81e57aa
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -85,7 +85,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 \
@@ -228,6 +227,20 @@ $(shell mkdir -p $(OUT)/obj/SHARED_LIBRARIES/libtime_genoff_intermediates/)
$(shell touch $(OUT)/obj/SHARED_LIBRARIES/libtime_genoff_intermediates/export_includes)
endif

ifeq ($(TARGET_ARCH), arm)
  ifeq ($(ARCH_ARM_HAVE_NEON),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
+21 −15
Original line number Diff line number Diff line
@@ -23,6 +23,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
@@ -30,7 +36,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;

@@ -39,7 +45,7 @@ static void FromColor_D32(void* dst, const SkColor src[], int width,
    }
}

static void FromColor_D32_Raw(void* dst, const SkColor src[], int width,
static void __BITMAP_OPTS FromColor_D32_Raw(void* dst, const SkColor src[], int width,
                          int, int) {
    // SkColor's ordering may be different from SkPMColor
    if (SK_COLOR_MATCHES_PMCOLOR_BYTE_ORDER) {
@@ -56,7 +62,7 @@ static void FromColor_D32_Raw(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;

@@ -68,7 +74,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;

@@ -80,7 +86,7 @@ static void FromColor_D4444(void* dst, const SkColor src[], int width,
    }
}

static void FromColor_D4444_Raw(void* dst, const SkColor src[], int width,
static void __BITMAP_OPTS FromColor_D4444_Raw(void* dst, const SkColor src[], int width,
                            int x, int y) {
    SkPMColor16* d = (SkPMColor16*)dst;

@@ -146,7 +152,7 @@ bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int
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;
@@ -155,7 +161,7 @@ static void ToColor_S32_Alpha(SkColor dst[], const void* src, int width,
    } while (--width != 0);
}

static void ToColor_S32_Raw(SkColor dst[], const void* src, int width,
static void __BITMAP_OPTS ToColor_S32_Raw(SkColor dst[], const void* src, int width,
                              SkColorTable*) {
    SkASSERT(width > 0);
    const SkPMColor* s = (const SkPMColor*)src;
@@ -166,7 +172,7 @@ static void ToColor_S32_Raw(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;
@@ -177,7 +183,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;
@@ -186,7 +192,7 @@ static void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width,
    } while (--width != 0);
}

static void ToColor_S4444_Raw(SkColor dst[], const void* src, int width,
static void __BITMAP_OPTS ToColor_S4444_Raw(SkColor dst[], const void* src, int width,
                                SkColorTable*) {
    SkASSERT(width > 0);
    const SkPMColor16* s = (const SkPMColor16*)src;
@@ -197,7 +203,7 @@ static void ToColor_S4444_Raw(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;
@@ -208,7 +214,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;
@@ -219,7 +225,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;
@@ -230,7 +236,7 @@ static void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width,
    ctable->unlockColors(false);
}

static void ToColor_SI8_Raw(SkColor dst[], const void* src, int width,
static void __BITMAP_OPTS ToColor_SI8_Raw(SkColor dst[], const void* src, int width,
                              SkColorTable* ctable) {
    SkASSERT(width > 0);
    const uint8_t* s = (const uint8_t*)src;
@@ -243,7 +249,7 @@ static void ToColor_SI8_Raw(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;