Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: content/browser/compositor/browser_compositor_ca_layer_tree_mac.h

Issue 745453002: Create an AcceleratedWidgetMac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ 5 #ifndef CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_
6 #define CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ 6 #define CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_
7 7
8 #include <IOSurface/IOSurfaceAPI.h> 8 #include <IOSurface/IOSurfaceAPI.h>
9 #include <vector>
9 10
10 #include "content/browser/compositor/browser_compositor_view_mac.h" 11 #include "skia/ext/platform_canvas.h"
12 #include "ui/events/latency_info.h"
13 #include "ui/gfx/geometry/size.h"
14 #include "ui/gfx/native_widget_types.h"
11 15
12 #if defined(__OBJC__) 16 #if defined(__OBJC__)
13 #include <Cocoa/Cocoa.h> 17 #include <Cocoa/Cocoa.h>
14 #include "base/mac/scoped_nsobject.h" 18 #include "base/mac/scoped_nsobject.h"
15 #include "content/browser/compositor/io_surface_layer_mac.h" 19 #include "content/browser/compositor/io_surface_layer_mac.h"
16 #include "content/browser/compositor/software_layer_mac.h" 20 #include "content/browser/compositor/software_layer_mac.h"
17 #include "ui/base/cocoa/remote_layer_api.h" 21 #include "ui/base/cocoa/remote_layer_api.h"
18 #endif // __OBJC__ 22 #endif // __OBJC__
19 23
24 namespace cc {
25 class SoftwareFrameData;
26 }
27
20 namespace content { 28 namespace content {
21 29
30 class AcceleratedWidgetMac;
31
32 // A class through which an AcceleratedWidget may be bound to draw the contents
33 // of an NSView. An AcceleratedWidget may be bound to multiple different views
34 // throughout its lifetime (one at a time, though).
35 class AcceleratedWidgetMacNSView {
36 public:
37 virtual NSView* AcceleratedWidgetGetNSView() const = 0;
38 virtual bool AcceleratedWidgetShouldIgnoreBackpressure() const = 0;
39 virtual void AcceleratedWidgetSwapCompleted(
40 const std::vector<ui::LatencyInfo>& latency_info) = 0;
41 virtual void AcceleratedWidgetHitError() = 0;
42 };
43
22 #if defined(__OBJC__) 44 #if defined(__OBJC__)
23 45
24 // BrowserCompositorCALayerTreeMac owns tree of CALayer and a ui::Compositor 46 // AcceleratedWidgetMac owns a tree of CALayers. The widget may be passed
25 // that is used to draw the layers. The CALayer tree can be attached to the 47 // to a ui::Compositor, which will cause, through its output surface, calls to
26 // NSView of a BrowserCompositorViewMac 48 // GotAcceleratedFrame and GotSoftwareFrame. The CALayers may be installed
27 class BrowserCompositorCALayerTreeMac 49 // in an NSView by setting the AcceleratedWidgetMacNSView for the helper.
28 : public IOSurfaceLayerClient { 50 class AcceleratedWidgetMac : public IOSurfaceLayerClient {
29 public: 51 public:
30 BrowserCompositorCALayerTreeMac(); 52 AcceleratedWidgetMac();
31 virtual ~BrowserCompositorCALayerTreeMac(); 53 virtual ~AcceleratedWidgetMac();
32 static BrowserCompositorCALayerTreeMac* FromAcceleratedWidget(
33 gfx::AcceleratedWidget widget);
34 54
35 void SetView(BrowserCompositorViewMac* view); 55 gfx::AcceleratedWidget accelerated_widget() { return native_widget_; }
36 void ResetView();
37 56
38 ui::Compositor* compositor() const { return compositor_.get(); } 57 void SetNSView(AcceleratedWidgetMacNSView* view);
58 void ResetNSView();
39 59
40 // Return true if the last frame swapped has a size in DIP of |dip_size|. 60 // Return true if the last frame swapped has a size in DIP of |dip_size|.
41 bool HasFrameOfSize(const gfx::Size& dip_size) const; 61 bool HasFrameOfSize(const gfx::Size& dip_size) const;
42 62
43 // Return the CGL renderer ID for the surface, if one is available. 63 // Return the CGL renderer ID for the surface, if one is available.
44 int GetRendererID() const; 64 int GetRendererID() const;
45 65
46 // Return true if the renderer should not be throttled by GPU back-pressure. 66 // Return true if the renderer should not be throttled by GPU back-pressure.
47 bool IsRendererThrottlingDisabled() const; 67 bool IsRendererThrottlingDisabled() const;
48 68
49 // Mark a bracket in which new frames are being pumped in a restricted nested 69 // Mark a bracket in which new frames are being pumped in a restricted nested
50 // run loop. 70 // run loop.
51 void BeginPumpingFrames(); 71 void BeginPumpingFrames();
52 void EndPumpingFrames(); 72 void EndPumpingFrames();
53 73
54 void GotAcceleratedFrame( 74 void GotAcceleratedFrame(
55 uint64 surface_handle, int output_surface_id, 75 uint64 surface_handle,
56 const std::vector<ui::LatencyInfo>& latency_info, 76 const std::vector<ui::LatencyInfo>& latency_info,
57 gfx::Size pixel_size, float scale_factor); 77 gfx::Size pixel_size,
78 float scale_factor,
79 const base::Closure& drawn_callback);
58 80
59 void GotSoftwareFrame( 81 void GotSoftwareFrame(
60 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas); 82 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas);
61 83
62 private: 84 private:
63 // IOSurfaceLayerClient implementation: 85 // IOSurfaceLayerClient implementation:
64 bool IOSurfaceLayerShouldAckImmediately() const override; 86 bool IOSurfaceLayerShouldAckImmediately() const override;
65 void IOSurfaceLayerDidDrawFrame() override; 87 void IOSurfaceLayerDidDrawFrame() override;
66 void IOSurfaceLayerHitError() override; 88 void IOSurfaceLayerHitError() override;
67 89
68 void GotAcceleratedCAContextFrame( 90 void GotAcceleratedCAContextFrame(
69 CAContextID ca_context_id, gfx::Size pixel_size, float scale_factor); 91 CAContextID ca_context_id, gfx::Size pixel_size, float scale_factor);
70 92
71 void GotAcceleratedIOSurfaceFrame( 93 void GotAcceleratedIOSurfaceFrame(
72 IOSurfaceID io_surface_id, gfx::Size pixel_size, float scale_factor); 94 IOSurfaceID io_surface_id, gfx::Size pixel_size, float scale_factor);
73 95
96 void AcknowledgeAcceleratedFrame();
97
74 // Remove a layer from the heirarchy and destroy it. Because the accelerated 98 // Remove a layer from the heirarchy and destroy it. Because the accelerated
75 // layer types may be replaced by a layer of the same type, the layer to 99 // layer types may be replaced by a layer of the same type, the layer to
76 // destroy is parameterized, and, if it is the current layer, the current 100 // destroy is parameterized, and, if it is the current layer, the current
77 // layer is reset. 101 // layer is reset.
78 void DestroyCAContextLayer( 102 void DestroyCAContextLayer(
79 base::scoped_nsobject<CALayerHost> ca_context_layer); 103 base::scoped_nsobject<CALayerHost> ca_context_layer);
80 void DestroyIOSurfaceLayer( 104 void DestroyIOSurfaceLayer(
81 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer); 105 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer);
82 void DestroySoftwareLayer(); 106 void DestroySoftwareLayer();
83 107
84 // The BrowserCompositorViewMac that is using this as its internals. 108 // The AcceleratedWidgetMacNSView that is using this as its internals.
85 BrowserCompositorViewMac* view_; 109 AcceleratedWidgetMacNSView* view_;
86 110
87 // A phony NSView handle used to identify this. 111 // A phony NSView handle used to identify this.
88 gfx::AcceleratedWidget native_widget_; 112 gfx::AcceleratedWidget native_widget_;
89 113
90 // The compositor drawing the contents of this view.
91 scoped_ptr<ui::Compositor> compositor_;
92
93 // A flipped layer, which acts as the parent of the compositing and software 114 // A flipped layer, which acts as the parent of the compositing and software
94 // layers. This layer is flipped so that the we don't need to recompute the 115 // layers. This layer is flipped so that the we don't need to recompute the
95 // origin for sub-layers when their position changes (this is impossible when 116 // origin for sub-layers when their position changes (this is impossible when
96 // using remote layers, as their size change cannot be synchronized with the 117 // using remote layers, as their size change cannot be synchronized with the
97 // window). This indirection is needed because flipping hosted layers (like 118 // window). This indirection is needed because flipping hosted layers (like
98 // |background_layer_| of RenderWidgetHostViewCocoa) leads to unpredictable 119 // |background_layer_| of RenderWidgetHostViewCocoa) leads to unpredictable
99 // behavior. 120 // behavior.
100 base::scoped_nsobject<CALayer> flipped_layer_; 121 base::scoped_nsobject<CALayer> flipped_layer_;
101 122
102 // The accelerated CoreAnimation layer hosted by the GPU process. 123 // The accelerated CoreAnimation layer hosted by the GPU process.
103 base::scoped_nsobject<CALayerHost> ca_context_layer_; 124 base::scoped_nsobject<CALayerHost> ca_context_layer_;
104 125
105 // The locally drawn accelerated CoreAnimation layer. 126 // The locally drawn accelerated CoreAnimation layer.
106 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer_; 127 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer_;
107 128
108 // The locally drawn software layer. 129 // The locally drawn software layer.
109 base::scoped_nsobject<SoftwareLayer> software_layer_; 130 base::scoped_nsobject<SoftwareLayer> software_layer_;
110 131
111 // The output surface and latency info of the last accelerated surface that 132 // If an accelerated frame has come in which has not yet been drawn and acked
112 // was swapped. Sent back to the renderer when the accelerated surface is 133 // then this is the latency info and the callback to make when the frame is
113 // drawn. 134 // drawn. If there is no such frame then the callback is null.
114 int accelerated_output_surface_id_;
115 std::vector<ui::LatencyInfo> accelerated_latency_info_; 135 std::vector<ui::LatencyInfo> accelerated_latency_info_;
136 base::Closure accelerated_frame_drawn_callback_;
116 137
117 // The size in DIP of the last swap received from |compositor_|. 138 // The size in DIP of the last swap received from |compositor_|.
118 gfx::Size last_swap_size_dip_; 139 gfx::Size last_swap_size_dip_;
140
141 DISALLOW_COPY_AND_ASSIGN(AcceleratedWidgetMac);
119 }; 142 };
120 143
121 #endif // __OBJC__ 144 #endif // __OBJC__
122 145
123 void BrowserCompositorCALayerTreeMacGotAcceleratedFrame( 146 void AcceleratedWidgetMacGotAcceleratedFrame(
124 gfx::AcceleratedWidget widget, 147 gfx::AcceleratedWidget widget, uint64 surface_handle,
125 uint64 surface_handle, int surface_id,
126 const std::vector<ui::LatencyInfo>& latency_info, 148 const std::vector<ui::LatencyInfo>& latency_info,
127 gfx::Size pixel_size, float scale_factor, 149 gfx::Size pixel_size, float scale_factor,
150 const base::Closure& drawn_callback,
128 bool* disable_throttling, int* renderer_id); 151 bool* disable_throttling, int* renderer_id);
129 152
130 void BrowserCompositorCALayerTreeMacGotSoftwareFrame( 153 void AcceleratedWidgetMacGotSoftwareFrame(
131 gfx::AcceleratedWidget widget, 154 gfx::AcceleratedWidget widget,
132 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas); 155 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas);
133 156
134 } // namespace content 157 } // namespace content
135 158
136 #endif // CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ 159 #endif // CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698