OLD | NEW |
---|---|
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_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 in_shutdown_(false), | 270 in_shutdown_(false), |
271 is_fullscreen_(false), | 271 is_fullscreen_(false), |
272 popup_parent_host_view_(NULL), | 272 popup_parent_host_view_(NULL), |
273 popup_child_host_view_(NULL), | 273 popup_child_host_view_(NULL), |
274 is_loading_(false), | 274 is_loading_(false), |
275 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 275 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
276 can_compose_inline_(true), | 276 can_compose_inline_(true), |
277 has_composition_text_(false), | 277 has_composition_text_(false), |
278 device_scale_factor_(1.0f), | 278 device_scale_factor_(1.0f), |
279 current_surface_(0), | 279 current_surface_(0), |
280 current_surface_is_protected_(true), | |
281 current_surface_in_use_by_compositor_(true), | |
282 protection_state_id_(0), | |
283 surface_route_id_(0), | |
284 paint_canvas_(NULL), | 280 paint_canvas_(NULL), |
285 synthetic_move_sent_(false), | 281 synthetic_move_sent_(false), |
286 accelerated_compositing_state_changed_(false), | 282 accelerated_compositing_state_changed_(false), |
287 can_lock_compositor_(YES) { | 283 can_lock_compositor_(YES) { |
288 host_->SetView(this); | 284 host_->SetView(this); |
289 window_observer_.reset(new WindowObserver(this)); | 285 window_observer_.reset(new WindowObserver(this)); |
290 window_->AddObserver(window_observer_.get()); | 286 window_->AddObserver(window_observer_.get()); |
291 aura::client::SetTooltipText(window_, &tooltip_); | 287 aura::client::SetTooltipText(window_, &tooltip_); |
292 aura::client::SetActivationDelegate(window_, this); | 288 aura::client::SetActivationDelegate(window_, this); |
293 } | 289 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
360 void RenderWidgetHostViewAura::WasShown() { | 356 void RenderWidgetHostViewAura::WasShown() { |
361 if (!host_->is_hidden()) | 357 if (!host_->is_hidden()) |
362 return; | 358 return; |
363 host_->WasShown(); | 359 host_->WasShown(); |
364 | 360 |
365 if (!current_surface_ && host_->is_accelerated_compositing_active() && | 361 if (!current_surface_ && host_->is_accelerated_compositing_active() && |
366 !released_front_lock_.get()) { | 362 !released_front_lock_.get()) { |
367 released_front_lock_ = GetCompositor()->GetCompositorLock(); | 363 released_front_lock_ = GetCompositor()->GetCompositorLock(); |
368 } | 364 } |
369 | 365 |
370 AdjustSurfaceProtection(); | |
371 | |
372 #if defined(OS_WIN) | 366 #if defined(OS_WIN) |
373 LPARAM lparam = reinterpret_cast<LPARAM>(this); | 367 LPARAM lparam = reinterpret_cast<LPARAM>(this); |
374 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); | 368 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); |
375 #endif | 369 #endif |
376 } | 370 } |
377 | 371 |
378 void RenderWidgetHostViewAura::WasHidden() { | 372 void RenderWidgetHostViewAura::WasHidden() { |
379 if (host_->is_hidden()) | 373 if (host_->is_hidden()) |
380 return; | 374 return; |
381 host_->WasHidden(); | 375 host_->WasHidden(); |
382 | 376 |
383 released_front_lock_ = NULL; | 377 released_front_lock_ = NULL; |
384 | 378 |
385 if (ShouldReleaseFrontSurface() && | |
386 host_->is_accelerated_compositing_active()) { | |
387 current_surface_ = 0; | |
388 UpdateExternalTexture(); | |
389 } | |
390 | |
391 AdjustSurfaceProtection(); | |
392 | |
393 #if defined(OS_WIN) | 379 #if defined(OS_WIN) |
394 aura::RootWindow* root_window = window_->GetRootWindow(); | 380 aura::RootWindow* root_window = window_->GetRootWindow(); |
395 if (root_window) { | 381 if (root_window) { |
396 HWND parent = root_window->GetAcceleratedWidget(); | 382 HWND parent = root_window->GetAcceleratedWidget(); |
397 LPARAM lparam = reinterpret_cast<LPARAM>(this); | 383 LPARAM lparam = reinterpret_cast<LPARAM>(this); |
398 | 384 |
399 EnumChildWindows(parent, HideWindowsCallback, lparam); | 385 EnumChildWindows(parent, HideWindowsCallback, lparam); |
400 } | 386 } |
401 #endif | 387 #endif |
402 } | 388 } |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
671 const gfx::Size& dst_size, | 657 const gfx::Size& dst_size, |
672 const base::Callback<void(bool)>& callback, | 658 const base::Callback<void(bool)>& callback, |
673 skia::PlatformBitmap* output) { | 659 skia::PlatformBitmap* output) { |
674 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); | 660 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); |
675 | 661 |
676 std::map<uint64, scoped_refptr<ui::Texture> >::iterator it = | 662 std::map<uint64, scoped_refptr<ui::Texture> >::iterator it = |
677 image_transport_clients_.find(current_surface_); | 663 image_transport_clients_.find(current_surface_); |
678 if (it == image_transport_clients_.end()) | 664 if (it == image_transport_clients_.end()) |
679 return; | 665 return; |
680 | 666 |
681 ui::Texture* container = it->second; | 667 scoped_refptr<ui::Texture> container = it->second; |
682 DCHECK(container); | 668 DCHECK(container); |
683 | 669 |
684 gfx::Size dst_size_in_pixel = ConvertSizeToPixel(this, dst_size); | 670 gfx::Size dst_size_in_pixel = ConvertSizeToPixel(this, dst_size); |
685 if (!output->Allocate( | 671 if (!output->Allocate( |
686 dst_size_in_pixel.width(), dst_size_in_pixel.height(), true)) | 672 dst_size_in_pixel.width(), dst_size_in_pixel.height(), true)) |
687 return; | 673 return; |
688 | 674 |
689 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 675 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
690 GLHelper* gl_helper = factory->GetGLHelper(); | 676 GLHelper* gl_helper = factory->GetGLHelper(); |
691 if (!gl_helper) | 677 if (!gl_helper) |
692 return; | 678 return; |
693 | 679 |
694 unsigned char* addr = static_cast<unsigned char*>( | 680 unsigned char* addr = static_cast<unsigned char*>( |
695 output->GetBitmap().getPixels()); | 681 output->GetBitmap().getPixels()); |
696 scoped_callback_runner.Release(); | 682 scoped_callback_runner.Release(); |
697 // Wrap the callback with an internal handler so that we can inject our | 683 // Wrap the callback with an internal handler so that we can inject our |
698 // own completion handlers (where we can call AdjustSurfaceProtection). | 684 // own completion handlers (where we can try to free the frontbuffer). |
699 base::Callback<void(bool)> wrapper_callback = base::Bind( | 685 base::Callback<void(bool)> wrapper_callback = base::Bind( |
700 &RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished, | 686 &RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished, |
701 AsWeakPtr(), | 687 AsWeakPtr(), |
702 callback); | 688 callback, |
689 container); // Hold a reference to the texture | |
piman
2012/11/09 22:02:01
I think we don't need this. By the time CropScaleR
no sievers
2012/11/19 20:30:44
Right it does the copy first on the UI thread. Rem
| |
703 ++pending_thumbnail_tasks_; | 690 ++pending_thumbnail_tasks_; |
704 | 691 |
705 // Convert |src_subrect| from the views coordinate (upper-left origin) into | 692 // Convert |src_subrect| from the views coordinate (upper-left origin) into |
706 // the OpenGL coordinate (lower-left origin). | 693 // the OpenGL coordinate (lower-left origin). |
707 gfx::Rect src_subrect_in_gl = src_subrect; | 694 gfx::Rect src_subrect_in_gl = src_subrect; |
708 src_subrect_in_gl.set_y(GetViewBounds().height() - src_subrect.bottom()); | 695 src_subrect_in_gl.set_y(GetViewBounds().height() - src_subrect.bottom()); |
709 | 696 |
710 gfx::Rect src_subrect_in_pixel = ConvertRectToPixel(this, src_subrect_in_gl); | 697 gfx::Rect src_subrect_in_pixel = ConvertRectToPixel(this, src_subrect_in_gl); |
711 gl_helper->CropScaleReadbackAndCleanTexture(container->PrepareTexture(), | 698 gl_helper->CropScaleReadbackAndCleanTexture(container->PrepareTexture(), |
712 container->size(), | 699 container->size(), |
713 src_subrect_in_pixel, | 700 src_subrect_in_pixel, |
714 dst_size_in_pixel, | 701 dst_size_in_pixel, |
715 addr, | 702 addr, |
716 wrapper_callback); | 703 wrapper_callback); |
717 } | 704 } |
718 | 705 |
719 void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() { | 706 void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() { |
720 // Delay processing the state change until we either get a software frame if | 707 // Delay processing the state change until we either get a software frame if |
721 // switching to software mode or receive a buffers swapped notification | 708 // switching to software mode or receive a buffers swapped notification |
722 // if switching to accelerated mode. | 709 // if switching to accelerated mode. |
723 // Sometimes (e.g. on a page load) the renderer will spuriously disable then | 710 // Sometimes (e.g. on a page load) the renderer will spuriously disable then |
724 // re-enable accelerated compositing, causing us to flash. | 711 // re-enable accelerated compositing, causing us to flash. |
725 // TODO(piman): factor the enable/disable accelerated compositing message into | 712 // TODO(piman): factor the enable/disable accelerated compositing message into |
726 // the UpdateRect/AcceleratedSurfaceBuffersSwapped messages so that we have | 713 // the UpdateRect/AcceleratedSurfaceBuffersSwapped messages so that we have |
727 // fewer inconsistent temporary states. | 714 // fewer inconsistent temporary states. |
728 accelerated_compositing_state_changed_ = true; | 715 accelerated_compositing_state_changed_ = true; |
729 } | 716 } |
730 | 717 |
731 bool RenderWidgetHostViewAura::ShouldFastACK(uint64 surface_id) { | 718 bool RenderWidgetHostViewAura::ShouldFastACK(const gfx::Size& size) { |
732 ui::Texture* container = image_transport_clients_[surface_id]; | |
733 DCHECK(container); | |
734 | |
735 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || | 719 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || |
736 can_lock_compositor_ == NO_PENDING_COMMIT || | 720 can_lock_compositor_ == NO_PENDING_COMMIT || |
737 resize_locks_.empty()) | 721 resize_locks_.empty()) |
738 return false; | 722 return false; |
739 | 723 |
740 gfx::Size container_size = ConvertSizeToDIP(this, container->size()); | 724 gfx::Size container_size = ConvertSizeToDIP(this, size); |
741 ResizeLockList::iterator it = resize_locks_.begin(); | 725 ResizeLockList::iterator it = resize_locks_.begin(); |
742 while (it != resize_locks_.end()) { | 726 while (it != resize_locks_.end()) { |
743 if ((*it)->expected_size() == container_size) | 727 if ((*it)->expected_size() == container_size) |
744 break; | 728 break; |
745 ++it; | 729 ++it; |
746 } | 730 } |
747 | 731 |
748 // We could be getting an unexpected frame due to an animation | 732 // We could be getting an unexpected frame due to an animation |
749 // (i.e. we start resizing but we get an old size frame first). | 733 // (i.e. we start resizing but we get an old size frame first). |
750 return it == resize_locks_.end() || ++it != resize_locks_.end(); | 734 return it == resize_locks_.end() || ++it != resize_locks_.end(); |
751 } | 735 } |
752 | 736 |
753 void RenderWidgetHostViewAura::UpdateExternalTexture() { | 737 void RenderWidgetHostViewAura::UpdateExternalTexture() { |
754 // Delay processing accelerated compositing state change till here where we | 738 // Delay processing accelerated compositing state change till here where we |
755 // act upon the state change. (Clear the external texture if switching to | 739 // act upon the state change. (Clear the external texture if switching to |
756 // software mode or set the external texture if going to accelerated mode). | 740 // software mode or set the external texture if going to accelerated mode). |
757 if (accelerated_compositing_state_changed_) | 741 if (accelerated_compositing_state_changed_) |
758 accelerated_compositing_state_changed_ = false; | 742 accelerated_compositing_state_changed_ = false; |
759 | 743 |
760 if (current_surface_ != 0 && host_->is_accelerated_compositing_active()) { | 744 if (current_surface_ != 0 && host_->is_accelerated_compositing_active()) { |
761 ui::Texture* container = image_transport_clients_[current_surface_]; | 745 ui::Texture* container = image_transport_clients_[current_surface_]; |
762 window_->SetExternalTexture(container); | 746 window_->SetExternalTexture(container); |
763 current_surface_in_use_by_compositor_ = true; | |
764 | 747 |
765 if (!container) { | 748 if (!container) { |
766 resize_locks_.clear(); | 749 resize_locks_.clear(); |
767 } else { | 750 } else { |
768 ResizeLockList::iterator it = resize_locks_.begin(); | 751 ResizeLockList::iterator it = resize_locks_.begin(); |
769 while (it != resize_locks_.end()) { | 752 while (it != resize_locks_.end()) { |
770 gfx::Size container_size = ConvertSizeToDIP(this, | 753 gfx::Size container_size = ConvertSizeToDIP(this, |
771 container->size()); | 754 container->size()); |
772 if ((*it)->expected_size() == container_size) | 755 if ((*it)->expected_size() == container_size) |
773 break; | 756 break; |
(...skipping 15 matching lines...) Expand all Loading... | |
789 it2->get()->UnlockCompositor(); | 772 it2->get()->UnlockCompositor(); |
790 } | 773 } |
791 if (!compositor->HasObserver(this)) | 774 if (!compositor->HasObserver(this)) |
792 compositor->AddObserver(this); | 775 compositor->AddObserver(this); |
793 } | 776 } |
794 resize_locks_.erase(resize_locks_.begin(), it); | 777 resize_locks_.erase(resize_locks_.begin(), it); |
795 } | 778 } |
796 } | 779 } |
797 } else { | 780 } else { |
798 window_->SetExternalTexture(NULL); | 781 window_->SetExternalTexture(NULL); |
799 if (ShouldReleaseFrontSurface() && | |
800 host_->is_accelerated_compositing_active()) { | |
801 // We need to wait for a commit to clear to guarantee that all we | |
802 // will not issue any more GL referencing the previous surface. | |
803 ui::Compositor* compositor = GetCompositor(); | |
804 if (compositor) { | |
805 can_lock_compositor_ = NO_PENDING_COMMIT; | |
806 on_compositing_did_commit_callbacks_.push_back( | |
807 base::Bind(&RenderWidgetHostViewAura:: | |
808 SetSurfaceNotInUseByCompositor, | |
809 AsWeakPtr())); | |
810 if (!compositor->HasObserver(this)) | |
811 compositor->AddObserver(this); | |
812 } | |
813 } | |
814 resize_locks_.clear(); | 782 resize_locks_.clear(); |
815 } | 783 } |
816 } | 784 } |
817 | 785 |
786 void RenderWidgetHostViewAura::SwapBuffersCompleted( | |
787 int gpu_host_id, | |
788 int route_id, | |
789 uint64 surface_handle, | |
790 scoped_refptr<ui::Texture> texture) { | |
791 ui::Compositor* compositor = GetCompositor(); | |
792 if (!compositor) { | |
793 InsertSyncPointAndACK(route_id, gpu_host_id, surface_handle, texture); | |
794 } else { | |
795 // Add sending an ACK to the list of things to do OnCompositingDidCommit | |
796 can_lock_compositor_ = NO_PENDING_COMMIT; | |
797 on_compositing_did_commit_callbacks_.push_back( | |
798 base::Bind(&RenderWidgetHostViewAura::InsertSyncPointAndACK, | |
799 route_id, | |
800 gpu_host_id, | |
801 surface_handle, | |
802 texture)); | |
803 if (!compositor->HasObserver(this)) | |
804 compositor->AddObserver(this); | |
805 } | |
806 } | |
807 | |
818 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( | 808 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( |
819 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, | 809 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, |
820 int gpu_host_id) { | 810 int gpu_host_id) { |
821 surface_route_id_ = params_in_pixel.route_id; | 811 const gfx::Rect surface_rect = gfx::Rect(gfx::Point(), params_in_pixel.size); |
822 // If protection state changed, then this swap is stale. We must still ACK but | 812 if (ShouldFastACK(params_in_pixel.size)) { |
jonathan.backer
2012/11/12 16:52:15
I'm torn as to handle the detached (no compositor
no sievers
2012/11/19 20:30:44
When exactly would this happen?
It sounds though l
piman
2012/11/19 22:09:52
When detached, there'll be no commit either since
piman
2012/11/19 22:31:54
GetCompositor() walks the window tree to find the
| |
823 // do not update current_surface_ since it may have been discarded. | 813 skipped_damage_ = UnionRects(skipped_damage_, surface_rect); |
824 if (params_in_pixel.protection_state_id && | 814 InsertSyncPointAndACK(params_in_pixel.route_id, |
825 params_in_pixel.protection_state_id != protection_state_id_) { | 815 gpu_host_id, |
826 DCHECK(!current_surface_); | 816 params_in_pixel.surface_handle, |
827 if (!params_in_pixel.skip_ack) | 817 NULL); |
828 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL); | |
829 return; | 818 return; |
830 } | 819 } |
831 | 820 |
832 if (ShouldFastACK(params_in_pixel.surface_handle)) { | 821 const uint64 previous_surface = current_surface_; |
833 if (!params_in_pixel.skip_ack) | 822 scoped_refptr<ui::Texture> texture_to_return; |
834 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL); | 823 if (previous_surface) |
835 return; | 824 texture_to_return = image_transport_clients_[previous_surface]; |
825 | |
826 current_surface_ = params_in_pixel.surface_handle; | |
827 DCHECK(image_transport_clients_.find(params_in_pixel.surface_handle) != | |
828 image_transport_clients_.end()); | |
829 | |
830 image_transport_clients_[current_surface_]->Consume(params_in_pixel.size); | |
831 released_front_lock_ = NULL; | |
832 UpdateExternalTexture(); | |
833 | |
834 previous_damage_rect_ = surface_rect; | |
835 if (!skipped_damage_.IsEmpty()) | |
piman
2012/11/09 22:02:01
The test isn't useful, since you always end up wit
no sievers
2012/11/19 20:30:44
Done.
| |
836 skipped_damage_ = gfx::Rect(); | |
837 | |
838 ui::Compositor* compositor = GetCompositor(); | |
839 if (compositor) { | |
840 gfx::Size surface_size = ConvertSizeToDIP(this, params_in_pixel.size); | |
841 window_->SchedulePaintInRect(gfx::Rect(surface_size)); | |
836 } | 842 } |
837 | 843 |
838 current_surface_ = params_in_pixel.surface_handle; | 844 SwapBuffersCompleted(gpu_host_id, |
839 // If we don't require an ACK that means the content is not a fresh updated | 845 params_in_pixel.route_id, |
840 // new frame, rather we are just resetting our handle to some old content | 846 previous_surface, |
841 // that we still hadn't discarded. Although we could display immediately, | 847 texture_to_return); |
842 // by not resetting the compositor lock here, we give us some time to get | |
843 // a fresh frame which means fewer content flashes. | |
844 if (!params_in_pixel.skip_ack) | |
845 released_front_lock_ = NULL; | |
846 | |
847 UpdateExternalTexture(); | |
848 | |
849 ui::Compositor* compositor = GetCompositor(); | |
850 if (!compositor) { | |
851 if (!params_in_pixel.skip_ack) | |
852 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, true, NULL); | |
853 } else { | |
854 DCHECK(image_transport_clients_.find(params_in_pixel.surface_handle) != | |
855 image_transport_clients_.end()); | |
856 gfx::Size surface_size_in_pixel = | |
857 image_transport_clients_[params_in_pixel.surface_handle]->size(); | |
858 gfx::Size surface_size = ConvertSizeToDIP(this, surface_size_in_pixel); | |
859 window_->SchedulePaintInRect(gfx::Rect(surface_size)); | |
860 | |
861 if (!params_in_pixel.skip_ack) { | |
862 // Add sending an ACK to the list of things to do OnCompositingDidCommit | |
863 can_lock_compositor_ = NO_PENDING_COMMIT; | |
864 on_compositing_did_commit_callbacks_.push_back( | |
865 base::Bind(&RenderWidgetHostViewAura::InsertSyncPointAndACK, | |
866 params_in_pixel.route_id, | |
867 gpu_host_id, | |
868 true)); | |
869 if (!compositor->HasObserver(this)) | |
870 compositor->AddObserver(this); | |
871 } | |
872 } | |
873 } | 848 } |
874 | 849 |
875 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( | 850 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( |
876 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, | 851 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, |
877 int gpu_host_id) { | 852 int gpu_host_id) { |
878 surface_route_id_ = params_in_pixel.route_id; | 853 const gfx::Rect surface_rect = |
879 // If visible state changed, then this PSB is stale. We must still ACK but | 854 gfx::Rect(gfx::Point(), params_in_pixel.surface_size); |
880 // do not update current_surface_. | 855 gfx::Rect damage_rect(params_in_pixel.x, |
881 if (params_in_pixel.protection_state_id && | 856 params_in_pixel.y, |
882 params_in_pixel.protection_state_id != protection_state_id_) { | 857 params_in_pixel.width, |
883 DCHECK(!current_surface_); | 858 params_in_pixel.height); |
884 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL); | 859 if (ShouldFastACK(params_in_pixel.surface_size)) { |
860 skipped_damage_ = UnionRects(skipped_damage_, damage_rect); | |
861 InsertSyncPointAndACK(params_in_pixel.route_id, | |
862 gpu_host_id, | |
863 params_in_pixel.surface_handle, | |
864 NULL); | |
885 return; | 865 return; |
886 } | 866 } |
887 | 867 |
888 if (ShouldFastACK(params_in_pixel.surface_handle)) { | 868 const uint64 previous_surface = current_surface_; |
889 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL); | 869 scoped_refptr<ui::Texture> texture_to_return; |
890 return; | 870 if (previous_surface) |
871 texture_to_return = image_transport_clients_[previous_surface]; | |
872 | |
873 current_surface_ = params_in_pixel.surface_handle; | |
874 DCHECK(image_transport_clients_.find(params_in_pixel.surface_handle) != | |
875 image_transport_clients_.end()); | |
876 | |
877 scoped_refptr<ui::Texture>& current_texture = | |
piman
2012/11/09 22:02:01
scoped_refptr<ui::Texture>& -> ui::Texture*? You'r
no sievers
2012/11/19 20:30:44
Done.
| |
878 image_transport_clients_[current_surface_]; | |
879 current_texture->Consume(params_in_pixel.surface_size); | |
880 released_front_lock_ = NULL; | |
881 UpdateExternalTexture(); | |
882 | |
883 if (!surface_rect.Contains(skipped_damage_)) { | |
884 // The surface could have shrunk since we skipped an update, in which | |
885 // case we can expect a full update. | |
886 DCHECK(damage_rect == surface_rect); | |
piman
2012/11/09 22:02:01
mmh, you're really asserting something that's comi
no sievers
2012/11/19 20:30:44
Done.
| |
887 skipped_damage_ = gfx::Rect(); | |
891 } | 888 } |
892 | 889 |
893 current_surface_ = params_in_pixel.surface_handle; | 890 if (!skipped_damage_.IsEmpty()) { |
894 released_front_lock_ = NULL; | 891 damage_rect = UnionRects(skipped_damage_, damage_rect); |
piman
2012/11/09 22:02:01
So the problem here (and when we union the skipped
jonathan.backer
2012/11/12 16:52:15
Good catch.
no sievers
2012/11/19 20:30:44
Done.
| |
895 DCHECK(current_surface_); | 892 skipped_damage_ = gfx::Rect(); |
896 UpdateExternalTexture(); | 893 } |
897 | 894 |
895 DCHECK(surface_rect.Contains(damage_rect)); | |
898 ui::Compositor* compositor = GetCompositor(); | 896 ui::Compositor* compositor = GetCompositor(); |
899 if (!compositor) { | 897 if (compositor) { |
piman
2012/11/09 22:02:01
I think you should do this always. At least the co
jonathan.backer
2012/11/12 16:52:15
As I've mentioned above, I have a slight preferenc
no sievers
2012/11/19 20:30:44
Done, I let it skip the frame if !GetCompositor().
| |
900 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, true, NULL); | 898 const gfx::Size surface_size_in_pixel = params_in_pixel.surface_size; |
901 } else { | 899 DCHECK(!texture_to_return || |
902 DCHECK(image_transport_clients_.find(params_in_pixel.surface_handle) != | 900 texture_to_return->size() == current_texture->size() || |
903 image_transport_clients_.end()); | 901 damage_rect == surface_rect); |
904 gfx::Size surface_size_in_pixel = | 902 if (texture_to_return && !previous_damage_rect_.IsEmpty() && |
905 image_transport_clients_[params_in_pixel.surface_handle]->size(); | 903 texture_to_return->size() == current_texture->size()) { |
904 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
905 GLHelper* gl_helper = factory->GetGLHelper(); | |
906 gl_helper->CopySubBufferDamage(current_texture->PrepareTexture(), | |
907 texture_to_return->PrepareTexture(), | |
908 damage_rect, | |
909 previous_damage_rect_); | |
jonathan.backer
2012/11/12 16:52:15
Which context is current here? Maybe it doesn't ma
no sievers
2012/11/19 20:30:44
Yes, the thumbnailer also uses the GLHelper and re
piman
2012/11/19 22:09:52
On the client side, makeContextCurrent is essentia
| |
910 } | |
911 previous_damage_rect_ = damage_rect; | |
906 | 912 |
907 // Co-ordinates come in OpenGL co-ordinate space. | 913 // Co-ordinates come in OpenGL co-ordinate space. |
908 // We need to convert to layer space. | 914 // We need to convert to layer space. |
909 gfx::Rect rect_to_paint = ConvertRectToDIP(this, gfx::Rect( | 915 gfx::Rect rect_to_paint = ConvertRectToDIP(this, gfx::Rect( |
910 params_in_pixel.x, | 916 params_in_pixel.x, |
911 surface_size_in_pixel.height() - params_in_pixel.y - | 917 surface_size_in_pixel.height() - params_in_pixel.y - |
912 params_in_pixel.height, | 918 params_in_pixel.height, |
913 params_in_pixel.width, | 919 params_in_pixel.width, |
914 params_in_pixel.height)); | 920 params_in_pixel.height)); |
915 | 921 |
916 // Damage may not have been DIP aligned, so inflate damage to compensate | 922 // Damage may not have been DIP aligned, so inflate damage to compensate |
917 // for any round-off error. | 923 // for any round-off error. |
918 rect_to_paint.Inset(-1, -1); | 924 rect_to_paint.Inset(-1, -1); |
919 rect_to_paint.Intersect(window_->bounds()); | 925 rect_to_paint.Intersect(window_->bounds()); |
920 | 926 |
921 window_->SchedulePaintInRect(rect_to_paint); | 927 window_->SchedulePaintInRect(rect_to_paint); |
928 } | |
922 | 929 |
923 // Add sending an ACK to the list of things to do OnCompositingDidCommit | 930 SwapBuffersCompleted(gpu_host_id, |
924 can_lock_compositor_ = NO_PENDING_COMMIT; | 931 params_in_pixel.route_id, |
925 on_compositing_did_commit_callbacks_.push_back( | 932 previous_surface, |
926 base::Bind(&RenderWidgetHostViewAura::InsertSyncPointAndACK, | 933 texture_to_return); |
927 params_in_pixel.route_id, | |
928 gpu_host_id, | |
929 true)); | |
930 if (!compositor->HasObserver(this)) | |
931 compositor->AddObserver(this); | |
932 } | |
933 } | 934 } |
934 | 935 |
935 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { | 936 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { |
936 } | 937 } |
937 | 938 |
938 bool RenderWidgetHostViewAura::HasAcceleratedSurface( | 939 bool RenderWidgetHostViewAura::HasAcceleratedSurface( |
939 const gfx::Size& desired_size) { | 940 const gfx::Size& desired_size) { |
940 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't | 941 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't |
941 // matter what is returned here as GetBackingStore is the only caller of this | 942 // matter what is returned here as GetBackingStore is the only caller of this |
942 // method. TODO(jbates) implement this if other Aura code needs it. | 943 // method. TODO(jbates) implement this if other Aura code needs it. |
943 return false; | 944 return false; |
944 } | 945 } |
945 | 946 |
946 // TODO(backer): Drop the |shm_handle| once I remove some unused service side | 947 // TODO(backer): Drop the |shm_handle| once I remove some unused service side |
947 // code. | 948 // code. |
948 void RenderWidgetHostViewAura::AcceleratedSurfaceNew( | 949 void RenderWidgetHostViewAura::AcceleratedSurfaceNew( |
949 int32 width_in_pixel, | 950 int32 width_in_pixel, |
950 int32 height_in_pixel, | 951 int32 height_in_pixel, |
951 uint64 surface_handle) { | 952 uint64 surface_handle, |
953 const std::vector<signed char>& mailbox_name) { | |
952 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 954 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
953 scoped_refptr<ui::Texture> surface(factory->CreateTransportClient( | 955 scoped_refptr<ui::Texture> surface(factory->CreateTransportClient( |
954 gfx::Size(width_in_pixel, height_in_pixel), device_scale_factor_, | 956 gfx::Size(width_in_pixel, height_in_pixel), device_scale_factor_, |
955 surface_handle)); | 957 mailbox_name)); |
956 if (!surface) { | 958 if (!surface) { |
957 LOG(ERROR) << "Failed to create ImageTransport texture"; | 959 LOG(ERROR) << "Failed to create ImageTransport texture"; |
958 return; | 960 return; |
959 } | 961 } |
960 | |
961 image_transport_clients_[surface_handle] = surface; | 962 image_transport_clients_[surface_handle] = surface; |
962 } | 963 } |
963 | 964 |
964 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease( | 965 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease( |
965 uint64 surface_handle) { | 966 uint64 surface_handle) { |
966 DCHECK(image_transport_clients_.find(surface_handle) != | 967 // This really tells us to release the frontbuffer. |
967 image_transport_clients_.end()); | 968 if (current_surface_ && ShouldReleaseFrontSurface() && |
piman
2012/11/09 22:02:01
We should only do this if current_surface_==surfac
no sievers
2012/11/19 20:30:44
Well, I guess I changed the semantics of the messa
| |
968 if (current_surface_ == surface_handle) { | 969 host_->is_accelerated_compositing_active()) { |
piman
2012/11/09 22:02:01
Why is this test needed? Note, it's almost positiv
no sievers
2012/11/19 20:30:44
Done.
| |
970 ui::Compositor* compositor = GetCompositor(); | |
971 if (compositor) { | |
972 // We need to wait for a commit to clear to guarantee that all we | |
973 // will not issue any more GL referencing the previous surface. | |
974 can_lock_compositor_ = NO_PENDING_COMMIT; | |
975 scoped_refptr<ui::Texture> surface_ref = | |
976 image_transport_clients_[surface_handle]; | |
977 on_compositing_did_commit_callbacks_.push_back( | |
978 base::Bind(&RenderWidgetHostViewAura:: | |
979 SetSurfaceNotInUseByCompositor, | |
980 AsWeakPtr(), | |
981 surface_ref)); | |
982 if (!compositor->HasObserver(this)) | |
983 compositor->AddObserver(this); | |
984 } | |
985 image_transport_clients_.erase(current_surface_); | |
piman
2012/11/09 22:02:01
This should still happen always
| |
969 current_surface_ = 0; | 986 current_surface_ = 0; |
970 UpdateExternalTexture(); | 987 UpdateExternalTexture(); |
971 } | 988 } |
972 image_transport_clients_.erase(surface_handle); | |
973 } | 989 } |
974 | 990 |
975 void RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor(ui::Compositor*) { | 991 void RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor( |
976 if (current_surface_ || !host_->is_hidden()) | 992 scoped_refptr<ui::Texture>) { |
977 return; | |
978 current_surface_in_use_by_compositor_ = false; | |
979 AdjustSurfaceProtection(); | |
980 } | |
981 | |
982 void RenderWidgetHostViewAura::AdjustSurfaceProtection() { | |
983 // If the current surface is non null, it is protected. | |
984 // If we are visible, it is protected. | |
985 // Otherwise, change to not proctected once done thumbnailing and compositing. | |
986 bool surface_is_protected = | |
987 current_surface_ || | |
988 !host_->is_hidden() || | |
989 (current_surface_is_protected_ && | |
990 (pending_thumbnail_tasks_ > 0 || | |
991 current_surface_in_use_by_compositor_)); | |
992 if (current_surface_is_protected_ == surface_is_protected) | |
993 return; | |
994 current_surface_is_protected_ = surface_is_protected; | |
995 ++protection_state_id_; | |
996 | |
997 if (!surface_route_id_ || !shared_surface_handle_.parent_gpu_process_id) | |
998 return; | |
999 | |
1000 RenderWidgetHostImpl::SendFrontSurfaceIsProtected( | |
1001 surface_is_protected, | |
1002 protection_state_id_, | |
1003 surface_route_id_, | |
1004 shared_surface_handle_.parent_gpu_process_id); | |
1005 } | 993 } |
1006 | 994 |
1007 void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished( | 995 void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished( |
1008 base::WeakPtr<RenderWidgetHostViewAura> render_widget_host_view, | 996 base::WeakPtr<RenderWidgetHostViewAura> render_widget_host_view, |
1009 const base::Callback<void(bool)>& callback, | 997 const base::Callback<void(bool)>& callback, |
998 scoped_refptr<ui::Texture>, | |
1010 bool result) { | 999 bool result) { |
1011 callback.Run(result); | 1000 callback.Run(result); |
1012 | 1001 |
1013 if (!render_widget_host_view.get()) | 1002 if (!render_widget_host_view.get()) |
1014 return; | 1003 return; |
1015 --render_widget_host_view->pending_thumbnail_tasks_; | 1004 --render_widget_host_view->pending_thumbnail_tasks_; |
1016 render_widget_host_view->AdjustSurfaceProtection(); | |
1017 } | 1005 } |
1018 | 1006 |
1019 void RenderWidgetHostViewAura::SetBackground(const SkBitmap& background) { | 1007 void RenderWidgetHostViewAura::SetBackground(const SkBitmap& background) { |
1020 RenderWidgetHostViewBase::SetBackground(background); | 1008 RenderWidgetHostViewBase::SetBackground(background); |
1021 host_->SetBackground(background); | 1009 host_->SetBackground(background); |
1022 window_->layer()->SetFillsBoundsOpaquely(background.isOpaque()); | 1010 window_->layer()->SetFillsBoundsOpaquely(background.isOpaque()); |
1023 } | 1011 } |
1024 | 1012 |
1025 void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) { | 1013 void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) { |
1026 GetScreenInfoForWindow(results, window_); | 1014 GetScreenInfoForWindow(results, window_); |
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1687 | 1675 |
1688 void RenderWidgetHostViewAura::OnCompositingDidCommit( | 1676 void RenderWidgetHostViewAura::OnCompositingDidCommit( |
1689 ui::Compositor* compositor) { | 1677 ui::Compositor* compositor) { |
1690 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 1678 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
1691 can_lock_compositor_ = YES; | 1679 can_lock_compositor_ = YES; |
1692 for (ResizeLockList::iterator it = resize_locks_.begin(); | 1680 for (ResizeLockList::iterator it = resize_locks_.begin(); |
1693 it != resize_locks_.end(); ++it) | 1681 it != resize_locks_.end(); ++it) |
1694 if ((*it)->GrabDeferredLock()) | 1682 if ((*it)->GrabDeferredLock()) |
1695 can_lock_compositor_ = YES_DID_LOCK; | 1683 can_lock_compositor_ = YES_DID_LOCK; |
1696 } | 1684 } |
1697 RunCompositingDidCommitCallbacks(compositor); | 1685 RunCompositingDidCommitCallbacks(); |
1698 locks_pending_commit_.clear(); | 1686 locks_pending_commit_.clear(); |
1699 } | 1687 } |
1700 | 1688 |
1701 void RenderWidgetHostViewAura::OnCompositingStarted( | 1689 void RenderWidgetHostViewAura::OnCompositingStarted( |
1702 ui::Compositor* compositor) { | 1690 ui::Compositor* compositor) { |
1703 } | 1691 } |
1704 | 1692 |
1705 void RenderWidgetHostViewAura::OnCompositingEnded( | 1693 void RenderWidgetHostViewAura::OnCompositingEnded( |
1706 ui::Compositor* compositor) { | 1694 ui::Compositor* compositor) { |
1707 } | 1695 } |
(...skipping 10 matching lines...) Expand all Loading... | |
1718 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; | 1706 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; |
1719 } | 1707 } |
1720 } | 1708 } |
1721 | 1709 |
1722 //////////////////////////////////////////////////////////////////////////////// | 1710 //////////////////////////////////////////////////////////////////////////////// |
1723 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: | 1711 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: |
1724 | 1712 |
1725 void RenderWidgetHostViewAura::OnLostResources() { | 1713 void RenderWidgetHostViewAura::OnLostResources() { |
1726 image_transport_clients_.clear(); | 1714 image_transport_clients_.clear(); |
1727 current_surface_ = 0; | 1715 current_surface_ = 0; |
1728 protection_state_id_ = 0; | |
1729 current_surface_is_protected_ = true; | |
1730 current_surface_in_use_by_compositor_ = true; | |
1731 surface_route_id_ = 0; | |
1732 UpdateExternalTexture(); | 1716 UpdateExternalTexture(); |
1733 locks_pending_commit_.clear(); | 1717 locks_pending_commit_.clear(); |
1734 | 1718 |
1735 DCHECK(!shared_surface_handle_.is_null()); | 1719 DCHECK(!shared_surface_handle_.is_null()); |
1736 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 1720 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
1737 factory->DestroySharedSurfaceHandle(shared_surface_handle_); | 1721 factory->DestroySharedSurfaceHandle(shared_surface_handle_); |
1738 shared_surface_handle_ = factory->CreateSharedSurfaceHandle(); | 1722 shared_surface_handle_ = factory->CreateSharedSurfaceHandle(); |
1739 host_->CompositingSurfaceUpdated(); | 1723 host_->CompositingSurfaceUpdated(); |
1740 host_->ScheduleComposite(); | 1724 host_->ScheduleComposite(); |
1741 } | 1725 } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1856 gfx::Rect rect = window_->bounds(); | 1840 gfx::Rect rect = window_->bounds(); |
1857 int border_x = rect.width() * kMouseLockBorderPercentage / 100; | 1841 int border_x = rect.width() * kMouseLockBorderPercentage / 100; |
1858 int border_y = rect.height() * kMouseLockBorderPercentage / 100; | 1842 int border_y = rect.height() * kMouseLockBorderPercentage / 100; |
1859 | 1843 |
1860 return global_mouse_position_.x() < rect.x() + border_x || | 1844 return global_mouse_position_.x() < rect.x() + border_x || |
1861 global_mouse_position_.x() > rect.right() - border_x || | 1845 global_mouse_position_.x() > rect.right() - border_x || |
1862 global_mouse_position_.y() < rect.y() + border_y || | 1846 global_mouse_position_.y() < rect.y() + border_y || |
1863 global_mouse_position_.y() > rect.bottom() - border_y; | 1847 global_mouse_position_.y() > rect.bottom() - border_y; |
1864 } | 1848 } |
1865 | 1849 |
1866 void RenderWidgetHostViewAura::RunCompositingDidCommitCallbacks( | 1850 void RenderWidgetHostViewAura::RunCompositingDidCommitCallbacks() { |
1867 ui::Compositor* compositor) { | 1851 for (std::vector<base::Closure>::const_iterator |
1868 for (std::vector< base::Callback<void(ui::Compositor*)> >::const_iterator | |
1869 it = on_compositing_did_commit_callbacks_.begin(); | 1852 it = on_compositing_did_commit_callbacks_.begin(); |
1870 it != on_compositing_did_commit_callbacks_.end(); ++it) { | 1853 it != on_compositing_did_commit_callbacks_.end(); ++it) { |
1871 it->Run(compositor); | 1854 it->Run(); |
1872 } | 1855 } |
1873 on_compositing_did_commit_callbacks_.clear(); | 1856 on_compositing_did_commit_callbacks_.clear(); |
1874 } | 1857 } |
1875 | 1858 |
1876 // static | 1859 // static |
1877 void RenderWidgetHostViewAura::InsertSyncPointAndACK( | 1860 void RenderWidgetHostViewAura::InsertSyncPointAndACK( |
1878 int32 route_id, int gpu_host_id, bool presented, | 1861 int32 route_id, |
1879 ui::Compositor* compositor) { | 1862 int gpu_host_id, |
1863 uint64 surface_handle, | |
1864 scoped_refptr<ui::Texture> texture_to_produce) { | |
1865 if (texture_to_produce) | |
1866 texture_to_produce->Produce(); | |
1867 | |
1868 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
1869 | |
1880 uint32 sync_point = 0; | 1870 uint32 sync_point = 0; |
1881 // If we have no compositor, so we must still send the ACK. A zero | 1871 // If we did at least consume a texture (not skipped a frame), we have |
1882 // sync point will not be waited for in the GPU process. | 1872 // to insert a sync point. |
1883 if (compositor) { | 1873 if (texture_to_produce || !surface_handle) |
1884 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 1874 sync_point = factory->InsertSyncPoint(); |
1885 sync_point = factory->InsertSyncPoint(); | |
1886 } | |
1887 | 1875 |
1888 RenderWidgetHostImpl::AcknowledgeBufferPresent( | 1876 RenderWidgetHostImpl::AcknowledgeBufferPresent( |
1889 route_id, gpu_host_id, presented, sync_point); | 1877 route_id, gpu_host_id, surface_handle, sync_point); |
1890 } | 1878 } |
1891 | 1879 |
1892 void RenderWidgetHostViewAura::AddingToRootWindow() { | 1880 void RenderWidgetHostViewAura::AddingToRootWindow() { |
1893 host_->ParentChanged(GetNativeViewId()); | 1881 host_->ParentChanged(GetNativeViewId()); |
1894 } | 1882 } |
1895 | 1883 |
1896 void RenderWidgetHostViewAura::RemovingFromRootWindow() { | 1884 void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
1897 host_->ParentChanged(0); | 1885 host_->ParentChanged(0); |
1898 // We are about to disconnect ourselves from the compositor, we need to issue | 1886 // We are about to disconnect ourselves from the compositor, we need to issue |
1899 // the callbacks now, because we won't get notified when the frame is done. | 1887 // the callbacks now, because we won't get notified when the frame is done. |
1900 // TODO(piman): this might in theory cause a race where the GPU process starts | 1888 // TODO(piman): this might in theory cause a race where the GPU process starts |
1901 // drawing to the buffer we haven't yet displayed. This will only show for 1 | 1889 // drawing to the buffer we haven't yet displayed. This will only show for 1 |
1902 // frame though, because we will reissue a new frame right away without that | 1890 // frame though, because we will reissue a new frame right away without that |
1903 // composited data. | 1891 // composited data. |
1904 ui::Compositor* compositor = GetCompositor(); | 1892 ui::Compositor* compositor = GetCompositor(); |
1905 RunCompositingDidCommitCallbacks(compositor); | 1893 RunCompositingDidCommitCallbacks(); |
1906 locks_pending_commit_.clear(); | 1894 locks_pending_commit_.clear(); |
1907 if (compositor && compositor->HasObserver(this)) | 1895 if (compositor && compositor->HasObserver(this)) |
1908 compositor->RemoveObserver(this); | 1896 compositor->RemoveObserver(this); |
1909 DetachFromInputMethod(); | 1897 DetachFromInputMethod(); |
1910 } | 1898 } |
1911 | 1899 |
1912 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() { | 1900 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() { |
1913 aura::RootWindow* root_window = window_->GetRootWindow(); | 1901 aura::RootWindow* root_window = window_->GetRootWindow(); |
1914 return root_window ? root_window->compositor() : NULL; | 1902 return root_window ? root_window->compositor() : NULL; |
1915 } | 1903 } |
(...skipping 12 matching lines...) Expand all Loading... | |
1928 RenderWidgetHost* widget) { | 1916 RenderWidgetHost* widget) { |
1929 return new RenderWidgetHostViewAura(widget); | 1917 return new RenderWidgetHostViewAura(widget); |
1930 } | 1918 } |
1931 | 1919 |
1932 // static | 1920 // static |
1933 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { | 1921 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { |
1934 GetScreenInfoForWindow(results, NULL); | 1922 GetScreenInfoForWindow(results, NULL); |
1935 } | 1923 } |
1936 | 1924 |
1937 } // namespace content | 1925 } // namespace content |
OLD | NEW |