| 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/gpu/gpu_process_host.h" | 5 #include "content/browser/gpu/gpu_process_host.h" |
| 6 | 6 |
| 7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 GpuProcessHost* host = GpuProcessHost::Get(kind, cause); | 78 GpuProcessHost* host = GpuProcessHost::Get(kind, cause); |
| 79 if (host) { | 79 if (host) { |
| 80 host->Send(message); | 80 host->Send(message); |
| 81 } else { | 81 } else { |
| 82 delete message; | 82 delete message; |
| 83 } | 83 } |
| 84 } | 84 } |
| 85 | 85 |
| 86 void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, | 86 void AcceleratedSurfaceBuffersSwappedCompletedForGPU(int host_id, |
| 87 int route_id, | 87 int route_id, |
| 88 uint64 surface_handle, | 88 bool alive, |
| 89 bool alive) { | 89 uint64 surface_handle) { |
| 90 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 90 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
| 91 BrowserThread::PostTask( | 91 BrowserThread::PostTask( |
| 92 BrowserThread::IO, | 92 BrowserThread::IO, |
| 93 FROM_HERE, | 93 FROM_HERE, |
| 94 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, | 94 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, |
| 95 host_id, | 95 host_id, |
| 96 route_id, | 96 route_id, |
| 97 surface_handle, | 97 alive, |
| 98 alive)); | 98 surface_handle)); |
| 99 return; | 99 return; |
| 100 } | 100 } |
| 101 | 101 |
| 102 GpuProcessHost* host = GpuProcessHost::FromID(host_id); | 102 GpuProcessHost* host = GpuProcessHost::FromID(host_id); |
| 103 if (host) { | 103 if (host) { |
| 104 if (alive) { | 104 if (alive) { |
| 105 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; | 105 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; |
| 106 ack_params.sync_point = 0; | 106 ack_params.sync_point = 0; |
| 107 host->Send( | 107 host->Send( |
| 108 new AcceleratedSurfaceMsg_BufferPresented(route_id, ack_params)); | 108 new AcceleratedSurfaceMsg_BufferPresented(route_id, ack_params)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 137 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); | 137 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); |
| 138 if (!host) | 138 if (!host) |
| 139 return; | 139 return; |
| 140 RenderWidgetHost* rwh = host->GetRenderWidgetHostByID(render_widget_id); | 140 RenderWidgetHost* rwh = host->GetRenderWidgetHostByID(render_widget_id); |
| 141 if (!rwh) | 141 if (!rwh) |
| 142 return; | 142 return; |
| 143 RenderWidgetHostImpl::From(rwh)->AcknowledgeSwapBuffersToRenderer(); | 143 RenderWidgetHostImpl::From(rwh)->AcknowledgeSwapBuffersToRenderer(); |
| 144 if (interval != base::TimeDelta()) | 144 if (interval != base::TimeDelta()) |
| 145 RenderWidgetHostImpl::From(rwh)->UpdateVSyncParameters(timebase, interval); | 145 RenderWidgetHostImpl::From(rwh)->UpdateVSyncParameters(timebase, interval); |
| 146 } | 146 } |
| 147 |
| 148 void AcceleratedSurfaceBuffersSwappedCompleted(int host_id, |
| 149 int route_id, |
| 150 int surface_id, |
| 151 uint64 surface_handle, |
| 152 bool alive, |
| 153 base::TimeTicks timebase, |
| 154 base::TimeDelta interval) { |
| 155 AcceleratedSurfaceBuffersSwappedCompletedForGPU(host_id, route_id, |
| 156 alive, surface_handle); |
| 157 AcceleratedSurfaceBuffersSwappedCompletedForRenderer(surface_id, timebase, |
| 158 interval); |
| 159 } |
| 147 #endif // defined(OS_WIN) | 160 #endif // defined(OS_WIN) |
| 148 | 161 |
| 149 } // anonymous namespace | 162 } // anonymous namespace |
| 150 | 163 |
| 151 #if defined(TOOLKIT_GTK) | 164 #if defined(TOOLKIT_GTK) |
| 152 // Used to put a lock on surfaces so that the window to which the GPU | 165 // Used to put a lock on surfaces so that the window to which the GPU |
| 153 // process is drawing to doesn't disappear while it is drawing when | 166 // process is drawing to doesn't disappear while it is drawing when |
| 154 // a WebContents is closed. | 167 // a WebContents is closed. |
| 155 class GpuProcessHost::SurfaceRef { | 168 class GpuProcessHost::SurfaceRef { |
| 156 public: | 169 public: |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 // TODO(jbates) http://crbug.com/105344 This will be removed when there are no | 771 // TODO(jbates) http://crbug.com/105344 This will be removed when there are no |
| 759 // plugin windows. | 772 // plugin windows. |
| 760 if (handle != gfx::kNullPluginWindow) { | 773 if (handle != gfx::kNullPluginWindow) { |
| 761 RouteOnUIThread(GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); | 774 RouteOnUIThread(GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
| 762 return; | 775 return; |
| 763 } | 776 } |
| 764 | 777 |
| 765 base::ScopedClosureRunner scoped_completion_runner( | 778 base::ScopedClosureRunner scoped_completion_runner( |
| 766 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, | 779 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, |
| 767 host_id_, params.route_id, | 780 host_id_, params.route_id, |
| 768 params.surface_handle, true /* alive */)); | 781 true /* alive */, params.surface_handle)); |
| 769 | 782 |
| 770 int render_process_id = 0; | 783 int render_process_id = 0; |
| 771 int render_widget_id = 0; | 784 int render_widget_id = 0; |
| 772 if (!GpuSurfaceTracker::Get()->GetRenderWidgetIDForSurface( | 785 if (!GpuSurfaceTracker::Get()->GetRenderWidgetIDForSurface( |
| 773 params.surface_id, &render_process_id, &render_widget_id)) { | 786 params.surface_id, &render_process_id, &render_widget_id)) { |
| 774 return; | 787 return; |
| 775 } | 788 } |
| 776 RenderWidgetHelper* helper = | 789 RenderWidgetHelper* helper = |
| 777 RenderWidgetHelper::FromProcessHostID(render_process_id); | 790 RenderWidgetHelper::FromProcessHostID(render_process_id); |
| 778 if (!helper) | 791 if (!helper) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 791 params.size, | 804 params.size, |
| 792 host_id_)); | 805 host_id_)); |
| 793 } | 806 } |
| 794 #endif // OS_MACOSX | 807 #endif // OS_MACOSX |
| 795 | 808 |
| 796 #if defined(OS_WIN) | 809 #if defined(OS_WIN) |
| 797 void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( | 810 void GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped( |
| 798 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { | 811 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) { |
| 799 TRACE_EVENT0("gpu", "GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped"); | 812 TRACE_EVENT0("gpu", "GpuProcessHost::OnAcceleratedSurfaceBuffersSwapped"); |
| 800 | 813 |
| 801 base::ScopedClosureRunner scoped_present_completion_runner( | 814 base::ScopedClosureRunner scoped_completion_runner( |
| 802 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForRenderer, | 815 base::Bind(&AcceleratedSurfaceBuffersSwappedCompleted, |
| 803 params.surface_id, | 816 host_id_, params.route_id, params.surface_id, params.surface_handle, |
| 804 base::TimeTicks(), | 817 true, base::TimeTicks(), base::TimeDelta())); |
| 805 base::TimeDelta())); | |
| 806 base::ScopedClosureRunner scoped_copy_completion_runner( | |
| 807 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, | |
| 808 host_id_, | |
| 809 params.route_id, | |
| 810 params.surface_handle, | |
| 811 true)); | |
| 812 | 818 |
| 813 gfx::PluginWindowHandle handle = | 819 gfx::PluginWindowHandle handle = |
| 814 GpuSurfaceTracker::Get()->GetSurfaceWindowHandle(params.surface_id); | 820 GpuSurfaceTracker::Get()->GetSurfaceWindowHandle(params.surface_id); |
| 815 | 821 |
| 816 if (!handle) { | 822 if (!handle) { |
| 817 TRACE_EVENT1("gpu", "SurfaceIDNotFound_RoutingToUI", | 823 TRACE_EVENT1("gpu", "SurfaceIDNotFound_RoutingToUI", |
| 818 "surface_id", params.surface_id); | 824 "surface_id", params.surface_id); |
| 819 #if defined(USE_AURA) | 825 #if defined(USE_AURA) |
| 820 // This is a content area swap, send it on to the UI thread. | 826 // This is a content area swap, send it on to the UI thread. |
| 821 scoped_copy_completion_runner.Release(); | 827 scoped_completion_runner.Release(); |
| 822 scoped_present_completion_runner.Release(); | |
| 823 RouteOnUIThread(GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); | 828 RouteOnUIThread(GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
| 824 #endif | 829 #endif |
| 825 return; | 830 return; |
| 826 } | 831 } |
| 827 | 832 |
| 828 // Otherwise it's the UI swap. | 833 // Otherwise it's the UI swap. |
| 829 | 834 |
| 830 scoped_refptr<AcceleratedPresenter> presenter( | 835 scoped_refptr<AcceleratedPresenter> presenter( |
| 831 AcceleratedPresenter::GetForWindow(handle)); | 836 AcceleratedPresenter::GetForWindow(handle)); |
| 832 if (!presenter) { | 837 if (!presenter) { |
| 833 TRACE_EVENT1("gpu", "EarlyOut_NativeWindowNotFound", "handle", handle); | 838 TRACE_EVENT1("gpu", "EarlyOut_NativeWindowNotFound", "handle", handle); |
| 834 return; | 839 return; |
| 835 } | 840 } |
| 836 | 841 |
| 837 scoped_copy_completion_runner.Release(); | 842 scoped_completion_runner.Release(); |
| 838 scoped_present_completion_runner.Release(); | |
| 839 presenter->AsyncPresentAndAcknowledge( | 843 presenter->AsyncPresentAndAcknowledge( |
| 840 params.size, | 844 params.size, |
| 841 params.surface_handle, | 845 params.surface_handle, |
| 842 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForGPU, | 846 base::Bind(&AcceleratedSurfaceBuffersSwappedCompleted, |
| 843 host_id_, | 847 host_id_, |
| 844 params.route_id, | 848 params.route_id, |
| 845 params.surface_handle), | 849 params.surface_id, |
| 846 base::Bind(&AcceleratedSurfaceBuffersSwappedCompletedForRenderer, | 850 params.surface_handle)); |
| 847 params.surface_id)); | |
| 848 } | 851 } |
| 849 | 852 |
| 850 void GpuProcessHost::OnAcceleratedSurfacePostSubBuffer( | 853 void GpuProcessHost::OnAcceleratedSurfacePostSubBuffer( |
| 851 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params) { | 854 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params) { |
| 852 TRACE_EVENT0("gpu", "GpuProcessHost::OnAcceleratedSurfacePostSubBuffer"); | 855 TRACE_EVENT0("gpu", "GpuProcessHost::OnAcceleratedSurfacePostSubBuffer"); |
| 853 | 856 |
| 854 NOTIMPLEMENTED(); | 857 NOTIMPLEMENTED(); |
| 855 } | 858 } |
| 856 | 859 |
| 857 void GpuProcessHost::OnAcceleratedSurfaceSuspend(int32 surface_id) { | 860 void GpuProcessHost::OnAcceleratedSurfaceSuspend(int32 surface_id) { |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 void GpuProcessHost::BlockLiveOffscreenContexts() { | 1046 void GpuProcessHost::BlockLiveOffscreenContexts() { |
| 1044 for (std::multiset<GURL>::iterator iter = | 1047 for (std::multiset<GURL>::iterator iter = |
| 1045 urls_with_live_offscreen_contexts_.begin(); | 1048 urls_with_live_offscreen_contexts_.begin(); |
| 1046 iter != urls_with_live_offscreen_contexts_.end(); ++iter) { | 1049 iter != urls_with_live_offscreen_contexts_.end(); ++iter) { |
| 1047 GpuDataManagerImpl::GetInstance()->BlockDomainFrom3DAPIs( | 1050 GpuDataManagerImpl::GetInstance()->BlockDomainFrom3DAPIs( |
| 1048 *iter, GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN); | 1051 *iter, GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN); |
| 1049 } | 1052 } |
| 1050 } | 1053 } |
| 1051 | 1054 |
| 1052 } // namespace content | 1055 } // namespace content |
| OLD | NEW |