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

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: 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 // The client for an AcceleratedWidgetHelper. This client provides the actual
33 // NSView that the AcceleratedWidgetHelper draws. An AcceleratedWidgetHelper
34 // may be bound to multiple different clients throughout its lifetime (one at
35 // a time, though).
ccameron 2014/11/20 04:37:20 Oh, I was thinking to call this AcceleratedWidgetV
tapted 2014/11/20 05:38:53 Hm. Both have merit. I was leaning towards `Client
ccameron 2014/11/20 21:33:50 Yeah, view is getting too much use -- I just calle
36 class AcceleratedWidgetMacClient {
37 public:
38 virtual NSView* AcceleratedWidgetClientGetNSView() const = 0;
39 virtual bool AcceleratedWidgetShouldIgnoreBackpressure() const = 0;
40 virtual void AcceleratedWidgetSwapCompleted(
41 const std::vector<ui::LatencyInfo>& latency_info) = 0;
42 virtual void AcceleratedWidgetHitError() = 0;
43 };
44
22 #if defined(__OBJC__) 45 #if defined(__OBJC__)
23 46
24 // BrowserCompositorCALayerTreeMac owns tree of CALayer and a ui::Compositor 47 // 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 48 // to a ui::Compositor, which will cause, through its output surface, calls to
26 // NSView of a BrowserCompositorViewMac 49 // GotAcceleratedFrame and GotSoftwareFrame. The CALayers may be installed
27 class BrowserCompositorCALayerTreeMac 50 // in an NSView by setting the AcceleratedWidgetMacClient for the helper.
51 class AcceleratedWidgetMac
28 : public IOSurfaceLayerClient { 52 : public IOSurfaceLayerClient {
tapted 2014/11/20 05:38:53 nit: pull up
ccameron 2014/11/20 21:33:50 Done.
29 public: 53 public:
30 BrowserCompositorCALayerTreeMac(); 54 AcceleratedWidgetMac();
31 virtual ~BrowserCompositorCALayerTreeMac(); 55 virtual ~AcceleratedWidgetMac();
32 static BrowserCompositorCALayerTreeMac* FromAcceleratedWidget(
33 gfx::AcceleratedWidget widget);
34 56
35 void SetView(BrowserCompositorViewMac* view); 57 gfx::AcceleratedWidget accelerated_widget() { return native_widget_; }
36 void ResetView();
37 58
38 ui::Compositor* compositor() const { return compositor_.get(); } 59 void SetClient(AcceleratedWidgetMacClient* client);
60 void ResetClient();
39 61
40 // Return true if the last frame swapped has a size in DIP of |dip_size|. 62 // Return true if the last frame swapped has a size in DIP of |dip_size|.
41 bool HasFrameOfSize(const gfx::Size& dip_size) const; 63 bool HasFrameOfSize(const gfx::Size& dip_size) const;
42 64
43 // Return the CGL renderer ID for the surface, if one is available. 65 // Return the CGL renderer ID for the surface, if one is available.
44 int GetRendererID() const; 66 int GetRendererID() const;
45 67
46 // Return true if the renderer should not be throttled by GPU back-pressure. 68 // Return true if the renderer should not be throttled by GPU back-pressure.
47 bool IsRendererThrottlingDisabled() const; 69 bool IsRendererThrottlingDisabled() const;
48 70
49 // Mark a bracket in which new frames are being pumped in a restricted nested 71 // Mark a bracket in which new frames are being pumped in a restricted nested
50 // run loop. 72 // run loop.
51 void BeginPumpingFrames(); 73 void BeginPumpingFrames();
52 void EndPumpingFrames(); 74 void EndPumpingFrames();
53 75
54 void GotAcceleratedFrame( 76 void GotAcceleratedFrame(
55 uint64 surface_handle, int output_surface_id, 77 uint64 surface_handle,
56 const std::vector<ui::LatencyInfo>& latency_info, 78 const std::vector<ui::LatencyInfo>& latency_info,
57 gfx::Size pixel_size, float scale_factor); 79 gfx::Size pixel_size,
80 float scale_factor,
81 const base::Closure& drawn_callback);
58 82
59 void GotSoftwareFrame( 83 void GotSoftwareFrame(
60 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas); 84 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas);
61 85
62 private: 86 private:
63 // IOSurfaceLayerClient implementation: 87 // IOSurfaceLayerClient implementation:
64 bool IOSurfaceLayerShouldAckImmediately() const override; 88 bool IOSurfaceLayerShouldAckImmediately() const override;
65 void IOSurfaceLayerDidDrawFrame() override; 89 void IOSurfaceLayerDidDrawFrame() override;
66 void IOSurfaceLayerHitError() override; 90 void IOSurfaceLayerHitError() override;
67 91
68 void GotAcceleratedCAContextFrame( 92 void GotAcceleratedCAContextFrame(
69 CAContextID ca_context_id, gfx::Size pixel_size, float scale_factor); 93 CAContextID ca_context_id, gfx::Size pixel_size, float scale_factor);
70 94
71 void GotAcceleratedIOSurfaceFrame( 95 void GotAcceleratedIOSurfaceFrame(
72 IOSurfaceID io_surface_id, gfx::Size pixel_size, float scale_factor); 96 IOSurfaceID io_surface_id, gfx::Size pixel_size, float scale_factor);
73 97
98 void AcknowledgeAcceleratedFrame();
99
74 // Remove a layer from the heirarchy and destroy it. Because the accelerated 100 // 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 101 // 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 102 // destroy is parameterized, and, if it is the current layer, the current
77 // layer is reset. 103 // layer is reset.
78 void DestroyCAContextLayer( 104 void DestroyCAContextLayer(
79 base::scoped_nsobject<CALayerHost> ca_context_layer); 105 base::scoped_nsobject<CALayerHost> ca_context_layer);
80 void DestroyIOSurfaceLayer( 106 void DestroyIOSurfaceLayer(
81 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer); 107 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer);
82 void DestroySoftwareLayer(); 108 void DestroySoftwareLayer();
83 109
84 // The BrowserCompositorViewMac that is using this as its internals. 110 // The AcceleratedWidgetMacClient that is using this as its internals.
85 BrowserCompositorViewMac* view_; 111 AcceleratedWidgetMacClient* client_;
86 112
87 // A phony NSView handle used to identify this. 113 // A phony NSView handle used to identify this.
88 gfx::AcceleratedWidget native_widget_; 114 gfx::AcceleratedWidget native_widget_;
89 115
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 116 // 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 117 // 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 118 // 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 119 // using remote layers, as their size change cannot be synchronized with the
97 // window). This indirection is needed because flipping hosted layers (like 120 // window). This indirection is needed because flipping hosted layers (like
98 // |background_layer_| of RenderWidgetHostViewCocoa) leads to unpredictable 121 // |background_layer_| of RenderWidgetHostViewCocoa) leads to unpredictable
99 // behavior. 122 // behavior.
100 base::scoped_nsobject<CALayer> flipped_layer_; 123 base::scoped_nsobject<CALayer> flipped_layer_;
101 124
102 // The accelerated CoreAnimation layer hosted by the GPU process. 125 // The accelerated CoreAnimation layer hosted by the GPU process.
103 base::scoped_nsobject<CALayerHost> ca_context_layer_; 126 base::scoped_nsobject<CALayerHost> ca_context_layer_;
104 127
105 // The locally drawn accelerated CoreAnimation layer. 128 // The locally drawn accelerated CoreAnimation layer.
106 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer_; 129 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer_;
107 130
108 // The locally drawn software layer. 131 // The locally drawn software layer.
109 base::scoped_nsobject<SoftwareLayer> software_layer_; 132 base::scoped_nsobject<SoftwareLayer> software_layer_;
110 133
111 // The output surface and latency info of the last accelerated surface that 134 // The output surface and latency info of the last accelerated surface that
112 // was swapped. Sent back to the renderer when the accelerated surface is 135 // was swapped. Sent back to the renderer when the accelerated surface is
113 // drawn. 136 // drawn.
114 int accelerated_output_surface_id_; 137 bool has_unacknowledged_accelerated_frame_;
138 base::Closure accelerated_frame_drawn_callback_;
115 std::vector<ui::LatencyInfo> accelerated_latency_info_; 139 std::vector<ui::LatencyInfo> accelerated_latency_info_;
116 140
117 // The size in DIP of the last swap received from |compositor_|. 141 // The size in DIP of the last swap received from |compositor_|.
118 gfx::Size last_swap_size_dip_; 142 gfx::Size last_swap_size_dip_;
119 }; 143 };
120 144
121 #endif // __OBJC__ 145 #endif // __OBJC__
122 146
123 void BrowserCompositorCALayerTreeMacGotAcceleratedFrame( 147 void AcceleratedWidgetMacGotAcceleratedFrame(
124 gfx::AcceleratedWidget widget, 148 gfx::AcceleratedWidget widget, uint64 surface_handle,
125 uint64 surface_handle, int surface_id,
126 const std::vector<ui::LatencyInfo>& latency_info, 149 const std::vector<ui::LatencyInfo>& latency_info,
127 gfx::Size pixel_size, float scale_factor, 150 gfx::Size pixel_size, float scale_factor,
151 const base::Closure& drawn_callback,
128 bool* disable_throttling, int* renderer_id); 152 bool* disable_throttling, int* renderer_id);
129 153
130 void BrowserCompositorCALayerTreeMacGotSoftwareFrame( 154 void AcceleratedWidgetMacGotSoftwareFrame(
131 gfx::AcceleratedWidget widget, 155 gfx::AcceleratedWidget widget,
132 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas); 156 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas);
133 157
134 } // namespace content 158 } // namespace content
135 159
136 #endif // CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_CA_LAYER_TREE_MAC_H_ 160 #endif // CONTENT_BROWSER_COMPOSITOR_ACCELERATED_WIDGET_HELPER_MAC_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698