Clients can provide preallocated storage to clipstack
authorMike Reed <reed@google.com>
Fri, 10 Mar 2017 04:56:25 +0000 (23:56 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 10 Mar 2017 14:12:49 +0000 (14:12 +0000)
This allows devices (gpu, pdf) which are themselves always dynamically allocated
(since they are reference counted) to provide storage to clipstack, allowing it
to avoid calls to malloc.

Previously this was attempted by embedding the storage directly in clipstack,
but that increased the size of clipstack in all instances, even those where
it might be on the stack. This can be problematic for small-stack environments
like servers.

See previous (reverted) CL: https://skia-review.googlesource.com/c/9522/

BUG=skia:

Change-Id: Ifc7f5ef411303f33513195b1502ea9f281e995c5
Reviewed-on: https://skia-review.googlesource.com/9508
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Mike Reed <reed@google.com>

src/core/SkClipStack.cpp
src/core/SkClipStack.h
src/core/SkClipStackDevice.h

index f41945e..a2621a9 100644 (file)
@@ -499,6 +499,11 @@ SkClipStack::SkClipStack()
     , fSaveCount(0) {
 }
 
+SkClipStack::SkClipStack(void* storage, size_t size)
+    : fDeque(sizeof(Element), storage, size, kDefaultElementAllocCnt)
+    , fSaveCount(0) {
+}
+
 SkClipStack::SkClipStack(const SkClipStack& b)
     : fDeque(sizeof(Element), kDefaultElementAllocCnt) {
     *this = b;
index 080712d..215e287 100644 (file)
@@ -327,6 +327,7 @@ public:
     };
 
     SkClipStack();
+    SkClipStack(void* storage, size_t size);
     SkClipStack(const SkClipStack& b);
     ~SkClipStack();
 
index 1f1c7d6..1dd321d 100644 (file)
@@ -15,6 +15,7 @@ class SK_API SkClipStackDevice : public SkBaseDevice {
 public:
     SkClipStackDevice(const SkImageInfo& info, const SkSurfaceProps& props)
         : SkBaseDevice(info, props)
+        , fClipStack(fStorage, sizeof(fStorage))
     {}
 
     const SkClipStack& cs() const { return fClipStack; }
@@ -34,6 +35,10 @@ protected:
     ClipType onGetClipType() const override;
 
 private:
+    enum {
+        kPreallocCount = 16 // empirically determined, adjust as needed to reduce mallocs
+    };
+    intptr_t fStorage[kPreallocCount * sizeof(SkClipStack::Element) / sizeof(intptr_t)];
     SkClipStack fClipStack;
 
     typedef SkBaseDevice INHERITED;