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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 15689003: Part 3/3 (RWH/IOSurface) of adding with device scale factor to transport surfaces (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add missed lines Created 7 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/renderer_host/render_widget_host_view_mac.h" 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h"
6 6
7 #include <QuartzCore/QuartzCore.h> 7 #include <QuartzCore/QuartzCore.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 !compositing_iosurface_->HasIOSurface()) 936 !compositing_iosurface_->HasIOSurface())
937 return; 937 return;
938 938
939 float scale = ScaleFactor(cocoa_view_); 939 float scale = ScaleFactor(cocoa_view_);
940 gfx::Size dst_pixel_size = gfx::ToFlooredSize( 940 gfx::Size dst_pixel_size = gfx::ToFlooredSize(
941 gfx::ScaleSize(dst_size, scale)); 941 gfx::ScaleSize(dst_size, scale));
942 942
943 scoped_callback_runner.Release(); 943 scoped_callback_runner.Release();
944 944
945 compositing_iosurface_->CopyTo(GetScaledOpenGLPixelRect(src_subrect), 945 compositing_iosurface_->CopyTo(GetScaledOpenGLPixelRect(src_subrect),
946 ScaleFactor(cocoa_view_),
947 dst_pixel_size, 946 dst_pixel_size,
948 callback); 947 callback);
949 } 948 }
950 949
951 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame( 950 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame(
952 const gfx::Rect& src_subrect, 951 const gfx::Rect& src_subrect,
953 const scoped_refptr<media::VideoFrame>& target, 952 const scoped_refptr<media::VideoFrame>& target,
954 const base::Callback<void(bool)>& callback) { 953 const base::Callback<void(bool)>& callback) {
955 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); 954 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false));
956 if (!render_widget_host_->is_accelerated_compositing_active() || 955 if (!render_widget_host_->is_accelerated_compositing_active() ||
(...skipping 11 matching lines...) Expand all
968 NOTREACHED(); 967 NOTREACHED();
969 return; 968 return;
970 } 969 }
971 970
972 if (src_subrect.IsEmpty()) 971 if (src_subrect.IsEmpty())
973 return; 972 return;
974 973
975 scoped_callback_runner.Release(); 974 scoped_callback_runner.Release();
976 compositing_iosurface_->CopyToVideoFrame( 975 compositing_iosurface_->CopyToVideoFrame(
977 GetScaledOpenGLPixelRect(src_subrect), 976 GetScaledOpenGLPixelRect(src_subrect),
978 ScaleFactor(cocoa_view_),
979 target, 977 target,
980 callback); 978 callback);
981 } 979 }
982 980
983 bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const { 981 bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const {
984 return (!render_widget_host_->GetBackingStore(false) && 982 return (!render_widget_host_->GetBackingStore(false) &&
985 render_widget_host_->is_accelerated_compositing_active() && 983 render_widget_host_->is_accelerated_compositing_active() &&
986 compositing_iosurface_.get() && 984 compositing_iosurface_.get() &&
987 compositing_iosurface_->HasIOSurface()); 985 compositing_iosurface_->HasIOSurface());
988 } 986 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 1037
1040 void RenderWidgetHostViewMac::PluginImeCompositionCompleted( 1038 void RenderWidgetHostViewMac::PluginImeCompositionCompleted(
1041 const string16& text, int plugin_id) { 1039 const string16& text, int plugin_id) {
1042 if (render_widget_host_) { 1040 if (render_widget_host_) {
1043 render_widget_host_->Send(new ViewMsg_PluginImeCompositionCompleted( 1041 render_widget_host_->Send(new ViewMsg_PluginImeCompositionCompleted(
1044 render_widget_host_->GetRoutingID(), text, plugin_id)); 1042 render_widget_host_->GetRoutingID(), text, plugin_id));
1045 } 1043 }
1046 } 1044 }
1047 1045
1048 bool RenderWidgetHostViewMac::CompositorSwapBuffers(uint64 surface_handle, 1046 bool RenderWidgetHostViewMac::CompositorSwapBuffers(uint64 surface_handle,
1049 const gfx::Size& size) { 1047 const gfx::Size& size,
1048 float scale_factor) {
1050 if (is_hidden_) 1049 if (is_hidden_)
1051 return true; 1050 return true;
1052 1051
1053 NSWindow* window = [cocoa_view_ window]; 1052 NSWindow* window = [cocoa_view_ window];
1054 if (window_number() <= 0) { 1053 if (window_number() <= 0) {
1055 // There is no window to present so capturing during present won't work. 1054 // There is no window to present so capturing during present won't work.
1056 // We check if frame subscriber wants this frame and capture manually. 1055 // We check if frame subscriber wants this frame and capture manually.
1057 if (compositing_iosurface_.get() && frame_subscriber_) { 1056 if (compositing_iosurface_.get() && frame_subscriber_) {
1058 const base::Time present_time = base::Time::Now(); 1057 const base::Time present_time = base::Time::Now();
1059 scoped_refptr<media::VideoFrame> frame; 1058 scoped_refptr<media::VideoFrame> frame;
1060 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; 1059 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback;
1061 if (frame_subscriber_->ShouldCaptureFrame(present_time, 1060 if (frame_subscriber_->ShouldCaptureFrame(present_time,
1062 &frame, &callback)) { 1061 &frame, &callback)) {
1063 compositing_iosurface_->SetIOSurface(surface_handle, size); 1062 compositing_iosurface_->SetIOSurface(
1063 surface_handle, size, scale_factor);
1064 compositing_iosurface_->CopyToVideoFrame( 1064 compositing_iosurface_->CopyToVideoFrame(
1065 gfx::Rect(size), ScaleFactor(cocoa_view_), frame, 1065 gfx::Rect(size), frame,
1066 base::Bind(callback, present_time)); 1066 base::Bind(callback, present_time));
1067 return true; 1067 return true;
1068 } 1068 }
1069 } 1069 }
1070 1070
1071 // TODO(shess) If the view does not have a window, or the window 1071 // TODO(shess) If the view does not have a window, or the window
1072 // does not have backing, the IOSurface will log "invalid drawable" 1072 // does not have backing, the IOSurface will log "invalid drawable"
1073 // in -setView:. It is not clear how this code is reached with such 1073 // in -setView:. It is not clear how this code is reached with such
1074 // a case, so record some info into breakpad (some subset of 1074 // a case, so record some info into breakpad (some subset of
1075 // browsers are likely to crash later for unrelated reasons). 1075 // browsers are likely to crash later for unrelated reasons).
(...skipping 19 matching lines...) Expand all
1095 CompositingIOSurfaceMac::SURFACE_ORDER_BELOW_WINDOW : 1095 CompositingIOSurfaceMac::SURFACE_ORDER_BELOW_WINDOW :
1096 CompositingIOSurfaceMac::SURFACE_ORDER_ABOVE_WINDOW; 1096 CompositingIOSurfaceMac::SURFACE_ORDER_ABOVE_WINDOW;
1097 compositing_iosurface_.reset( 1097 compositing_iosurface_.reset(
1098 CompositingIOSurfaceMac::Create(window_number(), order)); 1098 CompositingIOSurfaceMac::Create(window_number(), order));
1099 should_post_notification = true; 1099 should_post_notification = true;
1100 } 1100 }
1101 1101
1102 if (!compositing_iosurface_) 1102 if (!compositing_iosurface_)
1103 return true; 1103 return true;
1104 1104
1105 compositing_iosurface_->SetIOSurface(surface_handle, size); 1105 compositing_iosurface_->SetIOSurface(surface_handle, size, scale_factor);
1106 1106
1107 GotAcceleratedFrame(); 1107 GotAcceleratedFrame();
1108 1108
1109 gfx::Size window_size(NSSizeToCGSize([cocoa_view_ frame].size)); 1109 gfx::Size window_size(NSSizeToCGSize([cocoa_view_ frame].size));
1110 if (window_size.IsEmpty()) { 1110 if (window_size.IsEmpty()) {
1111 // setNeedsDisplay will never display and we'll never ack if the window is 1111 // setNeedsDisplay will never display and we'll never ack if the window is
1112 // empty, so ack now and don't bother calling setNeedsDisplay below. 1112 // empty, so ack now and don't bother calling setNeedsDisplay below.
1113 return true; 1113 return true;
1114 } 1114 }
1115 1115
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1305 void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped( 1305 void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped(
1306 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, 1306 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
1307 int gpu_host_id) { 1307 int gpu_host_id) {
1308 TRACE_EVENT0("browser", 1308 TRACE_EVENT0("browser",
1309 "RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped"); 1309 "RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped");
1310 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1310 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1311 1311
1312 pending_swap_buffers_acks_.push_back(std::make_pair(params.route_id, 1312 pending_swap_buffers_acks_.push_back(std::make_pair(params.route_id,
1313 gpu_host_id)); 1313 gpu_host_id));
1314 1314
1315 if (CompositorSwapBuffers(params.surface_handle, params.size)) 1315 if (CompositorSwapBuffers(params.surface_handle,
1316 params.size,
1317 params.scale_factor))
1316 AckPendingSwapBuffers(); 1318 AckPendingSwapBuffers();
1317 } 1319 }
1318 1320
1319 void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer( 1321 void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer(
1320 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 1322 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
1321 int gpu_host_id) { 1323 int gpu_host_id) {
1322 TRACE_EVENT0("browser", 1324 TRACE_EVENT0("browser",
1323 "RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer"); 1325 "RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer");
1324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1326 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1325 1327
1326 pending_swap_buffers_acks_.push_back(std::make_pair(params.route_id, 1328 pending_swap_buffers_acks_.push_back(std::make_pair(params.route_id,
1327 gpu_host_id)); 1329 gpu_host_id));
1328 1330
1329 if (CompositorSwapBuffers(params.surface_handle, params.surface_size)) 1331 if (CompositorSwapBuffers(params.surface_handle,
1332 params.surface_size,
1333 params.surface_scale_factor))
1330 AckPendingSwapBuffers(); 1334 AckPendingSwapBuffers();
1331 } 1335 }
1332 1336
1333 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { 1337 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() {
1334 if (compositing_iosurface_) 1338 if (compositing_iosurface_)
1335 compositing_iosurface_->UnrefIOSurface(); 1339 compositing_iosurface_->UnrefIOSurface();
1336 } 1340 }
1337 1341
1338 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { 1342 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() {
1339 compositing_iosurface_.reset(); 1343 compositing_iosurface_.reset();
1340 } 1344 }
1341 1345
1342 bool RenderWidgetHostViewMac::HasAcceleratedSurface( 1346 bool RenderWidgetHostViewMac::HasAcceleratedSurface(
1343 const gfx::Size& desired_size) { 1347 const gfx::Size& desired_size) {
1344 // Update device scale factor for the IOSurface before checking if there
1345 // is a match. When initially created, the IOSurface is unaware of its
1346 // scale factor, which can result in compatible IOSurfaces not being used
1347 // http://crbug.com/237293
1348 if (compositing_iosurface_.get() &&
1349 compositing_iosurface_->HasIOSurface()) {
1350 compositing_iosurface_->SetDeviceScaleFactor(ScaleFactor(cocoa_view_));
1351 }
1352
1353 return last_frame_was_accelerated_ && 1348 return last_frame_was_accelerated_ &&
1354 compositing_iosurface_.get() && 1349 compositing_iosurface_.get() &&
1355 compositing_iosurface_->HasIOSurface() && 1350 compositing_iosurface_->HasIOSurface() &&
1356 (desired_size.IsEmpty() || 1351 (desired_size.IsEmpty() ||
1357 compositing_iosurface_->io_surface_size() == desired_size); 1352 compositing_iosurface_->dip_io_surface_size() == desired_size);
1358 } 1353 }
1359 1354
1360 void RenderWidgetHostViewMac::AboutToWaitForBackingStoreMsg() { 1355 void RenderWidgetHostViewMac::AboutToWaitForBackingStoreMsg() {
1361 AckPendingSwapBuffers(); 1356 AckPendingSwapBuffers();
1362 } 1357 }
1363 1358
1364 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { 1359 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() {
1365 } 1360 }
1366 1361
1367 void RenderWidgetHostViewMac::GetScreenInfo(WebKit::WebScreenInfo* results) { 1362 void RenderWidgetHostViewMac::GetScreenInfo(WebKit::WebScreenInfo* results) {
(...skipping 2032 matching lines...) Expand 10 before | Expand all | Expand 10 after
3400 if (!string) return NO; 3395 if (!string) return NO;
3401 3396
3402 // If the user is currently using an IME, confirm the IME input, 3397 // If the user is currently using an IME, confirm the IME input,
3403 // and then insert the text from the service, the same as TextEdit and Safari. 3398 // and then insert the text from the service, the same as TextEdit and Safari.
3404 [self confirmComposition]; 3399 [self confirmComposition];
3405 [self insertText:string]; 3400 [self insertText:string];
3406 return YES; 3401 return YES;
3407 } 3402 }
3408 3403
3409 @end 3404 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698