// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_VIZ_COMMON_FRAME_SINKS_BEGIN_FRAME_SOURCE_H_ #define COMPONENTS_VIZ_COMMON_FRAME_SINKS_BEGIN_FRAME_SOURCE_H_ #include <stddef.h> #include <stdint.h> #include <memory> #include <vector> #include "base/check.h" #include "base/containers/flat_set.h" #include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "build/build_config.h" #include "components/viz/common/display/update_vsync_parameters_callback.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" #include "components/viz/common/frame_sinks/delay_based_time_source.h" namespace perfetto { class EventContext; namespace protos { namespace pbzero { class BeginFrameObserverStateV2; class BeginFrameSourceStateV2; } // namespace pbzero } // namespace protos } // namespace perfetto namespace viz { // (Pure) Interface for observing BeginFrame messages from BeginFrameSource // objects. class VIZ_COMMON_EXPORT BeginFrameObserver { … }; // Simple base class which implements a BeginFrameObserver which checks the // incoming values meet the BeginFrameObserver requirements and implements the // required LastUsedBeginFrameArgs behaviour. // // Users of this class should; // - Implement the OnBeginFrameDerivedImpl function. // - Recommended (but not required) to call // BeginFrameObserverBase::OnValueInto in their overridden OnValueInto // function. class VIZ_COMMON_EXPORT BeginFrameObserverBase : public BeginFrameObserver { … }; class VIZ_COMMON_EXPORT DynamicBeginFrameDeadlineOffsetSource { … }; // Interface for a class which produces BeginFrame calls to a // BeginFrameObserver. // // BeginFrame calls *normally* occur just after a vsync interrupt when input // processing has been finished and provide information about the time values // of the vsync times. *However*, these values can be heavily modified or even // plain made up (when no vsync signal is available or vsync throttling is // turned off). See the BeginFrameObserver for information about the guarantees // all BeginFrameSources *must* provide. class VIZ_COMMON_EXPORT BeginFrameSource { … }; // A BeginFrameSource that does nothing. class VIZ_COMMON_EXPORT StubBeginFrameSource : public BeginFrameSource { … }; // A frame source which ticks itself independently. class VIZ_COMMON_EXPORT SyntheticBeginFrameSource : public BeginFrameSource { … }; // A frame source which calls BeginFrame (at the next possible time) as soon as // an observer acknowledges the prior BeginFrame. class VIZ_COMMON_EXPORT BackToBackBeginFrameSource : public SyntheticBeginFrameSource, public DelayBasedTimeSourceClient { … }; // A frame source which is locked to an external parameters provides from a // vsync source and generates BeginFrameArgs for it. class VIZ_COMMON_EXPORT DelayBasedBeginFrameSource : public SyntheticBeginFrameSource, public DelayBasedTimeSourceClient { … }; class VIZ_COMMON_EXPORT ExternalBeginFrameSourceClient { … }; // A BeginFrameSource that is only ticked manually. Usually the endpoint // of messages from some other thread/process that send OnBeginFrame and // receive SetNeedsBeginFrame messages. This turns such messages back into // an observable BeginFrameSource. class VIZ_COMMON_EXPORT ExternalBeginFrameSource : public BeginFrameSource { … }; } // namespace viz #endif // COMPONENTS_VIZ_COMMON_FRAME_SINKS_BEGIN_FRAME_SOURCE_H_