blob: d70d99a1dc339eff3c97f6cb82e1d6b53adad022 [file] [log] [blame]
// 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