| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_memory_buffer_manager.h" | 5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 ~CreateGpuMemoryBufferRequest() {} | 71 ~CreateGpuMemoryBufferRequest() {} |
| 72 base::WaitableEvent event; | 72 base::WaitableEvent event; |
| 73 gfx::Size size; | 73 gfx::Size size; |
| 74 gfx::BufferFormat format; | 74 gfx::BufferFormat format; |
| 75 gfx::BufferUsage usage; | 75 gfx::BufferUsage usage; |
| 76 int client_id; | 76 int client_id; |
| 77 gpu::SurfaceHandle surface_handle; | 77 gpu::SurfaceHandle surface_handle; |
| 78 std::unique_ptr<gfx::GpuMemoryBuffer> result; | 78 std::unique_ptr<gfx::GpuMemoryBuffer> result; |
| 79 }; | 79 }; |
| 80 | 80 |
| 81 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandleRequest | |
| 82 : public CreateGpuMemoryBufferRequest { | |
| 83 CreateGpuMemoryBufferFromHandleRequest( | |
| 84 const gfx::GpuMemoryBufferHandle& handle, | |
| 85 const gfx::Size& size, | |
| 86 gfx::BufferFormat format, | |
| 87 int client_id) | |
| 88 : CreateGpuMemoryBufferRequest(size, | |
| 89 format, | |
| 90 gfx::BufferUsage::GPU_READ, | |
| 91 client_id, | |
| 92 gpu::kNullSurfaceHandle), | |
| 93 handle(handle) {} | |
| 94 ~CreateGpuMemoryBufferFromHandleRequest() {} | |
| 95 gfx::GpuMemoryBufferHandle handle; | |
| 96 }; | |
| 97 | |
| 98 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( | 81 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( |
| 99 int gpu_client_id, | 82 int gpu_client_id, |
| 100 uint64_t gpu_client_tracing_id) | 83 uint64_t gpu_client_tracing_id) |
| 101 : native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()), | 84 : native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()), |
| 102 gpu_client_id_(gpu_client_id), | 85 gpu_client_id_(gpu_client_id), |
| 103 gpu_client_tracing_id_(gpu_client_tracing_id), | 86 gpu_client_tracing_id_(gpu_client_tracing_id), |
| 104 gpu_host_id_(0) { | 87 gpu_host_id_(0) { |
| 105 DCHECK(!g_gpu_memory_buffer_manager); | 88 DCHECK(!g_gpu_memory_buffer_manager); |
| 106 g_gpu_memory_buffer_manager = this; | 89 g_gpu_memory_buffer_manager = this; |
| 107 } | 90 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 130 |
| 148 std::unique_ptr<gfx::GpuMemoryBuffer> | 131 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 149 BrowserGpuMemoryBufferManager::CreateGpuMemoryBuffer( | 132 BrowserGpuMemoryBufferManager::CreateGpuMemoryBuffer( |
| 150 const gfx::Size& size, | 133 const gfx::Size& size, |
| 151 gfx::BufferFormat format, | 134 gfx::BufferFormat format, |
| 152 gfx::BufferUsage usage, | 135 gfx::BufferUsage usage, |
| 153 gpu::SurfaceHandle surface_handle) { | 136 gpu::SurfaceHandle surface_handle) { |
| 154 return AllocateGpuMemoryBufferForSurface(size, format, usage, surface_handle); | 137 return AllocateGpuMemoryBufferForSurface(size, format, usage, surface_handle); |
| 155 } | 138 } |
| 156 | 139 |
| 157 std::unique_ptr<gfx::GpuMemoryBuffer> | |
| 158 BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( | |
| 159 const gfx::GpuMemoryBufferHandle& handle, | |
| 160 const gfx::Size& size, | |
| 161 gfx::BufferFormat format) { | |
| 162 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 163 | |
| 164 CreateGpuMemoryBufferFromHandleRequest request(handle, size, format, | |
| 165 gpu_client_id_); | |
| 166 BrowserThread::PostTask( | |
| 167 BrowserThread::IO, FROM_HERE, | |
| 168 base::Bind(&BrowserGpuMemoryBufferManager:: | |
| 169 HandleCreateGpuMemoryBufferFromHandleOnIO, | |
| 170 base::Unretained(this), // Safe as we wait for result below. | |
| 171 base::Unretained(&request))); | |
| 172 | |
| 173 // We're blocking the UI thread, which is generally undesirable. | |
| 174 TRACE_EVENT0( | |
| 175 "browser", | |
| 176 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle"); | |
| 177 base::ThreadRestrictions::ScopedAllowWait allow_wait; | |
| 178 request.event.Wait(); | |
| 179 return std::move(request.result); | |
| 180 } | |
| 181 | |
| 182 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( | 140 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( |
| 183 gfx::GpuMemoryBufferId id, | 141 gfx::GpuMemoryBufferId id, |
| 184 const gfx::Size& size, | 142 const gfx::Size& size, |
| 185 gfx::BufferFormat format, | 143 gfx::BufferFormat format, |
| 186 gfx::BufferUsage usage, | 144 gfx::BufferUsage usage, |
| 187 int child_client_id, | 145 int child_client_id, |
| 188 const AllocationCallback& callback) { | 146 const AllocationCallback& callback) { |
| 189 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 147 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 190 | 148 |
| 191 // Use service side allocation for native configurations. | 149 // Use service side allocation for native configurations. |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 request->result = gpu::GpuMemoryBufferImplSharedMemory::Create( | 329 request->result = gpu::GpuMemoryBufferImplSharedMemory::Create( |
| 372 new_id, request->size, request->format, | 330 new_id, request->size, request->format, |
| 373 base::Bind( | 331 base::Bind( |
| 374 &GpuMemoryBufferDeleted, | 332 &GpuMemoryBufferDeleted, |
| 375 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), | 333 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), |
| 376 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, | 334 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, |
| 377 base::Unretained(this), new_id, request->client_id))); | 335 base::Unretained(this), new_id, request->client_id))); |
| 378 request->event.Signal(); | 336 request->event.Signal(); |
| 379 } | 337 } |
| 380 | 338 |
| 381 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO( | |
| 382 CreateGpuMemoryBufferFromHandleRequest* request) { | |
| 383 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 384 | |
| 385 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); | |
| 386 | |
| 387 BufferMap& buffers = clients_[request->client_id]; | |
| 388 auto insert_result = buffers.insert(std::make_pair( | |
| 389 new_id, BufferInfo(request->size, request->handle.type, | |
| 390 request->format, request->usage, 0))); | |
| 391 DCHECK(insert_result.second); | |
| 392 | |
| 393 gfx::GpuMemoryBufferHandle handle = request->handle; | |
| 394 handle.id = new_id; | |
| 395 | |
| 396 // Note: Unretained is safe as IO thread is stopped before manager is | |
| 397 // destroyed. | |
| 398 request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle( | |
| 399 handle, request->size, request->format, request->usage, | |
| 400 base::Bind( | |
| 401 &GpuMemoryBufferDeleted, | |
| 402 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), | |
| 403 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, | |
| 404 base::Unretained(this), new_id, request->client_id))); | |
| 405 request->event.Signal(); | |
| 406 } | |
| 407 | |
| 408 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( | 339 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( |
| 409 CreateGpuMemoryBufferRequest* request, | 340 CreateGpuMemoryBufferRequest* request, |
| 410 const gfx::GpuMemoryBufferHandle& handle) { | 341 const gfx::GpuMemoryBufferHandle& handle) { |
| 411 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 342 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 412 | 343 |
| 413 // Early out if factory failed to create the buffer. | 344 // Early out if factory failed to create the buffer. |
| 414 if (handle.is_null()) { | 345 if (handle.is_null()) { |
| 415 request->event.Signal(); | 346 request->event.Signal(); |
| 416 return; | 347 return; |
| 417 } | 348 } |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 format(format), | 537 format(format), |
| 607 usage(usage), | 538 usage(usage), |
| 608 gpu_host_id(gpu_host_id) {} | 539 gpu_host_id(gpu_host_id) {} |
| 609 | 540 |
| 610 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = | 541 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = |
| 611 default; | 542 default; |
| 612 | 543 |
| 613 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} | 544 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} |
| 614 | 545 |
| 615 } // namespace content | 546 } // namespace content |
| OLD | NEW |