Index: content/browser/compositor/browser_compositor_ca_layer_tree_mac.h |
diff --git a/content/browser/compositor/browser_compositor_ca_layer_tree_mac.h b/content/browser/compositor/browser_compositor_ca_layer_tree_mac.h |
index b342035ed5f2c39676d39036bb70fe959a4723bf..34b5c977f601534cfc899abbb1e6cea6ee0754eb 100644 |
--- a/content/browser/compositor/browser_compositor_ca_layer_tree_mac.h |
+++ b/content/browser/compositor/browser_compositor_ca_layer_tree_mac.h |
@@ -2,12 +2,16 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ |
-#define CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ |
+#ifndef CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_ |
+#define CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_ |
#include <IOSurface/IOSurfaceAPI.h> |
+#include <vector> |
-#include "content/browser/compositor/browser_compositor_view_mac.h" |
+#include "skia/ext/platform_canvas.h" |
+#include "ui/events/latency_info.h" |
+#include "ui/gfx/geometry/size.h" |
+#include "ui/gfx/native_widget_types.h" |
#if defined(__OBJC__) |
#include <Cocoa/Cocoa.h> |
@@ -17,25 +21,41 @@ |
#include "ui/base/cocoa/remote_layer_api.h" |
#endif // __OBJC__ |
+namespace cc { |
+class SoftwareFrameData; |
+} |
+ |
namespace content { |
+class AcceleratedWidgetMac; |
+ |
+// A class through which an AcceleratedWidget may be bound to draw the contents |
+// of an NSView. An AcceleratedWidget may be bound to multiple different views |
+// throughout its lifetime (one at a time, though). |
+class AcceleratedWidgetMacNSView { |
+ public: |
+ virtual NSView* AcceleratedWidgetGetNSView() const = 0; |
+ virtual bool AcceleratedWidgetShouldIgnoreBackpressure() const = 0; |
+ virtual void AcceleratedWidgetSwapCompleted( |
+ const std::vector<ui::LatencyInfo>& latency_info) = 0; |
+ virtual void AcceleratedWidgetHitError() = 0; |
+}; |
+ |
#if defined(__OBJC__) |
-// BrowserCompositorCALayerTreeMac owns tree of CALayer and a ui::Compositor |
-// that is used to draw the layers. The CALayer tree can be attached to the |
-// NSView of a BrowserCompositorViewMac |
-class BrowserCompositorCALayerTreeMac |
- : public IOSurfaceLayerClient { |
+// AcceleratedWidgetMac owns a tree of CALayers. The widget may be passed |
+// to a ui::Compositor, which will cause, through its output surface, calls to |
+// GotAcceleratedFrame and GotSoftwareFrame. The CALayers may be installed |
+// in an NSView by setting the AcceleratedWidgetMacNSView for the helper. |
+class AcceleratedWidgetMac : public IOSurfaceLayerClient { |
public: |
- BrowserCompositorCALayerTreeMac(); |
- virtual ~BrowserCompositorCALayerTreeMac(); |
- static BrowserCompositorCALayerTreeMac* FromAcceleratedWidget( |
- gfx::AcceleratedWidget widget); |
+ AcceleratedWidgetMac(); |
+ virtual ~AcceleratedWidgetMac(); |
- void SetView(BrowserCompositorViewMac* view); |
- void ResetView(); |
+ gfx::AcceleratedWidget accelerated_widget() { return native_widget_; } |
- ui::Compositor* compositor() const { return compositor_.get(); } |
+ void SetNSView(AcceleratedWidgetMacNSView* view); |
+ void ResetNSView(); |
// Return true if the last frame swapped has a size in DIP of |dip_size|. |
bool HasFrameOfSize(const gfx::Size& dip_size) const; |
@@ -52,18 +72,20 @@ class BrowserCompositorCALayerTreeMac |
void EndPumpingFrames(); |
void GotAcceleratedFrame( |
- uint64 surface_handle, int output_surface_id, |
+ uint64 surface_handle, |
const std::vector<ui::LatencyInfo>& latency_info, |
- gfx::Size pixel_size, float scale_factor); |
+ gfx::Size pixel_size, |
+ float scale_factor, |
+ const base::Closure& drawn_callback); |
void GotSoftwareFrame( |
cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas); |
private: |
// IOSurfaceLayerClient implementation: |
- bool IOSurfaceLayerShouldAckImmediately() const override; |
- void IOSurfaceLayerDidDrawFrame() override; |
- void IOSurfaceLayerHitError() override; |
+ bool IOSurfaceLayerShouldAckImmediately() const override; |
+ void IOSurfaceLayerDidDrawFrame() override; |
+ void IOSurfaceLayerHitError() override; |
void GotAcceleratedCAContextFrame( |
CAContextID ca_context_id, gfx::Size pixel_size, float scale_factor); |
@@ -71,6 +93,8 @@ private: |
void GotAcceleratedIOSurfaceFrame( |
IOSurfaceID io_surface_id, gfx::Size pixel_size, float scale_factor); |
+ void AcknowledgeAcceleratedFrame(); |
+ |
// Remove a layer from the heirarchy and destroy it. Because the accelerated |
// layer types may be replaced by a layer of the same type, the layer to |
// destroy is parameterized, and, if it is the current layer, the current |
@@ -81,15 +105,12 @@ private: |
base::scoped_nsobject<IOSurfaceLayer> io_surface_layer); |
void DestroySoftwareLayer(); |
- // The BrowserCompositorViewMac that is using this as its internals. |
- BrowserCompositorViewMac* view_; |
+ // The AcceleratedWidgetMacNSView that is using this as its internals. |
+ AcceleratedWidgetMacNSView* view_; |
// A phony NSView handle used to identify this. |
gfx::AcceleratedWidget native_widget_; |
- // The compositor drawing the contents of this view. |
- scoped_ptr<ui::Compositor> compositor_; |
- |
// A flipped layer, which acts as the parent of the compositing and software |
// layers. This layer is flipped so that the we don't need to recompute the |
// origin for sub-layers when their position changes (this is impossible when |
@@ -108,29 +129,31 @@ private: |
// The locally drawn software layer. |
base::scoped_nsobject<SoftwareLayer> software_layer_; |
- // The output surface and latency info of the last accelerated surface that |
- // was swapped. Sent back to the renderer when the accelerated surface is |
- // drawn. |
- int accelerated_output_surface_id_; |
+ // If an accelerated frame has come in which has not yet been drawn and acked |
+ // then this is the latency info and the callback to make when the frame is |
+ // drawn. If there is no such frame then the callback is null. |
std::vector<ui::LatencyInfo> accelerated_latency_info_; |
+ base::Closure accelerated_frame_drawn_callback_; |
// The size in DIP of the last swap received from |compositor_|. |
gfx::Size last_swap_size_dip_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AcceleratedWidgetMac); |
}; |
#endif // __OBJC__ |
-void BrowserCompositorCALayerTreeMacGotAcceleratedFrame( |
- gfx::AcceleratedWidget widget, |
- uint64 surface_handle, int surface_id, |
+void AcceleratedWidgetMacGotAcceleratedFrame( |
+ gfx::AcceleratedWidget widget, uint64 surface_handle, |
const std::vector<ui::LatencyInfo>& latency_info, |
gfx::Size pixel_size, float scale_factor, |
+ const base::Closure& drawn_callback, |
bool* disable_throttling, int* renderer_id); |
-void BrowserCompositorCALayerTreeMacGotSoftwareFrame( |
+void AcceleratedWidgetMacGotSoftwareFrame( |
gfx::AcceleratedWidget widget, |
cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas); |
} // namespace content |
-#endif // CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ |
+#endif // CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_ |