summaryrefslogtreecommitdiff
path: root/chromium/ui/compositor/compositor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/compositor/compositor.cc')
-rw-r--r--chromium/ui/compositor/compositor.cc100
1 files changed, 74 insertions, 26 deletions
diff --git a/chromium/ui/compositor/compositor.cc b/chromium/ui/compositor/compositor.cc
index 70eab90261e..68e7df216cd 100644
--- a/chromium/ui/compositor/compositor.cc
+++ b/chromium/ui/compositor/compositor.cc
@@ -27,21 +27,24 @@
#include "cc/base/switches.h"
#include "cc/input/input_handler.h"
#include "cc/layers/layer.h"
-#include "cc/output/begin_frame_args.h"
#include "cc/output/latency_info_swap_promise.h"
-#include "cc/scheduler/begin_frame_source.h"
#include "cc/trees/layer_tree_host.h"
#include "cc/trees/layer_tree_settings.h"
+#include "components/viz/common/frame_sinks/begin_frame_args.h"
+#include "components/viz/common/frame_sinks/begin_frame_source.h"
#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/quads/resource_format.h"
+#include "components/viz/common/resources/resource_format.h"
#include "components/viz/common/resources/resource_settings.h"
#include "components/viz/common/surfaces/local_surface_id_allocator.h"
+#include "components/viz/host/host_frame_sink_manager.h"
#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/ui_base_switches.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/compositor/compositor_switches.h"
#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/compositor/dip_util.h"
+#include "ui/compositor/external_begin_frame_client.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animator_collection.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
@@ -57,21 +60,27 @@ Compositor::Compositor(const viz::FrameSinkId& frame_sink_id,
ui::ContextFactory* context_factory,
ui::ContextFactoryPrivate* context_factory_private,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
- bool enable_surface_synchronization)
+ bool enable_surface_synchronization,
+ bool enable_pixel_canvas,
+ bool external_begin_frames_enabled,
+ bool force_software_compositor)
: context_factory_(context_factory),
context_factory_private_(context_factory_private),
frame_sink_id_(frame_sink_id),
task_runner_(task_runner),
vsync_manager_(new CompositorVSyncManager()),
+ external_begin_frames_enabled_(external_begin_frames_enabled),
+ force_software_compositor_(force_software_compositor),
layer_animator_collection_(this),
scheduled_timeout_(base::TimeTicks()),
allow_locks_to_extend_timeout_(false),
+ is_pixel_canvas_(enable_pixel_canvas),
weak_ptr_factory_(this),
lock_timeout_weak_ptr_factory_(this) {
if (context_factory_private) {
- context_factory_private->GetFrameSinkManager()
- ->surface_manager()
- ->RegisterFrameSinkId(frame_sink_id_);
+ auto* host_frame_sink_manager =
+ context_factory_private_->GetHostFrameSinkManager();
+ host_frame_sink_manager->RegisterFrameSinkId(frame_sink_id_, this);
}
root_web_layer_ = cc::Layer::Create();
@@ -162,7 +171,10 @@ Compositor::Compositor(const viz::FrameSinkId& frame_sink_id,
gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE;
settings.disallow_non_exact_resource_reuse =
- command_line->HasSwitch(cc::switches::kDisallowNonExactResourceReuse);
+ command_line->HasSwitch(switches::kDisallowNonExactResourceReuse);
+
+ settings.wait_for_all_pipeline_stages_before_draw =
+ command_line->HasSwitch(cc::switches::kRunAllCompositorStagesBeforeDraw);
base::TimeTicks before_create = base::TimeTicks::Now();
@@ -213,12 +225,14 @@ Compositor::~Compositor() {
context_factory_->RemoveCompositor(this);
if (context_factory_private_) {
- auto* manager = context_factory_private_->GetFrameSinkManager();
+ auto* host_frame_sink_manager =
+ context_factory_private_->GetHostFrameSinkManager();
for (auto& client : child_frame_sinks_) {
DCHECK(client.is_valid());
- manager->UnregisterFrameSinkHierarchy(frame_sink_id_, client);
+ host_frame_sink_manager->UnregisterFrameSinkHierarchy(frame_sink_id_,
+ client);
}
- manager->surface_manager()->InvalidateFrameSinkId(frame_sink_id_);
+ host_frame_sink_manager->InvalidateFrameSinkId(frame_sink_id_);
}
}
@@ -229,8 +243,8 @@ bool Compositor::IsForSubframe() {
void Compositor::AddFrameSink(const viz::FrameSinkId& frame_sink_id) {
if (!context_factory_private_)
return;
- context_factory_private_->GetFrameSinkManager()->RegisterFrameSinkHierarchy(
- frame_sink_id_, frame_sink_id);
+ context_factory_private_->GetHostFrameSinkManager()
+ ->RegisterFrameSinkHierarchy(frame_sink_id_, frame_sink_id);
child_frame_sinks_.insert(frame_sink_id);
}
@@ -240,8 +254,8 @@ void Compositor::RemoveFrameSink(const viz::FrameSinkId& frame_sink_id) {
auto it = child_frame_sinks_.find(frame_sink_id);
DCHECK(it != child_frame_sinks_.end());
DCHECK(it->is_valid());
- context_factory_private_->GetFrameSinkManager()->UnregisterFrameSinkHierarchy(
- frame_sink_id_, *it);
+ context_factory_private_->GetHostFrameSinkManager()
+ ->UnregisterFrameSinkHierarchy(frame_sink_id_, *it);
child_frame_sinks_.erase(it);
}
@@ -312,11 +326,13 @@ void Compositor::SetLatencyInfo(const ui::LatencyInfo& latency_info) {
host_->QueueSwapPromise(std::move(swap_promise));
}
-void Compositor::SetScaleAndSize(float scale, const gfx::Size& size_in_pixel) {
+void Compositor::SetScaleAndSize(float scale,
+ const gfx::Size& size_in_pixel,
+ const viz::LocalSurfaceId& local_surface_id) {
DCHECK_GT(scale, 0);
if (!size_in_pixel.IsEmpty()) {
size_ = size_in_pixel;
- host_->SetViewportSize(size_in_pixel);
+ host_->SetViewportSize(size_in_pixel, local_surface_id);
root_web_layer_->SetBounds(size_in_pixel);
// TODO(fsamuel): Get rid of ContextFactoryPrivate.
if (context_factory_private_)
@@ -325,19 +341,17 @@ void Compositor::SetScaleAndSize(float scale, const gfx::Size& size_in_pixel) {
if (device_scale_factor_ != scale) {
device_scale_factor_ = scale;
host_->SetDeviceScaleFactor(scale);
+ if (is_pixel_canvas())
+ host_->SetRecordingScaleFactor(scale);
if (root_layer_)
root_layer_->OnDeviceScaleFactorChanged(scale);
}
}
void Compositor::SetDisplayColorSpace(const gfx::ColorSpace& color_space) {
- blending_color_space_ = color_space;
- output_color_space_ = blending_color_space_;
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHDR)) {
- blending_color_space_ = gfx::ColorSpace::CreateExtendedSRGB();
- output_color_space_ = gfx::ColorSpace::CreateSCRGBLinear();
- }
- host_->SetRasterColorSpace(color_space.GetParametricApproximation());
+ output_color_space_ = color_space;
+ blending_color_space_ = output_color_space_.GetBlendingColorSpace();
+ host_->SetRasterColorSpace(output_color_space_.GetRasterColorSpace());
// Color space is reset when the output surface is lost, so this must also be
// updated then.
// TODO(fsamuel): Get rid of this.
@@ -392,7 +406,7 @@ void Compositor::SetDisplayVSyncParameters(base::TimeTicks timebase,
}
if (interval.is_zero()) {
// TODO(brianderson): We should not be receiving 0 intervals.
- interval = cc::BeginFrameArgs::DefaultInterval();
+ interval = viz::BeginFrameArgs::DefaultInterval();
}
DCHECK_GT(interval.InMillisecondsF(), 0);
refresh_rate_ =
@@ -433,6 +447,34 @@ scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const {
return vsync_manager_;
}
+void Compositor::IssueExternalBeginFrame(const viz::BeginFrameArgs& args) {
+ DCHECK(external_begin_frames_enabled_);
+ if (context_factory_private_)
+ context_factory_private_->IssueExternalBeginFrame(this, args);
+}
+
+void Compositor::SetExternalBeginFrameClient(ExternalBeginFrameClient* client) {
+ DCHECK(external_begin_frames_enabled_);
+ external_begin_frame_client_ = client;
+ if (needs_external_begin_frames_)
+ external_begin_frame_client_->OnNeedsExternalBeginFrames(true);
+}
+
+void Compositor::OnDisplayDidFinishFrame(const viz::BeginFrameAck& ack) {
+ DCHECK(external_begin_frames_enabled_);
+ if (external_begin_frame_client_)
+ external_begin_frame_client_->OnDisplayDidFinishFrame(ack);
+}
+
+void Compositor::OnNeedsExternalBeginFrames(bool needs_begin_frames) {
+ DCHECK(external_begin_frames_enabled_);
+ if (external_begin_frame_client_) {
+ external_begin_frame_client_->OnNeedsExternalBeginFrames(
+ needs_begin_frames);
+ }
+ needs_external_begin_frames_ = needs_begin_frames;
+}
+
void Compositor::AddObserver(CompositorObserver* observer) {
observer_list_.AddObserver(observer);
}
@@ -460,7 +502,7 @@ bool Compositor::HasAnimationObserver(
return animation_observer_list_.HasObserver(observer);
}
-void Compositor::BeginMainFrame(const cc::BeginFrameArgs& args) {
+void Compositor::BeginMainFrame(const viz::BeginFrameArgs& args) {
DCHECK(!IsLocked());
for (auto& observer : animation_observer_list_)
observer.OnAnimationStep(args.frame_time);
@@ -517,6 +559,12 @@ void Compositor::DidSubmitCompositorFrame() {
observer.OnCompositingStarted(this, start_time);
}
+void Compositor::OnFirstSurfaceActivation(
+ const viz::SurfaceInfo& surface_info) {
+ // TODO(fsamuel): Once surface synchronization is turned on, the fallback
+ // surface should be set here.
+}
+
void Compositor::SetOutputIsSecure(bool output_is_secure) {
if (context_factory_private_)
context_factory_private_->SetOutputIsSecure(this, output_is_secure);