aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkUtils.cpp
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-05-28 21:43:59 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-05-28 21:43:59 +0000
commit81496fb21637cc8d2a2b45a790e0f9d6d6f769c4 (patch)
tree00e25ec3280a138d3964bc794f379f5dd5f0f915 /src/core/SkUtils.cpp
parent940aa237bb3acdeb23bec7bd416b4aecabb51103 (diff)
Spin off just SkLazyFnPtr from 305513002.
The memory barrier in SkOnce is a perf regression for sk_mem{set,cpy} in SkUtils on ARM. We can do a lot better for function pointers. BUG=skia: Committed: http://code.google.com/p/skia/source/detail?r=14929 R=bungeman@google.com, mtklein@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/305753002 git-svn-id: http://skia.googlecode.com/svn/trunk@14938 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkUtils.cpp')
-rw-r--r--src/core/SkUtils.cpp50
1 files changed, 16 insertions, 34 deletions
diff --git a/src/core/SkUtils.cpp b/src/core/SkUtils.cpp
index ca18e0cb2d..591a198c65 100644
--- a/src/core/SkUtils.cpp
+++ b/src/core/SkUtils.cpp
@@ -8,7 +8,7 @@
#include "SkUtils.h"
-#include "SkOnce.h"
+#include "SkLazyFnPtr.h"
#if 0
#define assign_16_longs(dst, value) \
@@ -113,52 +113,34 @@ static void sk_memcpy32_portable(uint32_t dst[], const uint32_t src[], int count
memcpy(dst, src, count * sizeof(uint32_t));
}
-static void choose_memset16(SkMemset16Proc* proc) {
- *proc = SkMemset16GetPlatformProc();
- if (NULL == *proc) {
- *proc = &sk_memset16_portable;
- }
+static SkMemset16Proc choose_memset16() {
+ SkMemset16Proc proc = SkMemset16GetPlatformProc();
+ return proc ? proc : sk_memset16_portable;
}
void sk_memset16(uint16_t dst[], uint16_t value, int count) {
- SK_DECLARE_STATIC_ONCE(once);
- static SkMemset16Proc proc = NULL;
- SkOnce(&once, choose_memset16, &proc);
- SkASSERT(proc != NULL);
-
- return proc(dst, value, count);
+ SK_DECLARE_STATIC_LAZY_FN_PTR(SkMemset16Proc, choice);
+ return choice.get(choose_memset16)(dst, value, count);
}
-static void choose_memset32(SkMemset32Proc* proc) {
- *proc = SkMemset32GetPlatformProc();
- if (NULL == *proc) {
- *proc = &sk_memset32_portable;
- }
+static SkMemset32Proc choose_memset32() {
+ SkMemset32Proc proc = SkMemset32GetPlatformProc();
+ return proc ? proc : sk_memset32_portable;
}
void sk_memset32(uint32_t dst[], uint32_t value, int count) {
- SK_DECLARE_STATIC_ONCE(once);
- static SkMemset32Proc proc = NULL;
- SkOnce(&once, choose_memset32, &proc);
- SkASSERT(proc != NULL);
-
- return proc(dst, value, count);
+ SK_DECLARE_STATIC_LAZY_FN_PTR(SkMemset32Proc, choice);
+ return choice.get(choose_memset32)(dst, value, count);
}
-static void choose_memcpy32(SkMemcpy32Proc* proc) {
- *proc = SkMemcpy32GetPlatformProc();
- if (NULL == *proc) {
- *proc = &sk_memcpy32_portable;
- }
+static SkMemcpy32Proc choose_memcpy32() {
+ SkMemcpy32Proc proc = SkMemcpy32GetPlatformProc();
+ return proc ? proc : sk_memcpy32_portable;
}
void sk_memcpy32(uint32_t dst[], const uint32_t src[], int count) {
- SK_DECLARE_STATIC_ONCE(once);
- static SkMemcpy32Proc proc = NULL;
- SkOnce(&once, choose_memcpy32, &proc);
- SkASSERT(proc != NULL);
-
- return proc(dst, src, count);
+ SK_DECLARE_STATIC_LAZY_FN_PTR(SkMemcpy32Proc, choice);
+ return choice.get(choose_memcpy32)(dst, src, count);
}
///////////////////////////////////////////////////////////////////////////////