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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 11194042: Implement TextureImageTransportSurface using texture mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments Created 8 years 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_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 29 matching lines...) Expand all
40 #include "ui/aura/root_window.h" 40 #include "ui/aura/root_window.h"
41 #include "ui/aura/window.h" 41 #include "ui/aura/window.h"
42 #include "ui/aura/window_observer.h" 42 #include "ui/aura/window_observer.h"
43 #include "ui/aura/window_tracker.h" 43 #include "ui/aura/window_tracker.h"
44 #include "ui/base/clipboard/scoped_clipboard_writer.h" 44 #include "ui/base/clipboard/scoped_clipboard_writer.h"
45 #include "ui/base/events/event.h" 45 #include "ui/base/events/event.h"
46 #include "ui/base/gestures/gesture_recognizer.h" 46 #include "ui/base/gestures/gesture_recognizer.h"
47 #include "ui/base/hit_test.h" 47 #include "ui/base/hit_test.h"
48 #include "ui/base/ime/input_method.h" 48 #include "ui/base/ime/input_method.h"
49 #include "ui/base/ui_base_types.h" 49 #include "ui/base/ui_base_types.h"
50 #include "ui/compositor/compositor.h"
51 #include "ui/compositor/layer.h" 50 #include "ui/compositor/layer.h"
52 #include "ui/gfx/canvas.h" 51 #include "ui/gfx/canvas.h"
53 #include "ui/gfx/display.h" 52 #include "ui/gfx/display.h"
54 #include "ui/gfx/rect_conversions.h" 53 #include "ui/gfx/rect_conversions.h"
55 #include "ui/gfx/screen.h" 54 #include "ui/gfx/screen.h"
56 #include "ui/gfx/skia_util.h" 55 #include "ui/gfx/skia_util.h"
57 56
58 #if defined(OS_WIN) 57 #if defined(OS_WIN)
59 #include "ui/base/win/hidden_window.h" 58 #include "ui/base/win/hidden_window.h"
60 #endif 59 #endif
61 60
61 using gfx::RectToSkIRect;
62 using gfx::SkIRectToRect;
jonathan.backer 2012/12/04 19:15:13 What does this do? Prevents you from having to pre
no sievers 2012/12/05 22:02:34 Done.
63
62 using WebKit::WebScreenInfo; 64 using WebKit::WebScreenInfo;
63 using WebKit::WebTouchEvent; 65 using WebKit::WebTouchEvent;
64 66
65 namespace content { 67 namespace content {
66 namespace { 68 namespace {
67 69
68 // In mouse lock mode, we need to prevent the (invisible) cursor from hitting 70 // In mouse lock mode, we need to prevent the (invisible) cursor from hitting
69 // the border of the view, in order to get valid movement information. However, 71 // the border of the view, in order to get valid movement information. However,
70 // forcing the cursor back to the center of the view after each mouse move 72 // forcing the cursor back to the center of the view after each mouse move
71 // doesn't work well. It reduces the frequency of useful mouse move messages 73 // doesn't work well. It reduces the frequency of useful mouse move messages
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 private: 257 private:
256 aura::RootWindow* root_window_; 258 aura::RootWindow* root_window_;
257 gfx::Size new_size_; 259 gfx::Size new_size_;
258 scoped_refptr<ui::CompositorLock> compositor_lock_; 260 scoped_refptr<ui::CompositorLock> compositor_lock_;
259 base::WeakPtrFactory<ResizeLock> weak_ptr_factory_; 261 base::WeakPtrFactory<ResizeLock> weak_ptr_factory_;
260 bool defer_compositor_lock_; 262 bool defer_compositor_lock_;
261 263
262 DISALLOW_COPY_AND_ASSIGN(ResizeLock); 264 DISALLOW_COPY_AND_ASSIGN(ResizeLock);
263 }; 265 };
264 266
267 RenderWidgetHostViewAura::BufferPresentedParams::BufferPresentedParams(
268 int route_id,
269 int gpu_host_id,
270 uint64 surface_handle)
271 : route_id(route_id),
272 gpu_host_id(gpu_host_id),
273 surface_handle(surface_handle) {
274 }
275
276 RenderWidgetHostViewAura::BufferPresentedParams::~BufferPresentedParams() {
277 }
278
265 //////////////////////////////////////////////////////////////////////////////// 279 ////////////////////////////////////////////////////////////////////////////////
266 // RenderWidgetHostViewAura, public: 280 // RenderWidgetHostViewAura, public:
267 281
268 RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) 282 RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
269 : host_(RenderWidgetHostImpl::From(host)), 283 : host_(RenderWidgetHostImpl::From(host)),
270 ALLOW_THIS_IN_INITIALIZER_LIST(window_(new aura::Window(this))), 284 ALLOW_THIS_IN_INITIALIZER_LIST(window_(new aura::Window(this))),
271 in_shutdown_(false), 285 in_shutdown_(false),
272 is_fullscreen_(false), 286 is_fullscreen_(false),
273 popup_parent_host_view_(NULL), 287 popup_parent_host_view_(NULL),
274 popup_child_host_view_(NULL), 288 popup_child_host_view_(NULL),
275 is_loading_(false), 289 is_loading_(false),
276 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 290 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
277 can_compose_inline_(true), 291 can_compose_inline_(true),
278 has_composition_text_(false), 292 has_composition_text_(false),
279 device_scale_factor_(1.0f), 293 device_scale_factor_(1.0f),
280 current_surface_(0), 294 current_surface_(0),
281 current_surface_is_protected_(true),
282 current_surface_in_use_by_compositor_(true),
283 protection_state_id_(0),
284 surface_route_id_(0),
285 paint_canvas_(NULL), 295 paint_canvas_(NULL),
286 synthetic_move_sent_(false), 296 synthetic_move_sent_(false),
287 accelerated_compositing_state_changed_(false), 297 accelerated_compositing_state_changed_(false),
288 can_lock_compositor_(YES), 298 can_lock_compositor_(YES),
289 pointer_activate_(false) { 299 pointer_activate_(false) {
290 host_->SetView(this); 300 host_->SetView(this);
291 window_observer_.reset(new WindowObserver(this)); 301 window_observer_.reset(new WindowObserver(this));
292 window_->AddObserver(window_observer_.get()); 302 window_->AddObserver(window_observer_.get());
293 aura::client::SetTooltipText(window_, &tooltip_); 303 aura::client::SetTooltipText(window_, &tooltip_);
294 aura::client::SetActivationDelegate(window_, this); 304 aura::client::SetActivationDelegate(window_, this);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 void RenderWidgetHostViewAura::WasShown() { 386 void RenderWidgetHostViewAura::WasShown() {
377 if (!host_->is_hidden()) 387 if (!host_->is_hidden())
378 return; 388 return;
379 host_->WasShown(); 389 host_->WasShown();
380 390
381 if (!current_surface_ && host_->is_accelerated_compositing_active() && 391 if (!current_surface_ && host_->is_accelerated_compositing_active() &&
382 !released_front_lock_.get()) { 392 !released_front_lock_.get()) {
383 released_front_lock_ = GetCompositor()->GetCompositorLock(); 393 released_front_lock_ = GetCompositor()->GetCompositorLock();
384 } 394 }
385 395
386 AdjustSurfaceProtection();
387
388 #if defined(OS_WIN) 396 #if defined(OS_WIN)
389 LPARAM lparam = reinterpret_cast<LPARAM>(this); 397 LPARAM lparam = reinterpret_cast<LPARAM>(this);
390 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); 398 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
391 #endif 399 #endif
392 } 400 }
393 401
394 void RenderWidgetHostViewAura::WasHidden() { 402 void RenderWidgetHostViewAura::WasHidden() {
395 if (host_->is_hidden()) 403 if (host_->is_hidden())
396 return; 404 return;
397 host_->WasHidden(); 405 host_->WasHidden();
398 406
399 released_front_lock_ = NULL; 407 released_front_lock_ = NULL;
400 408
401 if (ShouldReleaseFrontSurface() &&
402 host_->is_accelerated_compositing_active()) {
403 current_surface_ = 0;
404 UpdateExternalTexture();
405 }
406
407 AdjustSurfaceProtection();
408
409 #if defined(OS_WIN) 409 #if defined(OS_WIN)
410 aura::RootWindow* root_window = window_->GetRootWindow(); 410 aura::RootWindow* root_window = window_->GetRootWindow();
411 if (root_window) { 411 if (root_window) {
412 HWND parent = root_window->GetAcceleratedWidget(); 412 HWND parent = root_window->GetAcceleratedWidget();
413 LPARAM lparam = reinterpret_cast<LPARAM>(this); 413 LPARAM lparam = reinterpret_cast<LPARAM>(this);
414 414
415 EnumChildWindows(parent, HideWindowsCallback, lparam); 415 EnumChildWindows(parent, HideWindowsCallback, lparam);
416 } 416 }
417 #endif 417 #endif
418 } 418 }
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 706
707 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 707 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
708 GLHelper* gl_helper = factory->GetGLHelper(); 708 GLHelper* gl_helper = factory->GetGLHelper();
709 if (!gl_helper) 709 if (!gl_helper)
710 return; 710 return;
711 711
712 unsigned char* addr = static_cast<unsigned char*>( 712 unsigned char* addr = static_cast<unsigned char*>(
713 output->GetBitmap().getPixels()); 713 output->GetBitmap().getPixels());
714 scoped_callback_runner.Release(); 714 scoped_callback_runner.Release();
715 // Wrap the callback with an internal handler so that we can inject our 715 // Wrap the callback with an internal handler so that we can inject our
716 // own completion handlers (where we can call AdjustSurfaceProtection). 716 // own completion handlers (where we can try to free the frontbuffer).
717 base::Callback<void(bool)> wrapper_callback = base::Bind( 717 base::Callback<void(bool)> wrapper_callback = base::Bind(
718 &RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished, 718 &RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished,
719 AsWeakPtr(), 719 AsWeakPtr(),
720 callback); 720 callback);
721 ++pending_thumbnail_tasks_; 721 ++pending_thumbnail_tasks_;
722 722
723 // Convert |src_subrect| from the views coordinate (upper-left origin) into 723 // Convert |src_subrect| from the views coordinate (upper-left origin) into
724 // the OpenGL coordinate (lower-left origin). 724 // the OpenGL coordinate (lower-left origin).
725 gfx::Rect src_subrect_in_gl = src_subrect; 725 gfx::Rect src_subrect_in_gl = src_subrect;
726 src_subrect_in_gl.set_y(GetViewBounds().height() - src_subrect.bottom()); 726 src_subrect_in_gl.set_y(GetViewBounds().height() - src_subrect.bottom());
(...skipping 12 matching lines...) Expand all
739 // switching to software mode or receive a buffers swapped notification 739 // switching to software mode or receive a buffers swapped notification
740 // if switching to accelerated mode. 740 // if switching to accelerated mode.
741 // Sometimes (e.g. on a page load) the renderer will spuriously disable then 741 // Sometimes (e.g. on a page load) the renderer will spuriously disable then
742 // re-enable accelerated compositing, causing us to flash. 742 // re-enable accelerated compositing, causing us to flash.
743 // TODO(piman): factor the enable/disable accelerated compositing message into 743 // TODO(piman): factor the enable/disable accelerated compositing message into
744 // the UpdateRect/AcceleratedSurfaceBuffersSwapped messages so that we have 744 // the UpdateRect/AcceleratedSurfaceBuffersSwapped messages so that we have
745 // fewer inconsistent temporary states. 745 // fewer inconsistent temporary states.
746 accelerated_compositing_state_changed_ = true; 746 accelerated_compositing_state_changed_ = true;
747 } 747 }
748 748
749 bool RenderWidgetHostViewAura::ShouldFastACK(uint64 surface_id) { 749 bool RenderWidgetHostViewAura::ShouldSkipFrame(const gfx::Size& size) {
750 ui::Texture* container = image_transport_clients_[surface_id];
751 DCHECK(container);
752
753 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || 750 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME ||
754 can_lock_compositor_ == NO_PENDING_COMMIT || 751 can_lock_compositor_ == NO_PENDING_COMMIT ||
755 resize_locks_.empty()) 752 resize_locks_.empty())
756 return false; 753 return false;
757 754
758 gfx::Size container_size = ConvertSizeToDIP(this, container->size()); 755 gfx::Size container_size = ConvertSizeToDIP(this, size);
759 ResizeLockList::iterator it = resize_locks_.begin(); 756 ResizeLockList::iterator it = resize_locks_.begin();
760 while (it != resize_locks_.end()) { 757 while (it != resize_locks_.end()) {
761 if ((*it)->expected_size() == container_size) 758 if ((*it)->expected_size() == container_size)
762 break; 759 break;
763 ++it; 760 ++it;
764 } 761 }
765 762
766 // We could be getting an unexpected frame due to an animation 763 // We could be getting an unexpected frame due to an animation
767 // (i.e. we start resizing but we get an old size frame first). 764 // (i.e. we start resizing but we get an old size frame first).
768 return it == resize_locks_.end() || ++it != resize_locks_.end(); 765 return it == resize_locks_.end() || ++it != resize_locks_.end();
769 } 766 }
770 767
771 void RenderWidgetHostViewAura::UpdateExternalTexture() { 768 void RenderWidgetHostViewAura::UpdateExternalTexture() {
772 // Delay processing accelerated compositing state change till here where we 769 // Delay processing accelerated compositing state change till here where we
773 // act upon the state change. (Clear the external texture if switching to 770 // act upon the state change. (Clear the external texture if switching to
774 // software mode or set the external texture if going to accelerated mode). 771 // software mode or set the external texture if going to accelerated mode).
775 if (accelerated_compositing_state_changed_) 772 if (accelerated_compositing_state_changed_)
776 accelerated_compositing_state_changed_ = false; 773 accelerated_compositing_state_changed_ = false;
777 774
778 if (current_surface_ != 0 && host_->is_accelerated_compositing_active()) { 775 if (current_surface_ != 0 && host_->is_accelerated_compositing_active()) {
779 ui::Texture* container = image_transport_clients_[current_surface_]; 776 ui::Texture* container = image_transport_clients_[current_surface_];
780 window_->SetExternalTexture(container); 777 window_->SetExternalTexture(container);
781 current_surface_in_use_by_compositor_ = true;
782 778
783 if (!container) { 779 if (!container) {
784 resize_locks_.clear(); 780 resize_locks_.clear();
785 } else { 781 } else {
786 ResizeLockList::iterator it = resize_locks_.begin(); 782 ResizeLockList::iterator it = resize_locks_.begin();
787 while (it != resize_locks_.end()) { 783 while (it != resize_locks_.end()) {
788 gfx::Size container_size = ConvertSizeToDIP(this, 784 gfx::Size container_size = ConvertSizeToDIP(this,
789 container->size()); 785 container->size());
790 if ((*it)->expected_size() == container_size) 786 if ((*it)->expected_size() == container_size)
791 break; 787 break;
(...skipping 15 matching lines...) Expand all
807 it2->get()->UnlockCompositor(); 803 it2->get()->UnlockCompositor();
808 } 804 }
809 if (!compositor->HasObserver(this)) 805 if (!compositor->HasObserver(this))
810 compositor->AddObserver(this); 806 compositor->AddObserver(this);
811 } 807 }
812 resize_locks_.erase(resize_locks_.begin(), it); 808 resize_locks_.erase(resize_locks_.begin(), it);
813 } 809 }
814 } 810 }
815 } else { 811 } else {
816 window_->SetExternalTexture(NULL); 812 window_->SetExternalTexture(NULL);
817 if (ShouldReleaseFrontSurface() &&
818 host_->is_accelerated_compositing_active()) {
819 // We need to wait for a commit to clear to guarantee that all we
820 // will not issue any more GL referencing the previous surface.
821 ui::Compositor* compositor = GetCompositor();
822 if (compositor) {
823 can_lock_compositor_ = NO_PENDING_COMMIT;
824 on_compositing_did_commit_callbacks_.push_back(
825 base::Bind(&RenderWidgetHostViewAura::
826 SetSurfaceNotInUseByCompositor,
827 AsWeakPtr()));
828 if (!compositor->HasObserver(this))
829 compositor->AddObserver(this);
830 }
831 }
832 resize_locks_.clear(); 813 resize_locks_.clear();
833 } 814 }
834 } 815 }
835 816
817 bool RenderWidgetHostViewAura::SwapBuffersPrepare(
818 const gfx::Rect& surface_rect,
819 const gfx::Rect& damage_rect,
820 BufferPresentedParams* params) {
821 DCHECK(params->surface_handle);
822 DCHECK(!params->texture_to_produce);
823
824 if (previous_surface_size_ != surface_rect.size()) {
825 // The surface could have shrunk since we skipped an update, in which
826 // case we can expect a full update.
827 DLOG_IF(ERROR, damage_rect != surface_rect) << "Expected full damage rect";
828 skipped_damage_.setEmpty();
829 previous_surface_size_ = surface_rect.size();
830 }
831
832 if (ShouldSkipFrame(surface_rect.size())) {
833 skipped_damage_.op(RectToSkIRect(damage_rect), SkRegion::kUnion_Op);
834 InsertSyncPointAndACK(*params);
835 return false;
836 }
837
838 DCHECK(!current_surface_ || image_transport_clients_.find(current_surface_) !=
839 image_transport_clients_.end());
840 if (current_surface_)
841 params->texture_to_produce = image_transport_clients_[current_surface_];
842
843 std::swap(current_surface_, params->surface_handle);
844
845 DCHECK(image_transport_clients_.find(current_surface_) !=
846 image_transport_clients_.end());
847
848 image_transport_clients_[current_surface_]->Consume(surface_rect.size());
849 released_front_lock_ = NULL;
850 UpdateExternalTexture();
851
852 return true;
853 }
854
855 void RenderWidgetHostViewAura::SwapBuffersCompleted(
856 const BufferPresentedParams& params) {
857 ui::Compositor* compositor = GetCompositor();
858 if (!compositor) {
859 InsertSyncPointAndACK(params);
860 } else {
861 // Add sending an ACK to the list of things to do OnCompositingDidCommit
862 can_lock_compositor_ = NO_PENDING_COMMIT;
863 on_compositing_did_commit_callbacks_.push_back(
864 base::Bind(&RenderWidgetHostViewAura::InsertSyncPointAndACK, params));
865 if (!compositor->HasObserver(this))
866 compositor->AddObserver(this);
867 }
868 }
869
836 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( 870 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped(
837 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, 871 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel,
838 int gpu_host_id) { 872 int gpu_host_id) {
839 surface_route_id_ = params_in_pixel.route_id; 873 const gfx::Rect surface_rect = gfx::Rect(gfx::Point(), params_in_pixel.size);
840 // If protection state changed, then this swap is stale. We must still ACK but 874 BufferPresentedParams ack_params(
841 // do not update current_surface_ since it may have been discarded. 875 params_in_pixel.route_id, gpu_host_id, params_in_pixel.surface_handle);
842 if (params_in_pixel.protection_state_id && 876 if (!SwapBuffersPrepare(surface_rect, surface_rect, &ack_params))
843 params_in_pixel.protection_state_id != protection_state_id_) {
844 DCHECK(!current_surface_);
845 if (!params_in_pixel.skip_ack)
846 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL);
847 return; 877 return;
878
879 previous_damage_.setRect(RectToSkIRect(surface_rect));
880 skipped_damage_.setEmpty();
881
882 ui::Compositor* compositor = GetCompositor();
883 if (compositor) {
884 gfx::Size surface_size = ConvertSizeToDIP(this, params_in_pixel.size);
885 window_->SchedulePaintInRect(gfx::Rect(surface_size));
848 } 886 }
849 887
850 if (ShouldFastACK(params_in_pixel.surface_handle)) { 888 SwapBuffersCompleted(ack_params);
851 if (!params_in_pixel.skip_ack)
852 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL);
853 return;
854 }
855
856 current_surface_ = params_in_pixel.surface_handle;
857 // If we don't require an ACK that means the content is not a fresh updated
858 // new frame, rather we are just resetting our handle to some old content
859 // that we still hadn't discarded. Although we could display immediately,
860 // by not resetting the compositor lock here, we give us some time to get
861 // a fresh frame which means fewer content flashes.
862 if (!params_in_pixel.skip_ack)
863 released_front_lock_ = NULL;
864
865 UpdateExternalTexture();
866
867 ui::Compositor* compositor = GetCompositor();
868 if (!compositor) {
869 if (!params_in_pixel.skip_ack)
870 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, true, NULL);
871 } else {
872 DCHECK(image_transport_clients_.find(params_in_pixel.surface_handle) !=
873 image_transport_clients_.end());
874 gfx::Size surface_size_in_pixel =
875 image_transport_clients_[params_in_pixel.surface_handle]->size();
876 gfx::Size surface_size = ConvertSizeToDIP(this, surface_size_in_pixel);
877 window_->SchedulePaintInRect(gfx::Rect(surface_size));
878
879 if (!params_in_pixel.skip_ack) {
880 // Add sending an ACK to the list of things to do OnCompositingDidCommit
881 can_lock_compositor_ = NO_PENDING_COMMIT;
882 on_compositing_did_commit_callbacks_.push_back(
883 base::Bind(&RenderWidgetHostViewAura::InsertSyncPointAndACK,
884 params_in_pixel.route_id,
885 gpu_host_id,
886 true));
887 if (!compositor->HasObserver(this))
888 compositor->AddObserver(this);
889 }
890 }
891 } 889 }
892 890
893 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( 891 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
894 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, 892 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
895 int gpu_host_id) { 893 int gpu_host_id) {
896 surface_route_id_ = params_in_pixel.route_id; 894 const gfx::Rect surface_rect =
897 // If visible state changed, then this PSB is stale. We must still ACK but 895 gfx::Rect(gfx::Point(), params_in_pixel.surface_size);
898 // do not update current_surface_. 896 gfx::Rect damage_rect(params_in_pixel.x,
899 if (params_in_pixel.protection_state_id && 897 params_in_pixel.y,
900 params_in_pixel.protection_state_id != protection_state_id_) { 898 params_in_pixel.width,
901 DCHECK(!current_surface_); 899 params_in_pixel.height);
902 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL); 900 BufferPresentedParams ack_params(
901 params_in_pixel.route_id, gpu_host_id, params_in_pixel.surface_handle);
902 if (!SwapBuffersPrepare(surface_rect, damage_rect, &ack_params))
903 return; 903 return;
904
905 SkRegion damage(RectToSkIRect(damage_rect));
906 if (!skipped_damage_.isEmpty()) {
907 damage.op(skipped_damage_, SkRegion::kUnion_Op);
908 skipped_damage_.setEmpty();
904 } 909 }
905 910
906 if (ShouldFastACK(params_in_pixel.surface_handle)) { 911 DCHECK(surface_rect.Contains(gfx::SkIRectToRect(damage.getBounds())));
907 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, false, NULL); 912 ui::Texture* current_texture = image_transport_clients_[current_surface_];
908 return; 913
914 const gfx::Size surface_size_in_pixel = params_in_pixel.surface_size;
915 DLOG_IF(ERROR, ack_params.texture_to_produce &&
916 ack_params.texture_to_produce->size() != current_texture->size() &&
917 gfx::SkIRectToRect(damage.getBounds()) != surface_rect) <<
918 "Expected full damage rect after size change";
919 if (ack_params.texture_to_produce && !previous_damage_.isEmpty() &&
jonathan.backer 2012/12/04 19:15:13 nit: Is |previous_damage_.isEmpty()| ever true? I
no sievers 2012/12/05 22:02:34 It can probably only be empty for the very first f
920 ack_params.texture_to_produce->size() == current_texture->size()) {
921 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
922 GLHelper* gl_helper = factory->GetGLHelper();
923 gl_helper->CopySubBufferDamage(
924 current_texture->PrepareTexture(),
925 ack_params.texture_to_produce->PrepareTexture(),
926 damage,
927 previous_damage_);
909 } 928 }
910 929 previous_damage_ = damage;
911 current_surface_ = params_in_pixel.surface_handle;
912 released_front_lock_ = NULL;
913 DCHECK(current_surface_);
914 UpdateExternalTexture();
915 930
916 ui::Compositor* compositor = GetCompositor(); 931 ui::Compositor* compositor = GetCompositor();
917 if (!compositor) { 932 if (compositor) {
918 InsertSyncPointAndACK(params_in_pixel.route_id, gpu_host_id, true, NULL);
919 } else {
920 DCHECK(image_transport_clients_.find(params_in_pixel.surface_handle) !=
921 image_transport_clients_.end());
922 gfx::Size surface_size_in_pixel =
923 image_transport_clients_[params_in_pixel.surface_handle]->size();
924
925 // Co-ordinates come in OpenGL co-ordinate space. 933 // Co-ordinates come in OpenGL co-ordinate space.
926 // We need to convert to layer space. 934 // We need to convert to layer space.
927 gfx::Rect rect_to_paint = ConvertRectToDIP(this, gfx::Rect( 935 gfx::Rect rect_to_paint = ConvertRectToDIP(this, gfx::Rect(
928 params_in_pixel.x, 936 params_in_pixel.x,
929 surface_size_in_pixel.height() - params_in_pixel.y - 937 surface_size_in_pixel.height() - params_in_pixel.y -
930 params_in_pixel.height, 938 params_in_pixel.height,
931 params_in_pixel.width, 939 params_in_pixel.width,
932 params_in_pixel.height)); 940 params_in_pixel.height));
933 941
934 // Damage may not have been DIP aligned, so inflate damage to compensate 942 // Damage may not have been DIP aligned, so inflate damage to compensate
935 // for any round-off error. 943 // for any round-off error.
936 rect_to_paint.Inset(-1, -1); 944 rect_to_paint.Inset(-1, -1);
937 rect_to_paint.Intersect(window_->bounds()); 945 rect_to_paint.Intersect(window_->bounds());
938 946
939 window_->SchedulePaintInRect(rect_to_paint); 947 window_->SchedulePaintInRect(rect_to_paint);
948 }
940 949
941 // Add sending an ACK to the list of things to do OnCompositingDidCommit 950 SwapBuffersCompleted(ack_params);
942 can_lock_compositor_ = NO_PENDING_COMMIT;
943 on_compositing_did_commit_callbacks_.push_back(
944 base::Bind(&RenderWidgetHostViewAura::InsertSyncPointAndACK,
945 params_in_pixel.route_id,
946 gpu_host_id,
947 true));
948 if (!compositor->HasObserver(this))
949 compositor->AddObserver(this);
950 }
951 } 951 }
952 952
953 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { 953 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
954 } 954 }
955 955
956 bool RenderWidgetHostViewAura::HasAcceleratedSurface( 956 bool RenderWidgetHostViewAura::HasAcceleratedSurface(
957 const gfx::Size& desired_size) { 957 const gfx::Size& desired_size) {
958 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't 958 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't
959 // matter what is returned here as GetBackingStore is the only caller of this 959 // matter what is returned here as GetBackingStore is the only caller of this
960 // method. TODO(jbates) implement this if other Aura code needs it. 960 // method. TODO(jbates) implement this if other Aura code needs it.
961 return false; 961 return false;
962 } 962 }
963 963
964 // TODO(backer): Drop the |shm_handle| once I remove some unused service side 964 // TODO(backer): Drop the |shm_handle| once I remove some unused service side
965 // code. 965 // code.
966 void RenderWidgetHostViewAura::AcceleratedSurfaceNew( 966 void RenderWidgetHostViewAura::AcceleratedSurfaceNew(
967 int32 width_in_pixel, 967 int32 width_in_pixel,
968 int32 height_in_pixel, 968 int32 height_in_pixel,
969 uint64 surface_handle) { 969 uint64 surface_handle,
970 const std::string& mailbox_name) {
970 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 971 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
971 scoped_refptr<ui::Texture> surface(factory->CreateTransportClient( 972 scoped_refptr<ui::Texture> surface(factory->CreateTransportClient(
972 gfx::Size(width_in_pixel, height_in_pixel), device_scale_factor_, 973 gfx::Size(width_in_pixel, height_in_pixel), device_scale_factor_,
973 surface_handle)); 974 mailbox_name));
974 if (!surface) { 975 if (!surface) {
975 LOG(ERROR) << "Failed to create ImageTransport texture"; 976 LOG(ERROR) << "Failed to create ImageTransport texture";
976 return; 977 return;
977 } 978 }
978
979 image_transport_clients_[surface_handle] = surface; 979 image_transport_clients_[surface_handle] = surface;
980 } 980 }
981 981
982 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease( 982 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease(
983 uint64 surface_handle) { 983 uint64 surface_handle) {
984 DCHECK(image_transport_clients_.find(surface_handle) != 984 // This really tells us to release the frontbuffer.
985 image_transport_clients_.end()); 985 if (current_surface_ && ShouldReleaseFrontSurface()) {
986 if (current_surface_ == surface_handle) { 986 ui::Compositor* compositor = GetCompositor();
987 if (compositor) {
988 // We need to wait for a commit to clear to guarantee that all we
989 // will not issue any more GL referencing the previous surface.
990 can_lock_compositor_ = NO_PENDING_COMMIT;
991 scoped_refptr<ui::Texture> surface_ref =
992 image_transport_clients_[current_surface_];
993 on_compositing_did_commit_callbacks_.push_back(
994 base::Bind(&RenderWidgetHostViewAura::
995 SetSurfaceNotInUseByCompositor,
996 AsWeakPtr(),
997 surface_ref));
998 if (!compositor->HasObserver(this))
999 compositor->AddObserver(this);
1000 }
1001 image_transport_clients_.erase(current_surface_);
987 current_surface_ = 0; 1002 current_surface_ = 0;
988 UpdateExternalTexture(); 1003 UpdateExternalTexture();
989 } 1004 }
990 image_transport_clients_.erase(surface_handle);
991 } 1005 }
992 1006
993 void RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor(ui::Compositor*) { 1007 void RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor(
994 if (current_surface_ || !host_->is_hidden()) 1008 scoped_refptr<ui::Texture>) {
995 return;
996 current_surface_in_use_by_compositor_ = false;
997 AdjustSurfaceProtection();
998 }
999
1000 void RenderWidgetHostViewAura::AdjustSurfaceProtection() {
1001 // If the current surface is non null, it is protected.
1002 // If we are visible, it is protected.
1003 // Otherwise, change to not proctected once done thumbnailing and compositing.
1004 bool surface_is_protected =
1005 current_surface_ ||
1006 !host_->is_hidden() ||
1007 (current_surface_is_protected_ &&
1008 (pending_thumbnail_tasks_ > 0 ||
1009 current_surface_in_use_by_compositor_));
1010 if (current_surface_is_protected_ == surface_is_protected)
1011 return;
1012 current_surface_is_protected_ = surface_is_protected;
1013 ++protection_state_id_;
1014
1015 if (!surface_route_id_ || !shared_surface_handle_.parent_gpu_process_id)
1016 return;
1017
1018 RenderWidgetHostImpl::SendFrontSurfaceIsProtected(
1019 surface_is_protected,
1020 protection_state_id_,
1021 surface_route_id_,
1022 shared_surface_handle_.parent_gpu_process_id);
1023 } 1009 }
1024 1010
1025 void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished( 1011 void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinished(
1026 base::WeakPtr<RenderWidgetHostViewAura> render_widget_host_view, 1012 base::WeakPtr<RenderWidgetHostViewAura> render_widget_host_view,
1027 const base::Callback<void(bool)>& callback, 1013 const base::Callback<void(bool)>& callback,
1028 bool result) { 1014 bool result) {
1029 callback.Run(result); 1015 callback.Run(result);
1030 1016
1031 if (!render_widget_host_view.get()) 1017 if (!render_widget_host_view.get())
1032 return; 1018 return;
1033 --render_widget_host_view->pending_thumbnail_tasks_; 1019 --render_widget_host_view->pending_thumbnail_tasks_;
1034 render_widget_host_view->AdjustSurfaceProtection();
1035 } 1020 }
1036 1021
1037 void RenderWidgetHostViewAura::SetBackground(const SkBitmap& background) { 1022 void RenderWidgetHostViewAura::SetBackground(const SkBitmap& background) {
1038 RenderWidgetHostViewBase::SetBackground(background); 1023 RenderWidgetHostViewBase::SetBackground(background);
1039 host_->SetBackground(background); 1024 host_->SetBackground(background);
1040 window_->layer()->SetFillsBoundsOpaquely(background.isOpaque()); 1025 window_->layer()->SetFillsBoundsOpaquely(background.isOpaque());
1041 } 1026 }
1042 1027
1043 void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) { 1028 void RenderWidgetHostViewAura::GetScreenInfo(WebScreenInfo* results) {
1044 GetScreenInfoForWindow(results, window_); 1029 GetScreenInfoForWindow(results, window_);
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
1750 1735
1751 void RenderWidgetHostViewAura::OnCompositingDidCommit( 1736 void RenderWidgetHostViewAura::OnCompositingDidCommit(
1752 ui::Compositor* compositor) { 1737 ui::Compositor* compositor) {
1753 if (can_lock_compositor_ == NO_PENDING_COMMIT) { 1738 if (can_lock_compositor_ == NO_PENDING_COMMIT) {
1754 can_lock_compositor_ = YES; 1739 can_lock_compositor_ = YES;
1755 for (ResizeLockList::iterator it = resize_locks_.begin(); 1740 for (ResizeLockList::iterator it = resize_locks_.begin();
1756 it != resize_locks_.end(); ++it) 1741 it != resize_locks_.end(); ++it)
1757 if ((*it)->GrabDeferredLock()) 1742 if ((*it)->GrabDeferredLock())
1758 can_lock_compositor_ = YES_DID_LOCK; 1743 can_lock_compositor_ = YES_DID_LOCK;
1759 } 1744 }
1760 RunCompositingDidCommitCallbacks(compositor); 1745 RunCompositingDidCommitCallbacks();
1761 locks_pending_commit_.clear(); 1746 locks_pending_commit_.clear();
1762 } 1747 }
1763 1748
1764 void RenderWidgetHostViewAura::OnCompositingStarted( 1749 void RenderWidgetHostViewAura::OnCompositingStarted(
1765 ui::Compositor* compositor) { 1750 ui::Compositor* compositor) {
1766 } 1751 }
1767 1752
1768 void RenderWidgetHostViewAura::OnCompositingEnded( 1753 void RenderWidgetHostViewAura::OnCompositingEnded(
1769 ui::Compositor* compositor) { 1754 ui::Compositor* compositor) {
1770 } 1755 }
(...skipping 10 matching lines...) Expand all
1781 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME; 1766 can_lock_compositor_ = NO_PENDING_RENDERER_FRAME;
1782 } 1767 }
1783 } 1768 }
1784 1769
1785 //////////////////////////////////////////////////////////////////////////////// 1770 ////////////////////////////////////////////////////////////////////////////////
1786 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: 1771 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation:
1787 1772
1788 void RenderWidgetHostViewAura::OnLostResources() { 1773 void RenderWidgetHostViewAura::OnLostResources() {
1789 image_transport_clients_.clear(); 1774 image_transport_clients_.clear();
1790 current_surface_ = 0; 1775 current_surface_ = 0;
1791 protection_state_id_ = 0;
1792 current_surface_is_protected_ = true;
1793 current_surface_in_use_by_compositor_ = true;
1794 surface_route_id_ = 0;
1795 UpdateExternalTexture(); 1776 UpdateExternalTexture();
1796 locks_pending_commit_.clear(); 1777 locks_pending_commit_.clear();
1797 1778
1798 DCHECK(!shared_surface_handle_.is_null()); 1779 DCHECK(!shared_surface_handle_.is_null());
1799 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 1780 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
1800 factory->DestroySharedSurfaceHandle(shared_surface_handle_); 1781 factory->DestroySharedSurfaceHandle(shared_surface_handle_);
1801 shared_surface_handle_ = factory->CreateSharedSurfaceHandle(); 1782 shared_surface_handle_ = factory->CreateSharedSurfaceHandle();
1802 host_->CompositingSurfaceUpdated(); 1783 host_->CompositingSurfaceUpdated();
1803 host_->ScheduleComposite(); 1784 host_->ScheduleComposite();
1804 } 1785 }
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 gfx::Rect rect = window_->bounds(); 1907 gfx::Rect rect = window_->bounds();
1927 int border_x = rect.width() * kMouseLockBorderPercentage / 100; 1908 int border_x = rect.width() * kMouseLockBorderPercentage / 100;
1928 int border_y = rect.height() * kMouseLockBorderPercentage / 100; 1909 int border_y = rect.height() * kMouseLockBorderPercentage / 100;
1929 1910
1930 return global_mouse_position_.x() < rect.x() + border_x || 1911 return global_mouse_position_.x() < rect.x() + border_x ||
1931 global_mouse_position_.x() > rect.right() - border_x || 1912 global_mouse_position_.x() > rect.right() - border_x ||
1932 global_mouse_position_.y() < rect.y() + border_y || 1913 global_mouse_position_.y() < rect.y() + border_y ||
1933 global_mouse_position_.y() > rect.bottom() - border_y; 1914 global_mouse_position_.y() > rect.bottom() - border_y;
1934 } 1915 }
1935 1916
1936 void RenderWidgetHostViewAura::RunCompositingDidCommitCallbacks( 1917 void RenderWidgetHostViewAura::RunCompositingDidCommitCallbacks() {
1937 ui::Compositor* compositor) { 1918 for (std::vector<base::Closure>::const_iterator
1938 for (std::vector< base::Callback<void(ui::Compositor*)> >::const_iterator
1939 it = on_compositing_did_commit_callbacks_.begin(); 1919 it = on_compositing_did_commit_callbacks_.begin();
1940 it != on_compositing_did_commit_callbacks_.end(); ++it) { 1920 it != on_compositing_did_commit_callbacks_.end(); ++it) {
1941 it->Run(compositor); 1921 it->Run();
1942 } 1922 }
1943 on_compositing_did_commit_callbacks_.clear(); 1923 on_compositing_did_commit_callbacks_.clear();
1944 } 1924 }
1945 1925
1946 // static 1926 // static
1947 void RenderWidgetHostViewAura::InsertSyncPointAndACK( 1927 void RenderWidgetHostViewAura::InsertSyncPointAndACK(
1948 int32 route_id, int gpu_host_id, bool presented, 1928 const BufferPresentedParams& params) {
1949 ui::Compositor* compositor) {
1950 uint32 sync_point = 0; 1929 uint32 sync_point = 0;
1951 // If we have no compositor, so we must still send the ACK. A zero 1930 // If we produced a texture, we have to synchronize with the consumer of
1952 // sync point will not be waited for in the GPU process. 1931 // that texture.
1953 if (compositor) { 1932 if (params.texture_to_produce) {
1954 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 1933 params.texture_to_produce->Produce();
1955 sync_point = factory->InsertSyncPoint(); 1934 sync_point = ImageTransportFactory::GetInstance()->InsertSyncPoint();
1956 } 1935 }
1957 1936
1958 RenderWidgetHostImpl::AcknowledgeBufferPresent( 1937 RenderWidgetHostImpl::AcknowledgeBufferPresent(
1959 route_id, gpu_host_id, presented, sync_point); 1938 params.route_id, params.gpu_host_id, params.surface_handle, sync_point);
1960 } 1939 }
1961 1940
1962 void RenderWidgetHostViewAura::AddingToRootWindow() { 1941 void RenderWidgetHostViewAura::AddingToRootWindow() {
1963 host_->ParentChanged(GetNativeViewId()); 1942 host_->ParentChanged(GetNativeViewId());
1964 UpdateScreenInfo(window_); 1943 UpdateScreenInfo(window_);
1965 } 1944 }
1966 1945
1967 void RenderWidgetHostViewAura::RemovingFromRootWindow() { 1946 void RenderWidgetHostViewAura::RemovingFromRootWindow() {
1968 host_->ParentChanged(0); 1947 host_->ParentChanged(0);
1969 // We are about to disconnect ourselves from the compositor, we need to issue 1948 // We are about to disconnect ourselves from the compositor, we need to issue
1970 // the callbacks now, because we won't get notified when the frame is done. 1949 // the callbacks now, because we won't get notified when the frame is done.
1971 // TODO(piman): this might in theory cause a race where the GPU process starts 1950 // TODO(piman): this might in theory cause a race where the GPU process starts
1972 // drawing to the buffer we haven't yet displayed. This will only show for 1 1951 // drawing to the buffer we haven't yet displayed. This will only show for 1
1973 // frame though, because we will reissue a new frame right away without that 1952 // frame though, because we will reissue a new frame right away without that
1974 // composited data. 1953 // composited data.
1975 ui::Compositor* compositor = GetCompositor(); 1954 ui::Compositor* compositor = GetCompositor();
1976 RunCompositingDidCommitCallbacks(compositor); 1955 RunCompositingDidCommitCallbacks();
1977 locks_pending_commit_.clear(); 1956 locks_pending_commit_.clear();
1978 if (compositor && compositor->HasObserver(this)) 1957 if (compositor && compositor->HasObserver(this))
1979 compositor->RemoveObserver(this); 1958 compositor->RemoveObserver(this);
1980 DetachFromInputMethod(); 1959 DetachFromInputMethod();
1981 } 1960 }
1982 1961
1983 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() { 1962 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() {
1984 aura::RootWindow* root_window = window_->GetRootWindow(); 1963 aura::RootWindow* root_window = window_->GetRootWindow();
1985 return root_window ? root_window->compositor() : NULL; 1964 return root_window ? root_window->compositor() : NULL;
1986 } 1965 }
(...skipping 12 matching lines...) Expand all
1999 RenderWidgetHost* widget) { 1978 RenderWidgetHost* widget) {
2000 return new RenderWidgetHostViewAura(widget); 1979 return new RenderWidgetHostViewAura(widget);
2001 } 1980 }
2002 1981
2003 // static 1982 // static
2004 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { 1983 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
2005 GetScreenInfoForWindow(results, NULL); 1984 GetScreenInfoForWindow(results, NULL);
2006 } 1985 }
2007 1986
2008 } // namespace content 1987 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698