| Index: src/core/SkPicture.cpp
|
| diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
|
| index c7e36e7ecd2a6e99eb12b0395925dcda65a29657..a8ddfe6656d5b18446aca9e59f3ae604ad18bf54 100644
|
| --- a/src/core/SkPicture.cpp
|
| +++ b/src/core/SkPicture.cpp
|
| @@ -12,6 +12,7 @@
|
| #include "SkPictureRecord.h"
|
| #include "SkPictureRecorder.h"
|
|
|
| +#include "SkAtomics.h"
|
| #include "SkBitmapDevice.h"
|
| #include "SkCanvas.h"
|
| #include "SkChunkAlloc.h"
|
| @@ -46,18 +47,6 @@ template <typename T> int SafeCount(const T* obj) {
|
| return obj ? obj->count() : 0;
|
| }
|
|
|
| -static int32_t gPictureGenerationID;
|
| -
|
| -// never returns a 0
|
| -static int32_t next_picture_generation_id() {
|
| - // Loop in case our global wraps around.
|
| - int32_t genID;
|
| - do {
|
| - genID = sk_atomic_inc(&gPictureGenerationID) + 1;
|
| - } while (0 == genID);
|
| - return genID;
|
| -}
|
| -
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| namespace {
|
| @@ -247,7 +236,7 @@ bool SkPicture::Analysis::suitableForGpuRasterization(const char** reason,
|
| numSlowPathDashedPaths -= fNumFastPathDashEffects;
|
| }
|
|
|
| - int numSlowPaths = fNumAAConcavePaths -
|
| + int numSlowPaths = fNumAAConcavePaths -
|
| fNumAAHairlineConcavePaths -
|
| fNumAADFEligibleConcavePaths;
|
|
|
| @@ -270,9 +259,13 @@ SkPicture const* const* SkPicture::drawablePicts() const {
|
| }
|
|
|
| SkPicture::~SkPicture() {
|
| - SkPicture::DeletionMessage msg;
|
| - msg.fUniqueID = this->uniqueID();
|
| - SkMessageBus<SkPicture::DeletionMessage>::Post(msg);
|
| + // If the ID is still zero, no one has read it, so no need to send this message.
|
| + uint32_t id = sk_atomic_load(&fUniqueID, sk_memory_order_relaxed);
|
| + if (id != 0) {
|
| + SkPicture::DeletionMessage msg;
|
| + msg.fUniqueID = id;
|
| + SkMessageBus<SkPicture::DeletionMessage>::Post(msg);
|
| + }
|
| }
|
|
|
| void SkPicture::EXPERIMENTAL_addAccelData(const SkPicture::AccelData* data) const {
|
| @@ -488,10 +481,27 @@ int SkPicture::approximateOpCount() const { return fRecord->count(); }
|
|
|
| SkPicture::SkPicture(const SkRect& cullRect, SkRecord* record, SnapshotArray* drawablePicts,
|
| SkBBoxHierarchy* bbh)
|
| - : fUniqueID(next_picture_generation_id())
|
| + : fUniqueID(0)
|
| , fCullRect(cullRect)
|
| , fRecord(SkRef(record))
|
| , fBBH(SkSafeRef(bbh))
|
| , fDrawablePicts(drawablePicts) // take ownership
|
| , fAnalysis(*fRecord)
|
| {}
|
| +
|
| +
|
| +static uint32_t gNextID = 1;
|
| +uint32_t SkPicture::uniqueID() const {
|
| + uint32_t id = sk_atomic_load(&fUniqueID, sk_memory_order_relaxed);
|
| + while (id == 0) {
|
| + uint32_t next = sk_atomic_fetch_add(&gNextID, 1u);
|
| + if (sk_atomic_compare_exchange(&fUniqueID, &id, next,
|
| + sk_memory_order_relaxed,
|
| + sk_memory_order_relaxed)) {
|
| + id = next;
|
| + } else {
|
| + // sk_atomic_compare_exchange replaced id with the current value of fUniqueID.
|
| + }
|
| + }
|
| + return id;
|
| +}
|
|
|