diff --git a/atom/browser/osr/osr_output_device.cc b/atom/browser/osr/osr_output_device.cc index b08732c488f1..ed444dca7568 100644 --- a/atom/browser/osr/osr_output_device.cc +++ b/atom/browser/osr/osr_output_device.cc @@ -84,12 +84,16 @@ void OffScreenOutputDevice::SetActive(bool active, bool paint) { return; active_ = active; - if (active_ && paint) + if (!active_ && !pending_damage_rect_.IsEmpty() && paint) OnPaint(gfx::Rect(viewport_pixel_size_)); } void OffScreenOutputDevice::OnPaint(const gfx::Rect& damage_rect) { gfx::Rect rect = damage_rect; + if (!pending_damage_rect_.IsEmpty()) { + rect.Union(pending_damage_rect_); + pending_damage_rect_.SetRect(0, 0, 0, 0); + } rect.Intersect(gfx::Rect(viewport_pixel_size_)); if (rect.IsEmpty()) diff --git a/atom/browser/osr/osr_output_device.h b/atom/browser/osr/osr_output_device.h index a65865316fa4..f76b3b28e8c2 100644 --- a/atom/browser/osr/osr_output_device.h +++ b/atom/browser/osr/osr_output_device.h @@ -35,6 +35,7 @@ class OffScreenOutputDevice : public cc::SoftwareOutputDevice { std::unique_ptr canvas_; std::unique_ptr bitmap_; + gfx::Rect pending_damage_rect_; DISALLOW_COPY_AND_ASSIGN(OffScreenOutputDevice); }; diff --git a/atom/browser/osr/osr_render_widget_host_view.cc b/atom/browser/osr/osr_render_widget_host_view.cc index bf2763406106..8818c0dfcbbe 100644 --- a/atom/browser/osr/osr_render_widget_host_view.cc +++ b/atom/browser/osr/osr_render_widget_host_view.cc @@ -16,7 +16,7 @@ #include "base/time/time.h" #include "cc/output/copy_output_request.h" #include "cc/scheduler/delay_based_time_source.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/common/gl_helper.h" #include "content/browser/renderer_host/compositor_resize_lock.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_impl.h" @@ -378,9 +378,8 @@ void OffScreenRenderWidgetHostView::SendBeginFrame( DCHECK(begin_frame_args.IsValid()); begin_frame_number_++; - render_widget_host_->Send(new ViewMsg_BeginFrame( - render_widget_host_->GetRoutingID(), - begin_frame_args)); + if (renderer_compositor_frame_sink_) + renderer_compositor_frame_sink_->OnBeginFrame(begin_frame_args); } bool OffScreenRenderWidgetHostView::OnMessageReceived( @@ -528,7 +527,7 @@ void OffScreenRenderWidgetHostView::UnlockMouse() { } void OffScreenRenderWidgetHostView::DidCreateNewRendererCompositorFrameSink( - cc::mojom::MojoCompositorFrameSinkClient* renderer_compositor_frame_sink) { + cc::mojom::CompositorFrameSinkClient* renderer_compositor_frame_sink) { renderer_compositor_frame_sink_ = renderer_compositor_frame_sink; if (GetDelegatedFrameHost()) { GetDelegatedFrameHost()->DidCreateNewRendererCompositorFrameSink( @@ -537,7 +536,7 @@ void OffScreenRenderWidgetHostView::DidCreateNewRendererCompositorFrameSink( } void OffScreenRenderWidgetHostView::SubmitCompositorFrame( - const cc::LocalSurfaceId& local_surface_id, + const viz::LocalSurfaceId& local_surface_id, cc::CompositorFrame frame) { TRACE_EVENT0("electron", "OffScreenRenderWidgetHostView::SubmitCompositorFrame"); @@ -778,8 +777,7 @@ OffScreenRenderWidgetHostView::DelegatedFrameHostCreateResizeLock() { return base::MakeUnique(this, desired_size); } -void -OffScreenRenderWidgetHostView::OnBeginFrame(const cc::BeginFrameArgs& args) { +void OffScreenRenderWidgetHostView::OnBeginFrame() { } std::unique_ptr @@ -796,7 +794,7 @@ void OffScreenRenderWidgetHostView::CompositorResizeLockEnded() { bool OffScreenRenderWidgetHostView::TransformPointToLocalCoordSpace( const gfx::Point& point, - const cc::SurfaceId& original_surface, + const viz::SurfaceId& original_surface, gfx::Point* transformed_point) { // Transformations use physical pixels rather than DIP, so conversion // is necessary. @@ -1014,7 +1012,7 @@ void OffScreenRenderWidgetHostView::OnPaint( void OffScreenRenderWidgetHostView::OnPopupPaint( const gfx::Rect& damage_rect, const SkBitmap& bitmap) { if (popup_host_view_ && popup_bitmap_.get()) - bitmap.deepCopyTo(popup_bitmap_.get()); + popup_bitmap_.reset(new SkBitmap(bitmap)); InvalidateBounds(popup_host_view_->popup_position_); } @@ -1055,10 +1053,11 @@ void OffScreenRenderWidgetHostView::WasResized() { } void OffScreenRenderWidgetHostView::ProcessKeyboardEvent( - const content::NativeWebKeyboardEvent& event) { + const content::NativeWebKeyboardEvent& event, + const ui::LatencyInfo& latency) { if (!render_widget_host_) return; - render_widget_host_->ForwardKeyboardEvent(event); + render_widget_host_->ForwardKeyboardEventWithLatencyInfo(event, latency); } void OffScreenRenderWidgetHostView::ProcessMouseEvent( @@ -1254,7 +1253,7 @@ void OffScreenRenderWidgetHostView::ResizeRootLayer() { GetCompositor()->SetScaleAndSize(scale_factor_, size_in_pixels); } -cc::FrameSinkId OffScreenRenderWidgetHostView::AllocateFrameSinkId( +viz::FrameSinkId OffScreenRenderWidgetHostView::AllocateFrameSinkId( bool is_guest_view_hack) { // GuestViews have two RenderWidgetHostViews and so we need to make sure // we don't have FrameSinkId collisions. @@ -1264,7 +1263,7 @@ cc::FrameSinkId OffScreenRenderWidgetHostView::AllocateFrameSinkId( content::ImageTransportFactory::GetInstance(); return is_guest_view_hack ? factory->GetContextFactoryPrivate()->AllocateFrameSinkId() - : cc::FrameSinkId(base::checked_cast( + : viz::FrameSinkId(base::checked_cast( render_widget_host_->GetProcess()->GetID()), base::checked_cast( render_widget_host_->GetRoutingID())); diff --git a/atom/browser/osr/osr_render_widget_host_view.h b/atom/browser/osr/osr_render_widget_host_view.h index 23549838c335..ed4b160440e6 100644 --- a/atom/browser/osr/osr_render_widget_host_view.h +++ b/atom/browser/osr/osr_render_widget_host_view.h @@ -116,9 +116,9 @@ class OffScreenRenderWidgetHostView // content::RenderWidgetHostViewBase: void DidCreateNewRendererCompositorFrameSink( - cc::mojom::MojoCompositorFrameSinkClient* renderer_compositor_frame_sink) + cc::mojom::CompositorFrameSinkClient* renderer_compositor_frame_sink) override; - void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id, + void SubmitCompositorFrame(const viz::LocalSurfaceId& local_surface_id, cc::CompositorFrame frame) override; void ClearCompositorFrame(void) override; @@ -176,7 +176,7 @@ class OffScreenRenderWidgetHostView bool DelegatedFrameCanCreateResizeLock() const override; std::unique_ptr DelegatedFrameHostCreateResizeLock() override; - void OnBeginFrame(const cc::BeginFrameArgs& args) override; + void OnBeginFrame() override; // CompositorResizeLockClient implementation. std::unique_ptr GetCompositorLock( ui::CompositorLockClient* client) override; @@ -185,7 +185,7 @@ class OffScreenRenderWidgetHostView bool TransformPointToLocalCoordSpace( const gfx::Point& point, - const cc::SurfaceId& original_surface, + const viz::SurfaceId& original_surface, gfx::Point* transformed_point) override; bool TransformPointToCoordSpaceForView( const gfx::Point& point, @@ -237,7 +237,8 @@ class OffScreenRenderWidgetHostView void WasResized(); void ProcessKeyboardEvent( - const content::NativeWebKeyboardEvent& event) override; + const content::NativeWebKeyboardEvent& event, + const ui::LatencyInfo& latency) override; void ProcessMouseEvent(const blink::WebMouseEvent& event, const ui::LatencyInfo& latency) override; void ProcessMouseWheelEvent(const blink::WebMouseWheelEvent& event, @@ -274,7 +275,7 @@ class OffScreenRenderWidgetHostView void SetupFrameRate(bool force); void ResizeRootLayer(); - cc::FrameSinkId AllocateFrameSinkId(bool is_guest_view_hack); + viz::FrameSinkId AllocateFrameSinkId(bool is_guest_view_hack); // Applies background color without notifying the RenderWidget about // opaqueness changes. @@ -337,7 +338,7 @@ class OffScreenRenderWidgetHostView std::string selected_text_; #endif - cc::mojom::MojoCompositorFrameSinkClient* renderer_compositor_frame_sink_; + cc::mojom::CompositorFrameSinkClient* renderer_compositor_frame_sink_; SkColor background_color_; diff --git a/atom/browser/osr/osr_render_widget_host_view_mac.mm b/atom/browser/osr/osr_render_widget_host_view_mac.mm index 034d8a1f519b..9d7ef29a2a86 100644 --- a/atom/browser/osr/osr_render_widget_host_view_mac.mm +++ b/atom/browser/osr/osr_render_widget_host_view_mac.mm @@ -38,12 +38,8 @@ class MacHelper : return color; } - void BrowserCompositorMacSendBeginFrame( - const cc::BeginFrameArgs& args) override { - view_->render_widget_host()->Send( - new ViewMsg_BeginFrame(view_->render_widget_host()->GetRoutingID(), - args)); - } + void BrowserCompositorMacOnBeginFrame() override {} + // ui::AcceleratedWidgetMacNSView: NSView* AcceleratedWidgetGetNSView() const override { return [view_->window()->GetNativeWindow() contentView];