Chromium Code Reviews| 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 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 : CreateGpuMemoryBufferRequest(size, | 161 : CreateGpuMemoryBufferRequest(size, |
| 162 format, | 162 format, |
| 163 gfx::BufferUsage::GPU_READ, | 163 gfx::BufferUsage::GPU_READ, |
| 164 client_id, | 164 client_id, |
| 165 gpu::kNullSurfaceHandle), | 165 gpu::kNullSurfaceHandle), |
| 166 handle(handle) {} | 166 handle(handle) {} |
| 167 ~CreateGpuMemoryBufferFromHandleRequest() {} | 167 ~CreateGpuMemoryBufferFromHandleRequest() {} |
| 168 gfx::GpuMemoryBufferHandle handle; | 168 gfx::GpuMemoryBufferHandle handle; |
| 169 }; | 169 }; |
| 170 | 170 |
| 171 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromChildIdRequest | |
| 172 : public CreateGpuMemoryBufferRequest { | |
| 173 CreateGpuMemoryBufferFromChildIdRequest( | |
| 174 int client_id, | |
| 175 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) | |
| 176 : CreateGpuMemoryBufferRequest(gfx::Size(), | |
| 177 gfx::BufferFormat::RGBA_8888, | |
| 178 gfx::BufferUsage::GPU_READ, | |
| 179 client_id, | |
| 180 gpu::kNullSurfaceHandle), | |
| 181 gpu_memory_buffer_id(gpu_memory_buffer_id) {} | |
| 182 ~CreateGpuMemoryBufferFromChildIdRequest() {} | |
| 183 gfx::GpuMemoryBufferId gpu_memory_buffer_id; | |
| 184 }; | |
| 185 | |
| 171 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( | 186 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( |
| 172 int gpu_client_id, | 187 int gpu_client_id, |
| 173 uint64_t gpu_client_tracing_id) | 188 uint64_t gpu_client_tracing_id) |
| 174 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()), | 189 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()), |
| 175 gpu_client_id_(gpu_client_id), | 190 gpu_client_id_(gpu_client_id), |
| 176 gpu_client_tracing_id_(gpu_client_tracing_id), | 191 gpu_client_tracing_id_(gpu_client_tracing_id), |
| 177 gpu_host_id_(0) { | 192 gpu_host_id_(0) { |
| 178 DCHECK(!g_gpu_memory_buffer_manager); | 193 DCHECK(!g_gpu_memory_buffer_manager); |
| 179 g_gpu_memory_buffer_manager = this; | 194 g_gpu_memory_buffer_manager = this; |
| 180 } | 195 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 305 DLOG(ERROR) << "Child process attempted to allocate a GpuMemoryBuffer with " | 320 DLOG(ERROR) << "Child process attempted to allocate a GpuMemoryBuffer with " |
| 306 "an existing ID."; | 321 "an existing ID."; |
| 307 callback.Run(gfx::GpuMemoryBufferHandle()); | 322 callback.Run(gfx::GpuMemoryBufferHandle()); |
| 308 return; | 323 return; |
| 309 } | 324 } |
| 310 | 325 |
| 311 callback.Run(gpu::GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( | 326 callback.Run(gpu::GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( |
| 312 id, size, format, child_process_handle)); | 327 id, size, format, child_process_handle)); |
| 313 } | 328 } |
| 314 | 329 |
| 330 std::unique_ptr<gfx::GpuMemoryBuffer> | |
| 331 BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromChildId( | |
| 332 int child_client_id, | |
| 333 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) { | |
| 334 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 335 | |
| 336 CreateGpuMemoryBufferFromChildIdRequest request(child_client_id, | |
| 337 gpu_memory_buffer_id); | |
| 338 BrowserThread::PostTask( | |
| 339 BrowserThread::IO, FROM_HERE, | |
| 340 base::Bind(&BrowserGpuMemoryBufferManager:: | |
| 341 HandleCreateGpuMemoryBufferFromChildIdOnIO, | |
| 342 base::Unretained(this), // Safe as we wait for result below. | |
| 343 base::Unretained(&request))); | |
| 344 | |
| 345 // We're blocking the UI thread, which is generally undesirable. | |
| 346 TRACE_EVENT0( | |
| 347 "browser", | |
| 348 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromChildId"); | |
| 349 base::ThreadRestrictions::ScopedAllowWait allow_wait; | |
| 350 request.event.Wait(); | |
| 351 return std::move(request.result); | |
| 352 } | |
| 353 | |
| 315 gfx::GpuMemoryBuffer* | 354 gfx::GpuMemoryBuffer* |
| 316 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( | 355 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( |
| 317 ClientBuffer buffer) { | 356 ClientBuffer buffer) { |
| 318 return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); | 357 return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); |
| 319 } | 358 } |
| 320 | 359 |
| 321 void BrowserGpuMemoryBufferManager::SetDestructionSyncToken( | 360 void BrowserGpuMemoryBufferManager::SetDestructionSyncToken( |
| 322 gfx::GpuMemoryBuffer* buffer, | 361 gfx::GpuMemoryBuffer* buffer, |
| 323 const gpu::SyncToken& sync_token) { | 362 const gpu::SyncToken& sync_token) { |
| 324 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( | 363 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 527 request->result = gpu::GpuMemoryBufferImplSharedMemory::CreateFromHandle( | 566 request->result = gpu::GpuMemoryBufferImplSharedMemory::CreateFromHandle( |
| 528 handle, request->size, request->format, request->usage, | 567 handle, request->size, request->format, request->usage, |
| 529 base::Bind( | 568 base::Bind( |
| 530 &GpuMemoryBufferDeleted, | 569 &GpuMemoryBufferDeleted, |
| 531 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), | 570 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), |
| 532 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, | 571 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, |
| 533 base::Unretained(this), new_id, request->client_id))); | 572 base::Unretained(this), new_id, request->client_id))); |
| 534 request->event.Signal(); | 573 request->event.Signal(); |
| 535 } | 574 } |
| 536 | 575 |
| 576 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromChildIdOnIO( | |
| 577 CreateGpuMemoryBufferFromChildIdRequest* request) { | |
| 578 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 579 // TODO(ccameron): Implement this. | |
|
ccameron
2016/05/12 23:41:38
I've left this blank in this patch -- the plan is
reveman
2016/05/13 12:28:37
We should do Scheme 1 as we need to store somethin
ccameron
2016/05/16 18:41:16
I've added the implementation for IOSurfaces here.
| |
| 580 } | |
| 581 | |
| 537 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( | 582 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( |
| 538 CreateGpuMemoryBufferRequest* request, | 583 CreateGpuMemoryBufferRequest* request, |
| 539 const gfx::GpuMemoryBufferHandle& handle) { | 584 const gfx::GpuMemoryBufferHandle& handle) { |
| 540 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 585 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 541 | 586 |
| 542 // Early out if factory failed to create the buffer. | 587 // Early out if factory failed to create the buffer. |
| 543 if (handle.is_null()) { | 588 if (handle.is_null()) { |
| 544 request->event.Signal(); | 589 request->event.Signal(); |
| 545 return; | 590 return; |
| 546 } | 591 } |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 return gpu_client_tracing_id_; | 762 return gpu_client_tracing_id_; |
| 718 } | 763 } |
| 719 | 764 |
| 720 // In normal cases, |client_id| is a child process id, so we can perform | 765 // In normal cases, |client_id| is a child process id, so we can perform |
| 721 // the standard conversion. | 766 // the standard conversion. |
| 722 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( | 767 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( |
| 723 client_id); | 768 client_id); |
| 724 } | 769 } |
| 725 | 770 |
| 726 } // namespace content | 771 } // namespace content |
| OLD | NEW |