Implement SSE2-based implementations of the morphology filters (dilate & erode). This gives a 3-5X speedup over the naive implementation, and also mitigates a timing-based security attack in Chrome (https://code.google.com/p/chromium/issues/detail?id=251711).
NOTE: this will require a corresponding GYP change on the Skia roll into Chrome: https://codereview.chromium.org/52453004/
R=mtklein@google.com, reed@google.com
Review URL: https://codereview.chromium.org/52603004
git-svn-id: http://skia.googlecode.com/svn/trunk@12038 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/opts/opts_check_SSE2.cpp b/src/opts/opts_check_SSE2.cpp
index 8f0bdac..b40ca9d 100644
--- a/src/opts/opts_check_SSE2.cpp
+++ b/src/opts/opts_check_SSE2.cpp
@@ -14,6 +14,8 @@
#include "SkBlitRow_opts_SSE2.h"
#include "SkUtils_opts_SSE2.h"
#include "SkUtils.h"
+#include "SkMorphology_opts.h"
+#include "SkMorphology_opts_SSE2.h"
#include "SkRTConf.h"
@@ -248,6 +250,24 @@
}
}
+SkMorphologyProc SkMorphologyGetPlatformProc(SkMorphologyProcType type) {
+ if (!cachedHasSSE2()) {
+ return NULL;
+ }
+ switch (type) {
+ case kDilateX_SkMorphologyProcType:
+ return SkDilateX_SSE2;
+ case kDilateY_SkMorphologyProcType:
+ return SkDilateY_SSE2;
+ case kErodeX_SkMorphologyProcType:
+ return SkErodeX_SSE2;
+ case kErodeY_SkMorphologyProcType:
+ return SkErodeY_SSE2;
+ default:
+ return NULL;
+ }
+}
+
SkBlitRow::ColorRectProc PlatformColorRectProcFactory(); // suppress warning
SkBlitRow::ColorRectProc PlatformColorRectProcFactory() {