summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorepenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-22 04:37:12 +0000
committerepenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-22 04:37:12 +0000
commit9ac01d0a82350aa994c169f1a61a57d474a73227 (patch)
tree24eccfc4807d4856582e04f7205bea6a48fe96c4
parent392b99e300bc61ccf0b22c3f1d3f849af17db9b1 (diff)
downloadchromium_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.cc39
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