diff options
author | mtklein <mtklein@google.com> | 2016-01-04 19:02:52 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-04 19:02:52 -0800 |
commit | c4a0d73e9aebcb7d291aa3eb8d5b6926d9a0b77e (patch) | |
tree | 90f13837d51d62bc23696724a17d0009a4e24d43 | |
parent | c8be09aaf2bbfa004c574553fc9d194ac7f1ce1a (diff) |
Revert of df generation: single allocation with calloc (patchset #2 id:20001 of https://codereview.chromium.org/1544983004/ )
Reason for revert:
Crashing multiple bots, e.g.
https://uberchromegw.corp.google.com/i/client.skia.android/builders/Perf-Android-GCC-Nexus7-GPU-Tegra3-Arm7-Release/builds/3525
Original issue's description:
> df generation: single allocation with calloc
>
> The dfStorage DFData allocation can never fit in its stack space: 5px padding on each side always implies at least a 10x10 DFData allocation, but the stack space only fits 64 DFData.
>
> So we've always been spilling to the heap.
>
> If we're going to spill to the heap, we might as well allocate/free all our temporary memory in one block, and since we want it zeroed, might as well calloc.
>
> So in practice this replaces 1-2 malloc, 1-2 free, and 2 bzeros with 1 calloc and 1 free.
>
>
> BUG=skia:4729
> GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1544983004
>
> Committed: https://skia.googlesource.com/skia/+/12204d90337656542a42fa0fcccb7bec13af0cce
TBR=jvanverth@google.com,mtklein@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:4729
Review URL: https://codereview.chromium.org/1556263002
-rwxr-xr-x | src/core/SkDistanceFieldGen.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/core/SkDistanceFieldGen.cpp b/src/core/SkDistanceFieldGen.cpp index 4f4de56a46..30354e09f8 100755 --- a/src/core/SkDistanceFieldGen.cpp +++ b/src/core/SkDistanceFieldGen.cpp @@ -343,10 +343,15 @@ static bool generate_distance_field_from_image(unsigned char* distanceField, int dataWidth = width + 2*pad; int dataHeight = height + 2*pad; - // create zeroed temp edge+DFData storage - SkAutoFree storage(sk_calloc_throw(dataWidth*dataHeight*(1 + sizeof(DFData)))); - unsigned char* edgePtr = (unsigned char*)storage.get(); - DFData* dataPtr = (DFData*)(edgePtr + dataWidth*dataHeight); + // create temp data + size_t dataSize = dataWidth*dataHeight*sizeof(DFData); + SkAutoSMalloc<1024> dfStorage(dataSize); + DFData* dataPtr = (DFData*) dfStorage.get(); + sk_bzero(dataPtr, dataSize); + + SkAutoSMalloc<1024> edgeStorage(dataWidth*dataHeight*sizeof(char)); + unsigned char* edgePtr = (unsigned char*) edgeStorage.get(); + sk_bzero(edgePtr, dataWidth*dataHeight*sizeof(char)); // copy glyph into distance field storage init_glyph_data(dataPtr, edgePtr, copyPtr, |