#ifndef GPU_COMMAND_BUFFER_COMMON_ACTIVITY_FLAGS_H_
#define GPU_COMMAND_BUFFER_COMMON_ACTIVITY_FLAGS_H_
#include "base/atomicops.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "gpu/gpu_export.h"
namespace gpu {
class GPU_EXPORT ActivityFlagsBase {
public:
enum Flag : uint32_t { FLAG_LOADING_PROGRAM_BINARY = 0x1 };
protected:
ActivityFlagsBase();
ActivityFlagsBase(ActivityFlagsBase&& other);
~ActivityFlagsBase();
void Initialize(base::UnsafeSharedMemoryRegion region);
const base::UnsafeSharedMemoryRegion& region() const { return region_; }
bool is_initialized() const { return region().IsValid(); }
protected:
volatile base::subtle::Atomic32* AsAtomic();
private:
base::UnsafeSharedMemoryRegion region_;
base::WritableSharedMemoryMapping mapping_;
};
class GPU_EXPORT GpuProcessActivityFlags : public ActivityFlagsBase {
public:
class ScopedSetFlag {
public:
ScopedSetFlag(GpuProcessActivityFlags* activity_flags, Flag flag)
: activity_flags_(activity_flags), flag_(flag) {
activity_flags_->SetFlag(flag_);
}
~ScopedSetFlag() { activity_flags_->UnsetFlag(flag_); }
private:
raw_ptr<GpuProcessActivityFlags> activity_flags_;
Flag flag_;
};
GpuProcessActivityFlags();
GpuProcessActivityFlags(GpuProcessActivityFlags&& other);
explicit GpuProcessActivityFlags(base::UnsafeSharedMemoryRegion region);
private:
void SetFlag(Flag flag);
void UnsetFlag(Flag flag);
};
class GPU_EXPORT GpuProcessHostActivityFlags : public ActivityFlagsBase {
public:
GpuProcessHostActivityFlags();
bool IsFlagSet(Flag flag);
base::UnsafeSharedMemoryRegion CloneRegion() { return region().Duplicate(); }
};
}
#endif