| 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/browser_gpu_channel_host_factory.h" | 5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/profiler/scoped_tracker.h" |
| 10 #include "base/synchronization/waitable_event.h" | 11 #include "base/synchronization/waitable_event.h" |
| 11 #include "base/threading/thread_restrictions.h" | 12 #include "base/threading/thread_restrictions.h" |
| 12 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 13 #include "base/tracked_objects.h" | |
| 14 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 14 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
| 15 #include "content/browser/gpu/gpu_data_manager_impl.h" | 15 #include "content/browser/gpu/gpu_data_manager_impl.h" |
| 16 #include "content/browser/gpu/gpu_process_host.h" | 16 #include "content/browser/gpu/gpu_process_host.h" |
| 17 #include "content/browser/gpu/gpu_surface_tracker.h" | 17 #include "content/browser/gpu/gpu_surface_tracker.h" |
| 18 #include "content/common/child_process_host_impl.h" | 18 #include "content/common/child_process_host_impl.h" |
| 19 #include "content/common/gpu/gpu_memory_buffer_factory.h" | 19 #include "content/common/gpu/gpu_memory_buffer_factory.h" |
| 20 #include "content/common/gpu/gpu_messages.h" | 20 #include "content/common/gpu/gpu_messages.h" |
| 21 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
| 22 #include "content/public/browser/gpu_data_manager.h" | 22 #include "content/public/browser/gpu_data_manager.h" |
| 23 #include "content/public/common/content_client.h" | 23 #include "content/public/common/content_client.h" |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 BrowserGpuChannelHostFactory* factory = | 187 BrowserGpuChannelHostFactory* factory = |
| 188 BrowserGpuChannelHostFactory::instance(); | 188 BrowserGpuChannelHostFactory::instance(); |
| 189 factory->GpuChannelEstablished(); | 189 factory->GpuChannelEstablished(); |
| 190 finished_ = true; | 190 finished_ = true; |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 | 193 |
| 194 void BrowserGpuChannelHostFactory::EstablishRequest::Wait() { | 194 void BrowserGpuChannelHostFactory::EstablishRequest::Wait() { |
| 195 DCHECK(main_loop_->BelongsToCurrentThread()); | 195 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 196 { | 196 { |
| 197 // Since the current task synchronously waits for establishing a GPU | 197 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is fixed. |
| 198 // channel, it shouldn't be tallied because its execution time has nothing | 198 tracked_objects::ScopedTracker tracking_profile( |
| 199 // to do with its efficiency. Using task stopwatch to exclude the waiting | 199 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 200 // time from the current task run time. | 200 "125248 BrowserGpuChannelHostFactory::EstablishRequest::Wait")); |
| 201 tracked_objects::TaskStopwatch stopwatch; | |
| 202 stopwatch.Start(); | |
| 203 | 201 |
| 204 // We're blocking the UI thread, which is generally undesirable. | 202 // We're blocking the UI thread, which is generally undesirable. |
| 205 // In this case we need to wait for this before we can show any UI | 203 // In this case we need to wait for this before we can show any UI |
| 206 // /anyway/, so it won't cause additional jank. | 204 // /anyway/, so it won't cause additional jank. |
| 207 // TODO(piman): Make this asynchronous (http://crbug.com/125248). | 205 // TODO(piman): Make this asynchronous (http://crbug.com/125248). |
| 208 TRACE_EVENT0("browser", | 206 TRACE_EVENT0("browser", |
| 209 "BrowserGpuChannelHostFactory::EstablishGpuChannelSync"); | 207 "BrowserGpuChannelHostFactory::EstablishGpuChannelSync"); |
| 210 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 208 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 211 event_.Wait(); | 209 event_.Wait(); |
| 212 | |
| 213 stopwatch.Stop(); | |
| 214 } | 210 } |
| 215 FinishOnMain(); | 211 FinishOnMain(); |
| 216 } | 212 } |
| 217 | 213 |
| 218 void BrowserGpuChannelHostFactory::EstablishRequest::Cancel() { | 214 void BrowserGpuChannelHostFactory::EstablishRequest::Cancel() { |
| 219 DCHECK(main_loop_->BelongsToCurrentThread()); | 215 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 220 finished_ = true; | 216 finished_ = true; |
| 221 } | 217 } |
| 222 | 218 |
| 223 bool BrowserGpuChannelHostFactory::CanUseForTesting() { | 219 bool BrowserGpuChannelHostFactory::CanUseForTesting() { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 int32 surface_id, | 320 int32 surface_id, |
| 325 const GPUCreateCommandBufferConfig& init_params, | 321 const GPUCreateCommandBufferConfig& init_params, |
| 326 int32 route_id) { | 322 int32 route_id) { |
| 327 CreateRequest request(route_id); | 323 CreateRequest request(route_id); |
| 328 GetIOLoopProxy()->PostTask(FROM_HERE, base::Bind( | 324 GetIOLoopProxy()->PostTask(FROM_HERE, base::Bind( |
| 329 &BrowserGpuChannelHostFactory::CreateViewCommandBufferOnIO, | 325 &BrowserGpuChannelHostFactory::CreateViewCommandBufferOnIO, |
| 330 base::Unretained(this), | 326 base::Unretained(this), |
| 331 &request, | 327 &request, |
| 332 surface_id, | 328 surface_id, |
| 333 init_params)); | 329 init_params)); |
| 330 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is fixed. |
| 331 tracked_objects::ScopedTracker tracking_profile( |
| 332 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 333 "125248 BrowserGpuChannelHostFactory::CreateViewCommandBuffer")); |
| 334 |
| 334 // We're blocking the UI thread, which is generally undesirable. | 335 // We're blocking the UI thread, which is generally undesirable. |
| 335 // In this case we need to wait for this before we can show any UI /anyway/, | 336 // In this case we need to wait for this before we can show any UI /anyway/, |
| 336 // so it won't cause additional jank. | 337 // so it won't cause additional jank. |
| 337 // TODO(piman): Make this asynchronous (http://crbug.com/125248). | 338 // TODO(piman): Make this asynchronous (http://crbug.com/125248). |
| 338 TRACE_EVENT0("browser", | 339 TRACE_EVENT0("browser", |
| 339 "BrowserGpuChannelHostFactory::CreateViewCommandBuffer"); | 340 "BrowserGpuChannelHostFactory::CreateViewCommandBuffer"); |
| 340 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 341 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 341 request.event.Wait(); | 342 request.event.Wait(); |
| 342 return request.result; | 343 return request.result; |
| 343 } | 344 } |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 539 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 539 | 540 |
| 540 CreateGpuMemoryBufferCallbackMap::iterator iter = | 541 CreateGpuMemoryBufferCallbackMap::iterator iter = |
| 541 create_gpu_memory_buffer_requests_.find(request_id); | 542 create_gpu_memory_buffer_requests_.find(request_id); |
| 542 DCHECK(iter != create_gpu_memory_buffer_requests_.end()); | 543 DCHECK(iter != create_gpu_memory_buffer_requests_.end()); |
| 543 iter->second.Run(handle); | 544 iter->second.Run(handle); |
| 544 create_gpu_memory_buffer_requests_.erase(iter); | 545 create_gpu_memory_buffer_requests_.erase(iter); |
| 545 } | 546 } |
| 546 | 547 |
| 547 } // namespace content | 548 } // namespace content |
| OLD | NEW |