diff options
-rw-r--r-- | cc/resources/resource_provider.cc | 1 | ||||
-rw-r--r-- | content/browser/browser_main_loop.cc | 4 | ||||
-rw-r--r-- | content/browser/compositor/delegated_frame_host.cc | 14 | ||||
-rw-r--r-- | content/browser/compositor/delegated_frame_host.h | 4 | ||||
-rw-r--r-- | content/browser/gpu/gpu_process_host.cc | 7 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_helper.h | 8 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_helper_mac.mm | 67 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura_unittest.cc | 1 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_mac.h | 26 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_mac.mm | 192 | ||||
-rw-r--r-- | content/common/gpu/image_transport_surface_mac.cc | 3 | ||||
-rw-r--r-- | content/content_browser.gypi | 1 |
12 files changed, 284 insertions, 44 deletions
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index c49591c..09b12a3 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc @@ -1606,7 +1606,6 @@ void ResourceProvider::TransferResource(GLES2Interface* gl, DCHECK(!source->lock_for_read_count); DCHECK(source->origin != Resource::External || source->mailbox.IsValid()); DCHECK(source->allocated); - DCHECK_EQ(source->wrap_mode, GL_CLAMP_TO_EDGE); resource->id = id; resource->format = source->format; resource->mailbox_holder.texture_target = source->target; diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index b9443601..1039dc7 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc @@ -754,8 +754,8 @@ void BrowserMainLoop::ShutdownThreadsAndCleanUp() { resource_dispatcher_host_.get()->Shutdown(); } -#if defined(USE_AURA) - { +#if defined(USE_AURA) || defined(OS_MACOSX) + if (ShouldInitializeBrowserGpuChannelAndTransportSurface()) { TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:ImageTransportFactory"); ImageTransportFactory::Terminate(); diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc index eddedf4..76e12e6 100644 --- a/content/browser/compositor/delegated_frame_host.cc +++ b/content/browser/compositor/delegated_frame_host.cc @@ -12,6 +12,7 @@ #include "cc/resources/single_release_callback.h" #include "cc/resources/texture_mailbox.h" #include "content/browser/compositor/resize_lock.h" +#include "content/common/gpu/client/gl_helper.h" #include "content/public/browser/render_widget_host_view_frame_subscriber.h" #include "content/public/common/content_switches.h" #include "media/base/video_frame.h" @@ -40,7 +41,7 @@ DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) last_output_surface_id_(0), pending_delegated_ack_count_(0), skipped_frames_(false), - can_lock_compositor_(YES), + can_lock_compositor_(YES_CAN_LOCK), delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { ImageTransportFactory::GetInstance()->AddObserver(this); } @@ -76,15 +77,13 @@ void DelegatedFrameHost::MaybeCreateResizeLock() { can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || can_lock_compositor_ == NO_PENDING_COMMIT; - if (can_lock_compositor_ == YES) + if (can_lock_compositor_ == YES_CAN_LOCK) can_lock_compositor_ = YES_DID_LOCK; resize_lock_ = client_->CreateResizeLock(defer_compositor_lock); } bool DelegatedFrameHost::ShouldCreateResizeLock() { - RenderWidgetHostImpl* host = client_->GetHost(); - // On Windows while resizing, the the resize locks makes us mis-paint a white // vertical strip (including the non-client area) if the content composition // is lagging the UI composition. So here we disable the throttling so that @@ -92,9 +91,12 @@ bool DelegatedFrameHost::ShouldCreateResizeLock() { // whiteout. Because this causes the content to be drawn at wrong sizes while // resizing we compensate by blocking the UI thread in Compositor::Draw() by // issuing a FinishAllRendering() if we are resizing. -#if defined(OS_WIN) + // TODO(ccameron): Mac browser window resizing is incompletely implemented. +#if defined(OS_WIN) || defined(OS_MACOSX) return false; #else + RenderWidgetHostImpl* host = client_->GetHost(); + if (resize_lock_) return false; @@ -724,7 +726,7 @@ void DelegatedFrameHost::OnCompositingDidCommit( ui::Compositor* compositor) { RenderWidgetHostImpl* host = client_->GetHost(); if (can_lock_compositor_ == NO_PENDING_COMMIT) { - can_lock_compositor_ = YES; + can_lock_compositor_ = YES_CAN_LOCK; if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) can_lock_compositor_ = YES_DID_LOCK; } diff --git a/content/browser/compositor/delegated_frame_host.h b/content/browser/compositor/delegated_frame_host.h index 5b2588d..293314a 100644 --- a/content/browser/compositor/delegated_frame_host.h +++ b/content/browser/compositor/delegated_frame_host.h @@ -13,7 +13,6 @@ #include "content/browser/renderer_host/delegated_frame_evictor.h" #include "content/browser/renderer_host/dip_util.h" #include "content/browser/renderer_host/render_widget_host_impl.h" -#include "content/common/gpu/client/gl_helper.h" #include "content/public/browser/render_process_host.h" #include "ui/compositor/compositor.h" #include "ui/compositor/compositor_observer.h" @@ -29,6 +28,7 @@ class VideoFrame; namespace content { class DelegatedFrameHost; +class ReadbackYUVInterface; class RenderWidgetHostViewFrameSubscriber; class RenderWidgetHostImpl; class ResizeLock; @@ -258,7 +258,7 @@ class CONTENT_EXPORT DelegatedFrameHost scoped_refptr<ui::CompositorLock> released_front_lock_; enum CanLockCompositorState { - YES, + YES_CAN_LOCK, // We locked, so at some point we'll need to kick a frame. YES_DID_LOCK, // No. A lock timed out, we need to kick a new frame before locking again. diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index 008987a..36e2ad7 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc @@ -800,6 +800,13 @@ void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( "GpuHostMsg_AcceleratedSurfaceBuffersSwapped")) return; + gfx::AcceleratedWidget native_widget = + GpuSurfaceTracker::Get()->AcquireNativeWidget(params.surface_id); + if (native_widget) { + RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnIOThread(this, params); + return; + } + gfx::GLSurfaceHandle surface_handle = GpuSurfaceTracker::Get()->GetSurfaceHandle(params.surface_id); // Compositor window is always gfx::kNullPluginWindow. diff --git a/content/browser/renderer_host/render_widget_helper.h b/content/browser/renderer_host/render_widget_helper.h index 50ecdbd..af5c661 100644 --- a/content/browser/renderer_host/render_widget_helper.h +++ b/content/browser/renderer_host/render_widget_helper.h @@ -30,10 +30,12 @@ namespace base { class TimeDelta; } +struct GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params; struct ViewHostMsg_CreateWindow_Params; struct ViewMsg_SwapOut_Params; namespace content { +class GpuProcessHost; class ResourceDispatcherHostImpl; class SessionStorageNamespace; @@ -167,6 +169,12 @@ class RenderWidgetHelper void FreeTransportDIB(TransportDIB::Id dib_id); #endif +#if defined(OS_MACOSX) + static void OnNativeSurfaceBuffersSwappedOnIOThread( + GpuProcessHost* gpu_process_host, + const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params); +#endif + private: // A class used to proxy a paint message. PaintMsgProxy objects are created // on the IO thread and destroyed on the UI thread. diff --git a/content/browser/renderer_host/render_widget_helper_mac.mm b/content/browser/renderer_host/render_widget_helper_mac.mm new file mode 100644 index 0000000..f2e64d7 --- /dev/null +++ b/content/browser/renderer_host/render_widget_helper_mac.mm @@ -0,0 +1,67 @@ +// Copyright 2014 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. + +#include "content/browser/renderer_host/render_widget_helper.h" + +#import <Cocoa/Cocoa.h> + +#include "base/bind.h" +#include "content/browser/gpu/gpu_process_host.h" +#include "content/browser/gpu/gpu_surface_tracker.h" +#include "content/common/gpu/gpu_messages.h" + +// Declare methods used to present swaps to this view. +@interface NSView (ContentCompositingView) +- (void)onNativeSurfaceBuffersSwappedWithParams: + (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params; +@end + +@implementation NSView (ContentCompositingView) +- (void)onNativeSurfaceBuffersSwappedWithParams: + (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params { +} +@end + +namespace { + +void OnNativeSurfaceBuffersSwappedOnUIThread( + const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + gfx::AcceleratedWidget native_widget = + content::GpuSurfaceTracker::Get()->AcquireNativeWidget(params.surface_id); + [native_widget onNativeSurfaceBuffersSwappedWithParams:params]; +} + +} // namespace + +namespace content { + +void RenderWidgetHelper::OnNativeSurfaceBuffersSwappedOnIOThread( + GpuProcessHost* gpu_process_host, + const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + + // Immediately acknowledge this frame on the IO thread instead of the UI + // thread. The UI thread will wait on the GPU process. If the UI thread + // were to be responsible for acking swaps, then there would be a cycle + // and a potential deadlock. + // TODO(ccameron): This immediate ack circumvents GPU back-pressure that + // is necessary to throttle renderers. Fix that. + // TODO(ccameron): It is possible that the IOSurface will be deleted or + // reused soon as it is acked. Take out a reference to the IOSurface here, + // to ensure the IOSurface does not disappear before routing to the UI + // thread. + AcceleratedSurfaceMsg_BufferPresented_Params ack_params; + ack_params.sync_point = 0; + ack_params.renderer_id = 0; + gpu_process_host->Send(new AcceleratedSurfaceMsg_BufferPresented( + params.route_id, ack_params)); + + BrowserThread::PostTask( + BrowserThread::UI, + FROM_HERE, + base::Bind(&OnNativeSurfaceBuffersSwappedOnUIThread, params)); +} + +} // namespace content diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index 581ebc8..427ab04 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc @@ -17,6 +17,7 @@ #include "content/browser/compositor/resize_lock.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_impl.h" +#include "content/common/gpu/client/gl_helper.h" #include "content/common/gpu/gpu_messages.h" #include "content/common/host_shared_bitmap_manager.h" #include "content/common/input_messages.h" diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index 9626259..8db4f6b 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h @@ -16,6 +16,7 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "content/browser/compositor/delegated_frame_host.h" #include "content/browser/renderer_host/display_link_mac.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/browser/renderer_host/software_frame_manager.h" @@ -35,6 +36,11 @@ class RenderWidgetHostViewMacEditCommandHelper; class WebContents; } +namespace ui { +class Compositor; +class Layer; +} + @class CompositingIOSurfaceLayer; @class FullscreenWindowManager; @protocol RenderWidgetHostViewMacDelegate; @@ -214,6 +220,7 @@ class RenderWidgetHostImpl; // RenderWidgetHostView class hierarchy described in render_widget_host_view.h. class CONTENT_EXPORT RenderWidgetHostViewMac : public RenderWidgetHostViewBase, + public DelegatedFrameHostClient, public IPC::Sender, public SoftwareFrameManagerClient { public: @@ -448,6 +455,11 @@ class CONTENT_EXPORT RenderWidgetHostViewMac base::DelayTimer<RenderWidgetHostViewMac> compositing_iosurface_layer_async_timer_; + // Delegated frame management and compositior. + scoped_ptr<DelegatedFrameHost> delegated_frame_host_; + scoped_ptr<ui::Compositor> compositor_; + scoped_ptr<ui::Layer> root_layer_; + // This holds the current software compositing framebuffer, if any. scoped_ptr<SoftwareFrameManager> software_frame_manager_; @@ -514,6 +526,20 @@ class CONTENT_EXPORT RenderWidgetHostViewMac bool HasPendingSwapAck() const { return pending_swap_ack_; } + // DelegatedFrameHostClient implementation. + virtual ui::Compositor* GetCompositor() const OVERRIDE; + virtual ui::Layer* GetLayer() OVERRIDE; + virtual RenderWidgetHostImpl* GetHost() OVERRIDE; + virtual void SchedulePaintInRect( + const gfx::Rect& damage_rect_in_dip) OVERRIDE; + virtual bool IsVisible() OVERRIDE; + virtual scoped_ptr<ResizeLock> CreateResizeLock( + bool defer_compositor_lock) OVERRIDE; + virtual gfx::Size DesiredFrameSize() OVERRIDE; + virtual float CurrentDeviceScaleFactor() OVERRIDE; + virtual gfx::Size ConvertViewSizeToPixel(const gfx::Size& size) OVERRIDE; + virtual DelegatedFrameHost* GetDelegatedFrameHost() const OVERRIDE; + private: friend class RenderWidgetHostViewMacTest; diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index a4ae9c6..04aa432 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm @@ -27,12 +27,14 @@ #include "base/sys_info.h" #import "content/browser/accessibility/browser_accessibility_cocoa.h" #include "content/browser/accessibility/browser_accessibility_manager_mac.h" +#include "content/browser/compositor/resize_lock.h" #include "content/browser/frame_host/frame_tree.h" #include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/renderer_host/compositing_iosurface_context_mac.h" #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" #include "content/browser/renderer_host/compositing_iosurface_mac.h" +#include "content/browser/renderer_host/render_widget_helper.h" #include "content/browser/renderer_host/render_view_host_impl.h" #import "content/browser/renderer_host/render_widget_host_view_mac_dictionary_helper.h" #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper.h" @@ -61,6 +63,8 @@ #import "ui/base/cocoa/underlay_opengl_hosting_window.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/base/layout.h" +#include "ui/compositor/compositor.h" +#include "ui/compositor/layer.h" #include "ui/gfx/display.h" #include "ui/gfx/point.h" #include "ui/gfx/rect_conversions.h" @@ -406,6 +410,55 @@ void RemoveLayerFromSuperlayer( namespace content { +//////////////////////////////////////////////////////////////////////////////// +// DelegatedFrameHost, public: + +ui::Compositor* RenderWidgetHostViewMac::GetCompositor() const { + return compositor_.get(); +} + +ui::Layer* RenderWidgetHostViewMac::GetLayer() { + return root_layer_.get(); +} + +RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { + return render_widget_host_; +} + +void RenderWidgetHostViewMac::SchedulePaintInRect( + const gfx::Rect& damage_rect_in_dip) { + compositor_->ScheduleFullRedraw(); +} + +bool RenderWidgetHostViewMac::IsVisible() { + return !render_widget_host_->is_hidden(); +} + +gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { + return GetViewBounds().size(); +} + +float RenderWidgetHostViewMac::CurrentDeviceScaleFactor() { + return ViewScaleFactor(); +} + +gfx::Size RenderWidgetHostViewMac::ConvertViewSizeToPixel( + const gfx::Size& size) { + return gfx::ToEnclosingRect(gfx::ScaleRect(gfx::Rect(size), + ViewScaleFactor())).size(); +} + +scoped_ptr<ResizeLock> RenderWidgetHostViewMac::CreateResizeLock( + bool defer_compositor_lock) { + NOTREACHED(); + ResizeLock* lock = NULL; + return scoped_ptr<ResizeLock>(lock); +} + +DelegatedFrameHost* RenderWidgetHostViewMac::GetDelegatedFrameHost() const { + return delegated_frame_host_.get(); +} + /////////////////////////////////////////////////////////////////////////////// // RenderWidgetHostViewBase, public: @@ -462,6 +515,11 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { // pointer. cocoa_view_ = nil; + // Delete the delegated frame state. + delegated_frame_host_.reset(); + compositor_.reset(); + root_layer_.reset(); + UnlockMouse(); // Make sure that the layer doesn't reach into the now-invalid object. @@ -809,6 +867,8 @@ void RenderWidgetHostViewMac::WasShown() { web_contents_switch_paint_time_ = base::TimeTicks::Now(); render_widget_host_->WasShown(); software_frame_manager_->SetVisibility(true); + if (delegated_frame_host_) + delegated_frame_host_->WasShown(); // Call setNeedsDisplay before pausing for new frames to come in -- if any // do, and are drawn, then the needsDisplay bit will be cleared. @@ -833,6 +893,8 @@ void RenderWidgetHostViewMac::WasHidden() { // reduce its resource utilization. render_widget_host_->WasHidden(); software_frame_manager_->SetVisibility(false); + if (delegated_frame_host_) + delegated_frame_host_->WasHidden(); // There can be a transparent flash as this view is removed and the next is // added, because of OSX windowing races between displaying the contents of @@ -934,6 +996,9 @@ bool RenderWidgetHostViewMac::HasFocus() const { } bool RenderWidgetHostViewMac::IsSurfaceAvailableForCopy() const { + if (delegated_frame_host_) + return delegated_frame_host_->CanCopyToBitmap(); + return software_frame_manager_->HasCurrentFrame() || (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()); } @@ -1174,6 +1239,12 @@ void RenderWidgetHostViewMac::CopyFromCompositingSurface( const gfx::Size& dst_size, const base::Callback<void(bool, const SkBitmap&)>& callback, const SkBitmap::Config config) { + if (delegated_frame_host_) { + delegated_frame_host_->CopyFromCompositingSurface( + src_subrect, dst_size, callback, config); + return; + } + if (config != SkBitmap::kARGB_8888_Config) { NOTIMPLEMENTED(); callback.Run(false, SkBitmap()); @@ -1231,6 +1302,12 @@ void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame( const gfx::Rect& src_subrect, const scoped_refptr<media::VideoFrame>& target, const base::Callback<void(bool)>& callback) { + if (delegated_frame_host_) { + delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame( + src_subrect, target, callback); + return; + } + base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); if (!render_widget_host_->is_accelerated_compositing_active() || !compositing_iosurface_ || @@ -1259,6 +1336,9 @@ void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame( } bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const { + if (delegated_frame_host_) + return delegated_frame_host_->CanCopyToVideoFrame(); + return (!software_frame_manager_->HasCurrentFrame() && render_widget_host_->is_accelerated_compositing_active() && compositing_iosurface_ && @@ -1266,15 +1346,27 @@ bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const { } bool RenderWidgetHostViewMac::CanSubscribeFrame() const { + if (delegated_frame_host_) + return delegated_frame_host_->CanSubscribeFrame(); + return !software_frame_manager_->HasCurrentFrame(); } void RenderWidgetHostViewMac::BeginFrameSubscription( scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { + if (delegated_frame_host_) { + delegated_frame_host_->BeginFrameSubscription(subscriber.Pass()); + return; + } frame_subscriber_ = subscriber.Pass(); } void RenderWidgetHostViewMac::EndFrameSubscription() { + if (delegated_frame_host_) { + delegated_frame_host_->EndFrameSubscription(); + return; + } + frame_subscriber_.reset(); } @@ -1806,43 +1898,67 @@ bool RenderWidgetHostViewMac::HasAcceleratedSurface( void RenderWidgetHostViewMac::OnSwapCompositorFrame( uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { - // Only software compositor frames are accepted. - if (!frame->software_frame_data) { + if (frame->delegated_frame_data) { + if (!compositor_) { + compositor_.reset(new ui::Compositor(cocoa_view_)); + root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED)); + delegated_frame_host_.reset(new DelegatedFrameHost(this)); + } + + // TODO(ccameron): Having the root layer set while swapping the frame will + // result in frames not appearing. Fix this. + compositor_->SetRootLayer(NULL); + delegated_frame_host_->SwapDelegatedFrame( + output_surface_id, + frame->delegated_frame_data.Pass(), + frame->metadata.device_scale_factor, + frame->metadata.latency_info); + gfx::Size size = ToCeiledSize(frame->metadata.viewport_size); + float scale_factor = frame->metadata.device_scale_factor; + if (compositor_->size() != size || + compositor_->device_scale_factor() != scale_factor) { + // TODO(ccameron): The scale factor here does not result in the + // composited frame that is received having the right scale factor. Fix + // this. + compositor_->SetScaleAndSize(scale_factor, size); + root_layer_->SetBounds(gfx::Rect(size)); + } + compositor_->SetRootLayer(root_layer_.get()); + } else if (frame->software_frame_data) { + if (!software_frame_manager_->SwapToNewFrame( + output_surface_id, + frame->software_frame_data.get(), + frame->metadata.device_scale_factor, + render_widget_host_->GetProcess()->GetHandle())) { + render_widget_host_->GetProcess()->ReceivedBadMessage(); + return; + } + + // Add latency info to report when the frame finishes drawing. + AddPendingLatencyInfo(frame->metadata.latency_info); + GotSoftwareFrame(); + + cc::CompositorFrameAck ack; + RenderWidgetHostImpl::SendSwapCompositorFrameAck( + render_widget_host_->GetRoutingID(), + software_frame_manager_->GetCurrentFrameOutputSurfaceId(), + render_widget_host_->GetProcess()->GetID(), + ack); + software_frame_manager_->SwapToNewFrameComplete( + !render_widget_host_->is_hidden()); + + // Notify observers, tab capture observers in particular, that a new + // software frame has come in. + NotificationService::current()->Notify( + NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, + Source<RenderWidgetHost>(render_widget_host_), + NotificationService::NoDetails()); + } else { DLOG(ERROR) << "Received unexpected frame type."; RecordAction( base::UserMetricsAction("BadMessageTerminate_UnexpectedFrameType")); render_widget_host_->GetProcess()->ReceivedBadMessage(); - return; - } - - if (!software_frame_manager_->SwapToNewFrame( - output_surface_id, - frame->software_frame_data.get(), - frame->metadata.device_scale_factor, - render_widget_host_->GetProcess()->GetHandle())) { - render_widget_host_->GetProcess()->ReceivedBadMessage(); - return; } - - // Add latency info to report when the frame finishes drawing. - AddPendingLatencyInfo(frame->metadata.latency_info); - GotSoftwareFrame(); - - cc::CompositorFrameAck ack; - RenderWidgetHostImpl::SendSwapCompositorFrameAck( - render_widget_host_->GetRoutingID(), - software_frame_manager_->GetCurrentFrameOutputSurfaceId(), - render_widget_host_->GetProcess()->GetID(), - ack); - software_frame_manager_->SwapToNewFrameComplete( - !render_widget_host_->is_hidden()); - - // Notify observers, tab capture observers in particular, that a new software - // frame has come in. - NotificationService::current()->Notify( - NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, - Source<RenderWidgetHost>(render_widget_host_), - NotificationService::NoDetails()); } void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { @@ -3142,6 +3258,8 @@ SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() { renderWidgetHostView_->render_widget_host_->SendScreenRects(); renderWidgetHostView_->render_widget_host_->WasResized(); + if (renderWidgetHostView_->delegated_frame_host_) + renderWidgetHostView_->delegated_frame_host_->WasResized(); // Wait for the frame that WasResize might have requested. If the view is // being made visible at a new size, then this call will have no effect @@ -3201,6 +3319,16 @@ SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() { } } +- (void)onNativeSurfaceBuffersSwappedWithParams: + (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params { + + renderWidgetHostView_->CompositorSwapBuffers( + params.surface_handle, + params.size, + params.scale_factor, + params.latency_info); +} + - (void)drawRect:(NSRect)dirtyRect { TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect"); DCHECK(!renderWidgetHostView_->use_core_animation_); diff --git a/content/common/gpu/image_transport_surface_mac.cc b/content/common/gpu/image_transport_surface_mac.cc index dbd2182..4aebcf2 100644 --- a/content/common/gpu/image_transport_surface_mac.cc +++ b/content/common/gpu/image_transport_surface_mac.cc @@ -515,7 +515,8 @@ scoped_refptr<gfx::GLSurface> ImageTransportSurface::CreateNativeSurface( GpuChannelManager* manager, GpuCommandBufferStub* stub, const gfx::GLSurfaceHandle& surface_handle) { - DCHECK(surface_handle.transport_type == gfx::NATIVE_TRANSPORT); + DCHECK(surface_handle.transport_type == gfx::NATIVE_DIRECT || + surface_handle.transport_type == gfx::NATIVE_TRANSPORT); IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize(); switch (gfx::GetGLImplementation()) { diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 7c62bf8..f808475 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -1090,6 +1090,7 @@ 'browser/renderer_host/render_view_host_impl.h', 'browser/renderer_host/render_widget_helper.cc', 'browser/renderer_host/render_widget_helper.h', + 'browser/renderer_host/render_widget_helper_mac.mm', 'browser/renderer_host/render_widget_host_delegate.cc', 'browser/renderer_host/render_widget_host_delegate.h', 'browser/renderer_host/render_widget_host_impl.cc', |