| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBitmapCache.h" | 8 #include "SkBitmapCache.h" |
| 9 #include "SkMutex.h" | 9 #include "SkMutex.h" |
| 10 #include "SkPixelRef.h" | 10 #include "SkPixelRef.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 SkASSERT(SkIsPow2(PIXELREF_MUTEX_RING_COUNT)); | 53 SkASSERT(SkIsPow2(PIXELREF_MUTEX_RING_COUNT)); |
| 54 | 54 |
| 55 // atomic_inc might be overkill here. It may be fine if once in a while | 55 // atomic_inc might be overkill here. It may be fine if once in a while |
| 56 // we hit a race-condition and two subsequent calls get the same index... | 56 // we hit a race-condition and two subsequent calls get the same index... |
| 57 int index = sk_atomic_inc(&gPixelRefMutexRingIndex); | 57 int index = sk_atomic_inc(&gPixelRefMutexRingIndex); |
| 58 return &gPixelRefMutexRing[index & (PIXELREF_MUTEX_RING_COUNT - 1)]; | 58 return &gPixelRefMutexRing[index & (PIXELREF_MUTEX_RING_COUNT - 1)]; |
| 59 } | 59 } |
| 60 | 60 |
| 61 /////////////////////////////////////////////////////////////////////////////// | 61 /////////////////////////////////////////////////////////////////////////////// |
| 62 #include "SkNextID.h" |
| 62 | 63 |
| 63 static uint32_t next_gen_id() { | 64 uint32_t SkNextID::ImageID() { |
| 64 static uint32_t gNextGenID = 0; | 65 static uint32_t gID = 0; |
| 65 uint32_t genID; | 66 uint32_t id; |
| 66 // Loop in case our global wraps around, as we never want to return a 0. | 67 // Loop in case our global wraps around, as we never want to return a 0. |
| 67 do { | 68 do { |
| 68 genID = sk_atomic_fetch_add(&gNextGenID, 2u) + 2; // Never set the low
bit. | 69 id = sk_atomic_fetch_add(&gID, 2u) + 2; // Never set the low bit. |
| 69 } while (0 == genID); | 70 } while (0 == id); |
| 70 return genID; | 71 return id; |
| 71 } | 72 } |
| 72 | 73 |
| 73 /////////////////////////////////////////////////////////////////////////////// | 74 /////////////////////////////////////////////////////////////////////////////// |
| 74 | 75 |
| 75 void SkPixelRef::setMutex(SkBaseMutex* mutex) { | 76 void SkPixelRef::setMutex(SkBaseMutex* mutex) { |
| 76 if (NULL == mutex) { | 77 if (NULL == mutex) { |
| 77 mutex = get_default_mutex(); | 78 mutex = get_default_mutex(); |
| 78 } | 79 } |
| 79 fMutex = mutex; | 80 fMutex = mutex; |
| 80 } | 81 } |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 return this->onLockPixelsAreWritable(); | 294 return this->onLockPixelsAreWritable(); |
| 294 } | 295 } |
| 295 | 296 |
| 296 bool SkPixelRef::onLockPixelsAreWritable() const { | 297 bool SkPixelRef::onLockPixelsAreWritable() const { |
| 297 return true; | 298 return true; |
| 298 } | 299 } |
| 299 | 300 |
| 300 uint32_t SkPixelRef::getGenerationID() const { | 301 uint32_t SkPixelRef::getGenerationID() const { |
| 301 uint32_t id = fTaggedGenID.load(); | 302 uint32_t id = fTaggedGenID.load(); |
| 302 if (0 == id) { | 303 if (0 == id) { |
| 303 uint32_t next = next_gen_id() | 1u; | 304 uint32_t next = SkNextID::ImageID() | 1u; |
| 304 if (fTaggedGenID.compare_exchange(&id, next)) { | 305 if (fTaggedGenID.compare_exchange(&id, next)) { |
| 305 id = next; // There was no race or we won the race. fTaggedGenID i
s next now. | 306 id = next; // There was no race or we won the race. fTaggedGenID i
s next now. |
| 306 } else { | 307 } else { |
| 307 // We lost a race to set fTaggedGenID. compare_exchange() filled id
with the winner. | 308 // We lost a race to set fTaggedGenID. compare_exchange() filled id
with the winner. |
| 308 } | 309 } |
| 309 // We can't quite SkASSERT(this->genIDIsUnique()). It could be non-uniqu
e | 310 // We can't quite SkASSERT(this->genIDIsUnique()). It could be non-uniqu
e |
| 310 // if we got here via the else path (pretty unlikely, but possible). | 311 // if we got here via the else path (pretty unlikely, but possible). |
| 311 } | 312 } |
| 312 return id & ~1u; // Mask off bottom unique bit. | 313 return id & ~1u; // Mask off bottom unique bit. |
| 313 } | 314 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 } | 405 } |
| 405 | 406 |
| 406 result->fUnlockProc = unlock_legacy_result; | 407 result->fUnlockProc = unlock_legacy_result; |
| 407 result->fUnlockContext = SkRef(this); // this is balanced in our fUnlockPr
oc | 408 result->fUnlockContext = SkRef(this); // this is balanced in our fUnlockPr
oc |
| 408 result->fCTable = fRec.fColorTable; | 409 result->fCTable = fRec.fColorTable; |
| 409 result->fPixels = fRec.fPixels; | 410 result->fPixels = fRec.fPixels; |
| 410 result->fRowBytes = fRec.fRowBytes; | 411 result->fRowBytes = fRec.fRowBytes; |
| 411 result->fSize.set(fInfo.width(), fInfo.height()); | 412 result->fSize.set(fInfo.width(), fInfo.height()); |
| 412 return true; | 413 return true; |
| 413 } | 414 } |
| OLD | NEW |