#include "ui/compositor/recyclable_compositor_mac.h"
#include "base/functional/bind.h"
#include "base/no_destructor.h"
#include "base/task/single_thread_task_runner.h"
#include "components/viz/common/features.h"
#include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
#include "ui/compositor/compositor.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/compositor/compositor_switches.h"
namespace ui {
namespace {
scoped_refptr<base::SingleThreadTaskRunner> GetCompositorTaskRunner() {
scoped_refptr<base::SingleThreadTaskRunner> task_runner =
ui::WindowResizeHelperMac::Get()->task_runner();
return task_runner ? task_runner
: base::SingleThreadTaskRunner::GetCurrentDefault();
}
}
RecyclableCompositorMac::RecyclableCompositorMac(
ui::ContextFactory* context_factory)
: accelerated_widget_mac_(new ui::AcceleratedWidgetMac()),
compositor_(context_factory->AllocateFrameSinkId(),
context_factory,
GetCompositorTaskRunner(),
ui::IsPixelCanvasRecordingEnabled()) {
compositor_.SetAcceleratedWidget(
accelerated_widget_mac_->accelerated_widget());
Suspend();
compositor_.AddObserver(this);
}
RecyclableCompositorMac::~RecyclableCompositorMac() {
compositor_.RemoveObserver(this);
}
void RecyclableCompositorMac::Suspend() {
compositor_suspended_lock_ =
compositor_.GetCompositorLock(nullptr, base::TimeDelta());
}
void RecyclableCompositorMac::Unsuspend() {
compositor_suspended_lock_ = nullptr;
}
void RecyclableCompositorMac::UpdateSurface(
const gfx::Size& size_pixels,
float scale_factor,
const gfx::DisplayColorSpaces& display_color_spaces) {
if (size_pixels != size_pixels_ || scale_factor != scale_factor_) {
size_pixels_ = size_pixels;
scale_factor_ = scale_factor;
local_surface_id_allocator_.GenerateId();
viz::LocalSurfaceId local_surface_id =
local_surface_id_allocator_.GetCurrentLocalSurfaceId();
compositor()->SetScaleAndSize(scale_factor_, size_pixels_,
local_surface_id);
}
if (display_color_spaces != display_color_spaces_) {
display_color_spaces_ = display_color_spaces;
compositor()->SetDisplayColorSpaces(display_color_spaces_);
}
}
void RecyclableCompositorMac::InvalidateSurface() {
size_pixels_ = gfx::Size();
scale_factor_ = 1.f;
local_surface_id_allocator_.Invalidate();
display_color_spaces_ = gfx::DisplayColorSpaces();
compositor()->SetScaleAndSize(
scale_factor_, size_pixels_,
local_surface_id_allocator_.GetCurrentLocalSurfaceId());
compositor()->SetDisplayColorSpaces(gfx::DisplayColorSpaces());
}
void RecyclableCompositorMac::OnCompositingDidCommit(
ui::Compositor* compositor_that_did_commit) {
DCHECK_EQ(compositor_that_did_commit, compositor());
accelerated_widget_mac_->SetSuspended(false);
}
}