Merge pull request #11728 from brenca/osr-gpu-update-master

Improve OSR API (master)
This commit is contained in:
John Kleinschmidt 2018-02-12 12:29:11 -05:00 committed by GitHub
commit e6ac2637d3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 94 additions and 31 deletions

View file

@ -378,8 +378,8 @@ WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
options.Get("transparent", &transparent); options.Get("transparent", &transparent);
content::WebContents::CreateParams params(session->browser_context()); content::WebContents::CreateParams params(session->browser_context());
auto* view = new OffScreenWebContentsView( auto* view = new OffScreenWebContentsView(transparent,
transparent, base::Bind(&WebContents::OnPaint, base::Unretained(this))); base::Bind(&WebContents::OnPaint, base::Unretained(this)));
params.view = view; params.view = view;
params.delegate_view = view; params.delegate_view = view;
@ -1652,10 +1652,10 @@ void WebContents::StartPainting() {
return; return;
#if defined(ENABLE_OSR) #if defined(ENABLE_OSR)
auto* osr_rwhv = static_cast<OffScreenRenderWidgetHostView*>( const auto* wc_impl = static_cast<content::WebContentsImpl*>(web_contents());
web_contents()->GetRenderWidgetHostView()); auto* osr_wcv = static_cast<OffScreenWebContentsView*>(wc_impl->GetView());
if (osr_rwhv) if (osr_wcv)
osr_rwhv->SetPainting(true); osr_wcv->SetPainting(true);
#endif #endif
} }
@ -1664,10 +1664,10 @@ void WebContents::StopPainting() {
return; return;
#if defined(ENABLE_OSR) #if defined(ENABLE_OSR)
auto* osr_rwhv = static_cast<OffScreenRenderWidgetHostView*>( const auto* wc_impl = static_cast<content::WebContentsImpl*>(web_contents());
web_contents()->GetRenderWidgetHostView()); auto* osr_wcv = static_cast<OffScreenWebContentsView*>(wc_impl->GetView());
if (osr_rwhv) if (osr_wcv)
osr_rwhv->SetPainting(false); osr_wcv->SetPainting(false);
#endif #endif
} }
@ -1676,9 +1676,10 @@ bool WebContents::IsPainting() const {
return false; return false;
#if defined(ENABLE_OSR) #if defined(ENABLE_OSR)
const auto* osr_rwhv = static_cast<OffScreenRenderWidgetHostView*>( const auto* wc_impl = static_cast<content::WebContentsImpl*>(web_contents());
web_contents()->GetRenderWidgetHostView()); auto* osr_wcv = static_cast<OffScreenWebContentsView*>(wc_impl->GetView());
return osr_rwhv && osr_rwhv->IsPainting();
return osr_wcv && osr_wcv->IsPainting();
#else #else
return false; return false;
#endif #endif
@ -1689,10 +1690,11 @@ void WebContents::SetFrameRate(int frame_rate) {
return; return;
#if defined(ENABLE_OSR) #if defined(ENABLE_OSR)
auto* osr_rwhv = static_cast<OffScreenRenderWidgetHostView*>( const auto* wc_impl = static_cast<content::WebContentsImpl*>(web_contents());
web_contents()->GetRenderWidgetHostView()); auto* osr_wcv = static_cast<OffScreenWebContentsView*>(wc_impl->GetView());
if (osr_rwhv)
osr_rwhv->SetFrameRate(frame_rate); if (osr_wcv)
osr_wcv->SetFrameRate(frame_rate);
#endif #endif
} }
@ -1701,9 +1703,10 @@ int WebContents::GetFrameRate() const {
return 0; return 0;
#if defined(ENABLE_OSR) #if defined(ENABLE_OSR)
const auto* osr_rwhv = static_cast<OffScreenRenderWidgetHostView*>( const auto* wc_impl = static_cast<content::WebContentsImpl*>(web_contents());
web_contents()->GetRenderWidgetHostView()); auto* osr_wcv = static_cast<OffScreenWebContentsView*>(wc_impl->GetView());
return osr_rwhv ? osr_rwhv->GetFrameRate() : 0;
return osr_wcv ? osr_wcv->GetFrameRate() : 0;
#else #else
return 0; return 0;
#endif #endif

View file

@ -124,7 +124,7 @@ class AtomCopyFrameGenerator {
} }
void GenerateCopyFrame(const gfx::Rect& damage_rect) { void GenerateCopyFrame(const gfx::Rect& damage_rect) {
if (!view_->render_widget_host()) if (!view_->render_widget_host() || !view_->IsPainting())
return; return;
std::unique_ptr<cc::CopyOutputRequest> request = std::unique_ptr<cc::CopyOutputRequest> request =
@ -255,6 +255,8 @@ class AtomBeginFrameTimer : public cc::DelayBasedTimeSourceClient {
OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView( OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
bool transparent, bool transparent,
bool painting,
int frame_rate,
const OnPaintCallback& callback, const OnPaintCallback& callback,
content::RenderWidgetHost* host, content::RenderWidgetHost* host,
OffScreenRenderWidgetHostView* parent_host_view, OffScreenRenderWidgetHostView* parent_host_view,
@ -268,17 +270,18 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
transparent_(transparent), transparent_(transparent),
callback_(callback), callback_(callback),
parent_callback_(nullptr), parent_callback_(nullptr),
frame_rate_(60), frame_rate_(frame_rate),
frame_rate_threshold_us_(0), frame_rate_threshold_us_(0),
last_time_(base::Time::Now()), last_time_(base::Time::Now()),
scale_factor_(kDefaultScaleFactor), scale_factor_(kDefaultScaleFactor),
size_(native_window->GetSize()), size_(native_window->GetSize()),
painting_(true), painting_(painting),
is_showing_(!render_widget_host_->is_hidden()), is_showing_(!render_widget_host_->is_hidden()),
is_destroyed_(false), is_destroyed_(false),
popup_position_(gfx::Rect()), popup_position_(gfx::Rect()),
hold_resize_(false), hold_resize_(false),
pending_resize_(false), pending_resize_(false),
paint_callback_running_(false),
renderer_compositor_frame_sink_(nullptr), renderer_compositor_frame_sink_(nullptr),
background_color_(SkColor()), background_color_(SkColor()),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
@ -303,7 +306,7 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
new ui::Compositor(context_factory_private->AllocateFrameSinkId(), new ui::Compositor(context_factory_private->AllocateFrameSinkId(),
content::GetContextFactory(), context_factory_private, content::GetContextFactory(), context_factory_private,
base::ThreadTaskRunnerHandle::Get(), false)); base::ThreadTaskRunnerHandle::Get(), false));
compositor_->SetAcceleratedWidget(native_window_->GetAcceleratedWidget()); compositor_->SetAcceleratedWidget(gfx::kNullAcceleratedWidget);
compositor_->SetRootLayer(root_layer_.get()); compositor_->SetRootLayer(root_layer_.get());
#endif #endif
GetCompositor()->SetDelegate(this); GetCompositor()->SetDelegate(this);
@ -737,6 +740,8 @@ content::RenderWidgetHostViewBase*
return new OffScreenRenderWidgetHostView( return new OffScreenRenderWidgetHostView(
transparent_, transparent_,
true,
embedder_host_view->GetFrameRate(),
callback_, callback_,
render_widget_host, render_widget_host,
embedder_host_view, embedder_host_view,
@ -928,7 +933,7 @@ bool OffScreenRenderWidgetHostView::IsAutoResizeEnabled() const {
void OffScreenRenderWidgetHostView::SetNeedsBeginFrames( void OffScreenRenderWidgetHostView::SetNeedsBeginFrames(
bool needs_begin_frames) { bool needs_begin_frames) {
SetupFrameRate(false); SetupFrameRate(true);
begin_frame_timer_->SetActive(needs_begin_frames); begin_frame_timer_->SetActive(needs_begin_frames);
@ -999,7 +1004,9 @@ void OffScreenRenderWidgetHostView::OnPaint(
} }
damage.Intersect(GetViewBounds()); damage.Intersect(GetViewBounds());
paint_callback_running_ = true;
callback_.Run(damage, bitmap); callback_.Run(damage, bitmap);
paint_callback_running_ = false;
for (size_t i = 0; i < damages.size(); i++) { for (size_t i = 0; i < damages.size(); i++) {
CopyBitmapTo(bitmap, originals[i], damages[i]); CopyBitmapTo(bitmap, originals[i], damages[i]);
@ -1147,7 +1154,7 @@ void OffScreenRenderWidgetHostView::SetPainting(bool painting) {
painting_ = painting; painting_ = painting;
if (software_output_device_) { if (software_output_device_) {
software_output_device_->SetActive(painting_, true); software_output_device_->SetActive(painting_, !paint_callback_running_);
} }
} }
@ -1164,16 +1171,16 @@ void OffScreenRenderWidgetHostView::SetFrameRate(int frame_rate) {
} else { } else {
if (frame_rate <= 0) if (frame_rate <= 0)
frame_rate = 1; frame_rate = 1;
if (frame_rate > 60) if (frame_rate > 240)
frame_rate = 60; frame_rate = 240;
frame_rate_ = frame_rate; frame_rate_ = frame_rate;
} }
SetupFrameRate(true);
for (auto guest_host_view : guest_host_views_) for (auto guest_host_view : guest_host_views_)
guest_host_view->SetFrameRate(frame_rate); guest_host_view->SetFrameRate(frame_rate);
SetupFrameRate(true);
} }
int OffScreenRenderWidgetHostView::GetFrameRate() const { int OffScreenRenderWidgetHostView::GetFrameRate() const {
@ -1201,7 +1208,7 @@ void OffScreenRenderWidgetHostView::SetupFrameRate(bool force) {
frame_rate_threshold_us_ = 1000000 / frame_rate_; frame_rate_threshold_us_ = 1000000 / frame_rate_;
GetCompositor()->vsync_manager()->SetAuthoritativeVSyncInterval( GetCompositor()->SetAuthoritativeVSyncInterval(
base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_)); base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_));
if (copy_frame_generator_.get()) { if (copy_frame_generator_.get()) {

View file

@ -74,6 +74,8 @@ class OffScreenRenderWidgetHostView
public OffscreenViewProxyObserver { public OffscreenViewProxyObserver {
public: public:
OffScreenRenderWidgetHostView(bool transparent, OffScreenRenderWidgetHostView(bool transparent,
bool painting,
int frame_rate,
const OnPaintCallback& callback, const OnPaintCallback& callback,
content::RenderWidgetHost* render_widget_host, content::RenderWidgetHost* render_widget_host,
OffScreenRenderWidgetHostView* parent_host_view, OffScreenRenderWidgetHostView* parent_host_view,
@ -315,6 +317,8 @@ class OffScreenRenderWidgetHostView
bool hold_resize_; bool hold_resize_;
bool pending_resize_; bool pending_resize_;
bool paint_callback_running_;
std::unique_ptr<ui::Layer> root_layer_; std::unique_ptr<ui::Layer> root_layer_;
std::unique_ptr<ui::Compositor> compositor_; std::unique_ptr<ui::Compositor> compositor_;
std::unique_ptr<content::DelegatedFrameHost> delegated_frame_host_; std::unique_ptr<content::DelegatedFrameHost> delegated_frame_host_;

View file

@ -15,6 +15,8 @@ namespace atom {
OffScreenWebContentsView::OffScreenWebContentsView( OffScreenWebContentsView::OffScreenWebContentsView(
bool transparent, const OnPaintCallback& callback) bool transparent, const OnPaintCallback& callback)
: transparent_(transparent), : transparent_(transparent),
painting_(true),
frame_rate_(60),
callback_(callback), callback_(callback),
web_contents_(nullptr) { web_contents_(nullptr) {
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
@ -103,6 +105,8 @@ content::RenderWidgetHostViewBase*
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
return new OffScreenRenderWidgetHostView( return new OffScreenRenderWidgetHostView(
transparent_, transparent_,
painting_,
GetFrameRate(),
callback_, callback_,
render_widget_host, render_widget_host,
nullptr, nullptr,
@ -125,6 +129,8 @@ content::RenderWidgetHostViewBase*
return new OffScreenRenderWidgetHostView( return new OffScreenRenderWidgetHostView(
transparent_, transparent_,
true,
view->GetFrameRate(),
callback_, callback_,
render_widget_host, render_widget_host,
view, view,
@ -202,6 +208,42 @@ void OffScreenWebContentsView::UpdateDragCursor(
blink::WebDragOperation operation) { blink::WebDragOperation operation) {
} }
void OffScreenWebContentsView::SetPainting(bool painting) {
auto* view = GetView();
if (view != nullptr) {
view->SetPainting(painting);
} else {
painting_ = painting;
}
}
bool OffScreenWebContentsView::IsPainting() const {
auto* view = GetView();
if (view != nullptr) {
return view->IsPainting();
} else {
return painting_;
}
}
void OffScreenWebContentsView::SetFrameRate(int frame_rate) {
auto* view = GetView();
if (view != nullptr) {
view->SetFrameRate(frame_rate);
} else {
frame_rate_ = frame_rate;
}
}
int OffScreenWebContentsView::GetFrameRate() const {
auto* view = GetView();
if (view != nullptr) {
return view->GetFrameRate();
} else {
return frame_rate_;
}
}
OffScreenRenderWidgetHostView* OffScreenWebContentsView::GetView() const { OffScreenRenderWidgetHostView* OffScreenWebContentsView::GetView() const {
if (web_contents_) { if (web_contents_) {
return static_cast<OffScreenRenderWidgetHostView*>( return static_cast<OffScreenRenderWidgetHostView*>(

View file

@ -69,6 +69,11 @@ class OffScreenWebContentsView : public content::WebContentsView,
content::RenderWidgetHostImpl* source_rwh) override; content::RenderWidgetHostImpl* source_rwh) override;
void UpdateDragCursor(blink::WebDragOperation operation) override; void UpdateDragCursor(blink::WebDragOperation operation) override;
void SetPainting(bool painting);
bool IsPainting() const;
void SetFrameRate(int frame_rate);
int GetFrameRate() const;
private: private:
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
void PlatformCreate(); void PlatformCreate();
@ -78,6 +83,8 @@ class OffScreenWebContentsView : public content::WebContentsView,
OffScreenRenderWidgetHostView* GetView() const; OffScreenRenderWidgetHostView* GetView() const;
const bool transparent_; const bool transparent_;
bool painting_;
int frame_rate_;
OnPaintCallback callback_; OnPaintCallback callback_;
// Weak refs. // Weak refs.