blob: 76d21b8b260474a61d14312dfcb6c8c8574dd74f [file] [log] [blame]
// Copyright 2015 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.
#ifndef CC_SURFACES_DISPLAY_SCHEDULER_H_
#define CC_SURFACES_DISPLAY_SCHEDULER_H_
#include <memory>
#include "base/cancelable_callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "cc/output/renderer_settings.h"
#include "cc/scheduler/begin_frame_source.h"
#include "cc/surfaces/surface_id.h"
#include "cc/surfaces/surfaces_export.h"
namespace cc {
class BeginFrameSource;
class CC_SURFACES_EXPORT DisplaySchedulerClient {
public:
virtual ~DisplaySchedulerClient() {}
virtual bool DrawAndSwap() = 0;
};
class CC_SURFACES_EXPORT DisplayScheduler : public BeginFrameObserverBase {
public:
DisplayScheduler(base::SingleThreadTaskRunner* task_runner,
int max_pending_swaps);
~DisplayScheduler() override;
void SetClient(DisplaySchedulerClient* client);
void SetBeginFrameSource(BeginFrameSource* begin_frame_source);
void SetVisible(bool visible);
void SetRootSurfaceResourcesLocked(bool locked);
void ForceImmediateSwapIfPossible();
virtual void DisplayResized();
virtual void SetNewRootSurface(const SurfaceId& root_surface_id);
virtual void SurfaceDamaged(const SurfaceId& surface_id);
virtual void DidSwapBuffers();
void DidReceiveSwapBuffersAck();
void OutputSurfaceLost();
// BeginFrameObserverBase implementation
bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override;
void OnBeginFrameSourcePausedChanged(bool paused) override;
protected:
base::TimeTicks DesiredBeginFrameDeadlineTime();
virtual void ScheduleBeginFrameDeadline();
bool AttemptDrawAndSwap();
void OnBeginFrameDeadline();
bool DrawAndSwap();
void StartObservingBeginFrames();
void StopObservingBeginFrames();
bool ShouldDraw();
void DidFinishFrame(bool did_draw);
DisplaySchedulerClient* client_;
BeginFrameSource* begin_frame_source_;
base::SingleThreadTaskRunner* task_runner_;
BeginFrameArgs current_begin_frame_args_;
base::Closure begin_frame_deadline_closure_;
base::CancelableClosure begin_frame_deadline_task_;
base::TimeTicks begin_frame_deadline_task_time_;
base::CancelableClosure missed_begin_frame_task_;
bool inside_surface_damaged_;
bool visible_;
bool output_surface_lost_;
bool root_surface_resources_locked_;
bool inside_begin_frame_deadline_interval_;
bool needs_draw_;
bool expecting_root_surface_damage_because_of_resize_;
bool all_active_child_surfaces_ready_to_draw_;
int next_swap_id_;
int pending_swaps_;
int max_pending_swaps_;
bool observing_begin_frame_source_;
SurfaceId root_surface_id_;
bool root_surface_damaged_;
bool expect_damage_from_root_surface_;
std::set<SurfaceId> child_surface_ids_damaged_;
std::set<SurfaceId> child_surface_ids_damaged_prev_;
std::vector<SurfaceId> child_surface_ids_to_expect_damage_from_;
base::WeakPtrFactory<DisplayScheduler> weak_ptr_factory_;
private:
DISALLOW_COPY_AND_ASSIGN(DisplayScheduler);
};
} // namespace cc
#endif // CC_SURFACES_DISPLAY_SCHEDULER_H_