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

Side by Side Diff: ui/accelerated_widget_mac/accelerated_widget_mac.mm

Issue 1161853006: Mac: Add partial swap support to NSOpenGLContext path (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback Created 5 years, 6 months 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 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" 5 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 [io_surface_layer_ beginPumpingFrames]; 124 [io_surface_layer_ beginPumpingFrames];
125 } 125 }
126 126
127 void AcceleratedWidgetMac::EndPumpingFrames() { 127 void AcceleratedWidgetMac::EndPumpingFrames() {
128 [io_surface_layer_ endPumpingFrames]; 128 [io_surface_layer_ endPumpingFrames];
129 } 129 }
130 130
131 void AcceleratedWidgetMac::GotAcceleratedFrame( 131 void AcceleratedWidgetMac::GotAcceleratedFrame(
132 uint64 surface_handle, 132 uint64 surface_handle,
133 const std::vector<ui::LatencyInfo>& latency_info, 133 const std::vector<ui::LatencyInfo>& latency_info,
134 gfx::Size pixel_size, float scale_factor, 134 const gfx::Size& pixel_size,
135 float scale_factor,
136 const gfx::Rect& pixel_damage_rect,
135 const base::Closure& drawn_callback) { 137 const base::Closure& drawn_callback) {
136 static bool use_ns_gl_surfaces = 138 static bool use_ns_gl_surfaces =
137 base::CommandLine::ForCurrentProcess()->HasSwitch( 139 base::CommandLine::ForCurrentProcess()->HasSwitch(
138 switches::kEnableNSGLSurfaces); 140 switches::kEnableNSGLSurfaces);
139 141
140 // Record the surface and latency info to use when acknowledging this frame. 142 // Record the surface and latency info to use when acknowledging this frame.
141 DCHECK(accelerated_frame_drawn_callback_.is_null()); 143 DCHECK(accelerated_frame_drawn_callback_.is_null());
142 accelerated_frame_drawn_callback_ = drawn_callback; 144 accelerated_frame_drawn_callback_ = drawn_callback;
143 accelerated_latency_info_.insert(accelerated_latency_info_.end(), 145 accelerated_latency_info_.insert(accelerated_latency_info_.end(),
144 latency_info.begin(), latency_info.end()); 146 latency_info.begin(), latency_info.end());
145 147
146 // If there is no view and therefore no superview to draw into, early-out. 148 // If there is no view and therefore no superview to draw into, early-out.
147 if (!view_) { 149 if (!view_) {
148 AcknowledgeAcceleratedFrame(); 150 AcknowledgeAcceleratedFrame();
149 return; 151 return;
150 } 152 }
151 153
152 // Disable the fade-in or fade-out effect if we create or remove layers. 154 // Disable the fade-in or fade-out effect if we create or remove layers.
153 ScopedCAActionDisabler disabler; 155 ScopedCAActionDisabler disabler;
154 156
155 last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size); 157 last_swap_size_dip_ = gfx::ConvertSizeToDIP(scale_factor, pixel_size);
156 switch (GetSurfaceHandleType(surface_handle)) { 158 switch (GetSurfaceHandleType(surface_handle)) {
157 case kSurfaceHandleTypeIOSurface: { 159 case kSurfaceHandleTypeIOSurface: {
158 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); 160 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle);
159 if (use_ns_gl_surfaces) { 161 if (use_ns_gl_surfaces) {
160 GotAcceleratedIOSurfaceFrameNSGL( 162 GotAcceleratedIOSurfaceFrameNSGL(
161 io_surface_id, pixel_size, scale_factor); 163 io_surface_id, pixel_size, scale_factor, pixel_damage_rect);
162 } else { 164 } else {
163 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); 165 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor);
164 } 166 }
165 break; 167 break;
166 } 168 }
167 case kSurfaceHandleTypeCAContext: { 169 case kSurfaceHandleTypeCAContext: {
168 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); 170 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle);
169 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); 171 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor);
170 break; 172 break;
171 } 173 }
172 default: 174 default:
173 LOG(ERROR) << "Unrecognized accelerated frame type."; 175 LOG(ERROR) << "Unrecognized accelerated frame type.";
174 return; 176 return;
175 } 177 }
176 } 178 }
177 179
178 void AcceleratedWidgetMac::GotAcceleratedCAContextFrame( 180 void AcceleratedWidgetMac::GotAcceleratedCAContextFrame(
179 CAContextID ca_context_id, 181 CAContextID ca_context_id,
180 gfx::Size pixel_size, 182 const gfx::Size& pixel_size,
181 float scale_factor) { 183 float scale_factor) {
182 // In the layer is replaced, keep the old one around until after the new one 184 // In the layer is replaced, keep the old one around until after the new one
183 // is installed to avoid flashes. 185 // is installed to avoid flashes.
184 base::scoped_nsobject<CALayerHost> old_ca_context_layer = 186 base::scoped_nsobject<CALayerHost> old_ca_context_layer =
185 ca_context_layer_; 187 ca_context_layer_;
186 188
187 // Create the layer to host the layer exported by the GPU process with this 189 // Create the layer to host the layer exported by the GPU process with this
188 // particular CAContext ID. 190 // particular CAContext ID.
189 if ([ca_context_layer_ contextId] != ca_context_id) { 191 if ([ca_context_layer_ contextId] != ca_context_id) {
190 ca_context_layer_.reset([[CALayerHost alloc] init]); 192 ca_context_layer_.reset([[CALayerHost alloc] init]);
(...skipping 11 matching lines...) Expand all
202 // in the hierarchy. 204 // in the hierarchy.
203 if (old_ca_context_layer != ca_context_layer_) 205 if (old_ca_context_layer != ca_context_layer_)
204 DestroyCAContextLayer(old_ca_context_layer); 206 DestroyCAContextLayer(old_ca_context_layer);
205 207
206 // Remove any different-type layers that this is replacing. 208 // Remove any different-type layers that this is replacing.
207 DestroyIOSurfaceLayer(io_surface_layer_); 209 DestroyIOSurfaceLayer(io_surface_layer_);
208 DestroySoftwareLayer(); 210 DestroySoftwareLayer();
209 } 211 }
210 212
211 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrameNSGL( 213 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrameNSGL(
212 IOSurfaceID io_surface_id, gfx::Size pixel_size, float scale_factor) { 214 IOSurfaceID io_surface_id,
215 const gfx::Size& pixel_size,
216 float scale_factor,
217 const gfx::Rect& pixel_damage_rect) {
213 if (!io_surface_ns_gl_surface_) { 218 if (!io_surface_ns_gl_surface_) {
214 io_surface_ns_gl_surface_.reset( 219 io_surface_ns_gl_surface_.reset(
215 IOSurfaceNSGLSurface::Create(view_->AcceleratedWidgetGetNSView())); 220 IOSurfaceNSGLSurface::Create(view_->AcceleratedWidgetGetNSView()));
216 } 221 }
217 222
218 if (!io_surface_ns_gl_surface_) { 223 if (!io_surface_ns_gl_surface_) {
219 LOG(ERROR) << "Failed to create IOSurfaceNSGLSurface"; 224 LOG(ERROR) << "Failed to create IOSurfaceNSGLSurface";
220 AcknowledgeAcceleratedFrame(); 225 AcknowledgeAcceleratedFrame();
221 return; 226 return;
222 } 227 }
223 228
224 io_surface_ns_gl_surface_->GotFrame(io_surface_id, pixel_size, scale_factor); 229 io_surface_ns_gl_surface_->GotFrame(
230 io_surface_id, pixel_size, scale_factor, pixel_damage_rect);
225 AcknowledgeAcceleratedFrame(); 231 AcknowledgeAcceleratedFrame();
226 } 232 }
227 233
228 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrame( 234 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrame(
229 IOSurfaceID io_surface_id, 235 IOSurfaceID io_surface_id,
230 gfx::Size pixel_size, 236 const gfx::Size& pixel_size,
231 float scale_factor) { 237 float scale_factor) {
232 // In the layer is replaced, keep the old one around until after the new one 238 // In the layer is replaced, keep the old one around until after the new one
233 // is installed to avoid flashes. 239 // is installed to avoid flashes.
234 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = 240 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer =
235 io_surface_layer_; 241 io_surface_layer_;
236 242
237 // Create or re-create an IOSurface layer if needed. If there already exists 243 // Create or re-create an IOSurface layer if needed. If there already exists
238 // a layer but it has the wrong scale factor or it was poisoned, re-create the 244 // a layer but it has the wrong scale factor or it was poisoned, re-create the
239 // layer. 245 // layer.
240 bool needs_new_layer = 246 bool needs_new_layer =
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 // Poison the context being used and request a mulligan. 388 // Poison the context being used and request a mulligan.
383 [io_surface_layer_ poisonContextAndSharegroup]; 389 [io_surface_layer_ poisonContextAndSharegroup];
384 390
385 if (view_) 391 if (view_)
386 view_->AcceleratedWidgetHitError(); 392 view_->AcceleratedWidgetHitError();
387 } 393 }
388 394
389 void AcceleratedWidgetMacGotAcceleratedFrame( 395 void AcceleratedWidgetMacGotAcceleratedFrame(
390 gfx::AcceleratedWidget widget, uint64 surface_handle, 396 gfx::AcceleratedWidget widget, uint64 surface_handle,
391 const std::vector<ui::LatencyInfo>& latency_info, 397 const std::vector<ui::LatencyInfo>& latency_info,
392 gfx::Size pixel_size, float scale_factor, 398 const gfx::Size& pixel_size,
399 float scale_factor,
400 const gfx::Rect& pixel_damage_rect,
393 const base::Closure& drawn_callback, 401 const base::Closure& drawn_callback,
394 bool* disable_throttling, int* renderer_id) { 402 bool* disable_throttling, int* renderer_id) {
395 AcceleratedWidgetMac* accelerated_widget_mac = 403 AcceleratedWidgetMac* accelerated_widget_mac =
396 GetHelperFromAcceleratedWidget(widget); 404 GetHelperFromAcceleratedWidget(widget);
397 if (accelerated_widget_mac) { 405 if (accelerated_widget_mac) {
398 accelerated_widget_mac->GotAcceleratedFrame( 406 accelerated_widget_mac->GotAcceleratedFrame(
399 surface_handle, latency_info, pixel_size, scale_factor, drawn_callback); 407 surface_handle, latency_info, pixel_size, scale_factor,
408 pixel_damage_rect, drawn_callback);
400 *disable_throttling = 409 *disable_throttling =
401 accelerated_widget_mac->IsRendererThrottlingDisabled(); 410 accelerated_widget_mac->IsRendererThrottlingDisabled();
402 *renderer_id = accelerated_widget_mac->GetRendererID(); 411 *renderer_id = accelerated_widget_mac->GetRendererID();
403 } else { 412 } else {
404 *disable_throttling = false; 413 *disable_throttling = false;
405 *renderer_id = 0; 414 *renderer_id = 0;
406 } 415 }
407 } 416 }
408 417
409 void AcceleratedWidgetMacGotSoftwareFrame( 418 void AcceleratedWidgetMacGotSoftwareFrame(
410 gfx::AcceleratedWidget widget, float scale_factor, SkCanvas* canvas) { 419 gfx::AcceleratedWidget widget, float scale_factor, SkCanvas* canvas) {
411 AcceleratedWidgetMac* accelerated_widget_mac = 420 AcceleratedWidgetMac* accelerated_widget_mac =
412 GetHelperFromAcceleratedWidget(widget); 421 GetHelperFromAcceleratedWidget(widget);
413 if (accelerated_widget_mac) 422 if (accelerated_widget_mac)
414 accelerated_widget_mac->GotSoftwareFrame(scale_factor, canvas); 423 accelerated_widget_mac->GotSoftwareFrame(scale_factor, canvas);
415 } 424 }
416 425
417 } // namespace ui 426 } // namespace ui
OLDNEW
« no previous file with comments | « ui/accelerated_widget_mac/accelerated_widget_mac.h ('k') | ui/accelerated_widget_mac/io_surface_ns_gl_surface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698