| Index: gpu/command_buffer/common/activity_flags.cc
|
| diff --git a/gpu/command_buffer/common/activity_flags.cc b/gpu/command_buffer/common/activity_flags.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d70d99a1dc339eff3c97f6cb82e1d6b53adad022
|
| --- /dev/null
|
| +++ b/gpu/command_buffer/common/activity_flags.cc
|
| @@ -0,0 +1,75 @@
|
| +// Copyright (c) 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "gpu/command_buffer/common/activity_flags.h"
|
| +
|
| +namespace gpu {
|
| +
|
| +ActivityFlagsBase::ActivityFlagsBase() = default;
|
| +ActivityFlagsBase::ActivityFlagsBase(ActivityFlagsBase&& other) = default;
|
| +ActivityFlagsBase::~ActivityFlagsBase() = default;
|
| +
|
| +void ActivityFlagsBase::Initialize(mojo::ScopedSharedBufferHandle handle) {
|
| + handle_ = std::move(handle);
|
| + mapping_ = handle_->Map(sizeof(Flag));
|
| +}
|
| +
|
| +volatile base::subtle::Atomic32* ActivityFlagsBase::AsAtomic() {
|
| + return reinterpret_cast<volatile base::subtle::Atomic32*>(mapping_.get());
|
| +}
|
| +
|
| +GpuProcessActivityFlags::GpuProcessActivityFlags() = default;
|
| +GpuProcessActivityFlags::GpuProcessActivityFlags(
|
| + GpuProcessActivityFlags&& other) = default;
|
| +
|
| +GpuProcessActivityFlags::GpuProcessActivityFlags(
|
| + mojo::ScopedSharedBufferHandle handle) {
|
| + // In cases where we are running without a GpuProcessHost, we may not
|
| + // have a valid handle. In this case, just return.
|
| + if (!handle.is_valid())
|
| + return;
|
| +
|
| + Initialize(std::move(handle));
|
| +}
|
| +
|
| +void GpuProcessActivityFlags::SetFlag(Flag flag) {
|
| + // In cases where we are running without a GpuProcessHost, we may not
|
| + // initialize the GpuProcessActivityFlags. In this case, just return.
|
| + if (!is_initialized())
|
| + return;
|
| +
|
| + base::subtle::Atomic32 old_value = base::subtle::NoBarrier_Load(AsAtomic());
|
| + base::subtle::Atomic32 new_value = old_value | flag;
|
| +
|
| + // These flags are only written by a single process / single thread.
|
| + // We should never double-set them.
|
| + DCHECK(!(old_value & flag));
|
| + base::subtle::Acquire_Store(AsAtomic(), new_value);
|
| +}
|
| +
|
| +void GpuProcessActivityFlags::UnsetFlag(Flag flag) {
|
| + // In cases where we are running without a GpuProcessHost, we may not
|
| + // initialize the GpuProcessActivityFlags. In this case, just return.
|
| + if (!is_initialized())
|
| + return;
|
| +
|
| + base::subtle::Atomic32 old_value = base::subtle::NoBarrier_Load(AsAtomic());
|
| + base::subtle::Atomic32 new_value = old_value ^ flag;
|
| +
|
| + // These flags are only written by a single process / single thread.
|
| + // We should never double-unset them.
|
| + DCHECK(!!(old_value & flag));
|
| + base::subtle::Release_Store(AsAtomic(), new_value);
|
| +}
|
| +
|
| +GpuProcessHostActivityFlags::GpuProcessHostActivityFlags() {
|
| + Initialize(mojo::SharedBufferHandle::Create(sizeof(Flag)));
|
| +}
|
| +
|
| +bool GpuProcessHostActivityFlags::IsFlagSet(Flag flag) {
|
| + DCHECK(is_initialized());
|
| + return !!(base::subtle::Acquire_Load(AsAtomic()) & flag);
|
| +}
|
| +
|
| +} // namespace gpu
|
|
|