summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/resources/resource_provider.cc1
-rw-r--r--content/browser/browser_main_loop.cc4
-rw-r--r--content/browser/compositor/delegated_frame_host.cc14
-rw-r--r--content/browser/compositor/delegated_frame_host.h4
-rw-r--r--content/browser/gpu/gpu_process_host.cc7
-rw-r--r--content/browser/renderer_host/render_widget_helper.h8
-rw-r--r--content/browser/renderer_host/render_widget_helper_mac.mm67
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura_unittest.cc1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac.h26
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac.mm192
-rw-r--r--content/common/gpu/image_transport_surface_mac.cc3
-rw-r--r--content/content_browser.gypi1
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',