diff options
author | epenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-22 04:37:12 +0000 |
---|---|---|
committer | epenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-22 04:37:12 +0000 |
commit | 9ac01d0a82350aa994c169f1a61a57d474a73227 (patch) | |
tree | 24eccfc4807d4856582e04f7205bea6a48fe96c4 | |
parent | 392b99e300bc61ccf0b22c3f1d3f849af17db9b1 (diff) | |
download | chromium_src-9ac01d0a82350aa994c169f1a61a57d474a73227.zip chromium_src-9ac01d0a82350aa994c169f1a61a57d474a73227.tar.gz chromium_src-9ac01d0a82350aa994c169f1a61a57d474a73227.tar.bz2 |
gpu: Add AtomicFlag to group our atomic ops together.
This made the atomics easier to read/confirm for me.
BUG=173802
Review URL: https://chromiumcodereview.appspot.com/12335020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@184025 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ui/gl/async_pixel_transfer_delegate_android.cc | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/ui/gl/async_pixel_transfer_delegate_android.cc b/ui/gl/async_pixel_transfer_delegate_android.cc index c372082..a594c94 100644 --- a/ui/gl/async_pixel_transfer_delegate_android.cc +++ b/ui/gl/async_pixel_transfer_delegate_android.cc @@ -33,6 +33,32 @@ namespace gfx { namespace { +// Quick and dirty Atomic flag, that we use for +// marking completion from the upload thread. +class AtomicFlag { + public: + AtomicFlag() { + base::subtle::Acquire_Store(&value_, 0); + } + void Set() { + base::subtle::Atomic32 old_value = base::subtle::Acquire_CompareAndSwap( + &value_, 0, 1); + DCHECK_EQ(old_value, 0); + } + void Unset() { + base::subtle::Atomic32 old_value = base::subtle::Release_CompareAndSwap( + &value_, 1, 0); + DCHECK_EQ(old_value, 1); + } + bool IsSet() { + return base::subtle::Acquire_Load(&value_) == 1; + } + private: + base::subtle::Atomic32 value_; + DISALLOW_COPY_AND_ASSIGN(AtomicFlag); +}; + + class TextureUploadStats : public base::RefCountedThreadSafe<TextureUploadStats> { public: @@ -192,12 +218,11 @@ class TransferStateInternal use_image_preserved_(use_image_preserved) { static const AsyncTexImage2DParams zero_params = {0, 0, 0, 0, 0, 0, 0, 0}; late_bind_define_params_ = zero_params; - base::subtle::Acquire_Store(&transfer_in_progress_, 0); } // Implement AsyncPixelTransferState: bool TransferIsInProgress() { - return base::subtle::Acquire_Load(&transfer_in_progress_) == 1; + return transfer_in_progress_.IsSet(); } void BindTransfer(AsyncTexImage2DParams* bound_params) { @@ -269,15 +294,11 @@ class TransferStateInternal } void MarkAsTransferIsInProgress() { - base::subtle::Atomic32 old_value = base::subtle::Acquire_CompareAndSwap( - &transfer_in_progress_, 0, 1); - DCHECK_EQ(old_value, 0); + transfer_in_progress_.Set(); } void MarkAsCompleted() { - base::subtle::Atomic32 old_value = base::subtle::Release_CompareAndSwap( - &transfer_in_progress_, 1, 0); - DCHECK_EQ(old_value, 1); + transfer_in_progress_.Unset(); } protected: @@ -313,7 +334,7 @@ class TransferStateInternal AsyncTexImage2DParams late_bind_define_params_; // Indicates that an async transfer is in progress. - base::subtle::Atomic32 transfer_in_progress_; + AtomicFlag transfer_in_progress_; // It would be nice if we could just create a new EGLImage for // every upload, but I found that didn't work, so this stores |