diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-28 19:40:21 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-28 19:40:21 +0000 |
commit | 3fdc7d6dd13b510de09cf29ffd3fe36adf89d541 (patch) | |
tree | 86f759d14cce06337d375fda6493d0bb9259c8ee /src/core/SkUtils.cpp | |
parent | 29ac34ee526578fb0a01cd2d0c23c23e6a823d82 (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:
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@14929 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkUtils.cpp')
-rw-r--r-- | src/core/SkUtils.cpp | 50 |
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); } /////////////////////////////////////////////////////////////////////////////// |