From c4a0d73e9aebcb7d291aa3eb8d5b6926d9a0b77e Mon Sep 17 00:00:00 2001 From: mtklein Date: Mon, 4 Jan 2016 19:02:52 -0800 Subject: [PATCH] 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 --- src/core/SkDistanceFieldGen.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/core/SkDistanceFieldGen.cpp b/src/core/SkDistanceFieldGen.cpp index 4f4de56..30354e0 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, -- 2.7.4