| 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::CreateGpuMemoryBufferFromClientIdRequest |
| 172 : public CreateGpuMemoryBufferRequest { |
| 173 CreateGpuMemoryBufferFromClientIdRequest( |
| 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 ~CreateGpuMemoryBufferFromClientIdRequest() {} |
| 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::CreateGpuMemoryBufferFromClientId( |
| 332 int client_id, |
| 333 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) { |
| 334 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 335 |
| 336 CreateGpuMemoryBufferFromClientIdRequest request(client_id, |
| 337 gpu_memory_buffer_id); |
| 338 BrowserThread::PostTask( |
| 339 BrowserThread::IO, FROM_HERE, |
| 340 base::Bind(&BrowserGpuMemoryBufferManager:: |
| 341 HandleCreateGpuMemoryBufferFromClientIdOnIO, |
| 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::CreateGpuMemoryBufferFromClientId"); |
| 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::HandleCreateGpuMemoryBufferFromClientIdOnIO( |
| 577 CreateGpuMemoryBufferFromClientIdRequest* request) { |
| 578 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 579 |
| 580 // This must be robust to renderer processes specifying invalid ids or the |
| 581 // client being removed. |
| 582 ClientMap::iterator client_it = clients_.find(request->client_id); |
| 583 if (client_it == clients_.end()) { |
| 584 LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid client."; |
| 585 request->event.Signal(); |
| 586 return; |
| 587 } |
| 588 BufferMap& buffers = client_it->second; |
| 589 BufferMap::iterator buffer_it = buffers.find(request->gpu_memory_buffer_id); |
| 590 if (buffer_it == buffers.end()) { |
| 591 LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid id."; |
| 592 request->event.Signal(); |
| 593 return; |
| 594 } |
| 595 |
| 596 // TODO(ccameron): Implement this. |
| 597 NOTIMPLEMENTED(); |
| 598 request->event.Signal(); |
| 599 } |
| 600 |
| 537 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( | 601 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( |
| 538 CreateGpuMemoryBufferRequest* request, | 602 CreateGpuMemoryBufferRequest* request, |
| 539 const gfx::GpuMemoryBufferHandle& handle) { | 603 const gfx::GpuMemoryBufferHandle& handle) { |
| 540 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 604 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 541 | 605 |
| 542 // Early out if factory failed to create the buffer. | 606 // Early out if factory failed to create the buffer. |
| 543 if (handle.is_null()) { | 607 if (handle.is_null()) { |
| 544 request->event.Signal(); | 608 request->event.Signal(); |
| 545 return; | 609 return; |
| 546 } | 610 } |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 // The gpu_client uses a fixed tracing ID. | 780 // The gpu_client uses a fixed tracing ID. |
| 717 return gpu_client_tracing_id_; | 781 return gpu_client_tracing_id_; |
| 718 } | 782 } |
| 719 | 783 |
| 720 // In normal cases, |client_id| is a child process id, so we can perform | 784 // In normal cases, |client_id| is a child process id, so we can perform |
| 721 // the standard conversion. | 785 // the standard conversion. |
| 722 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( | 786 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( |
| 723 client_id); | 787 client_id); |
| 724 } | 788 } |
| 725 | 789 |
| 790 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo() = default; |
| 791 |
| 792 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo( |
| 793 const gfx::Size& size, |
| 794 gfx::GpuMemoryBufferType type, |
| 795 gfx::BufferFormat format, |
| 796 gfx::BufferUsage usage, |
| 797 int gpu_host_id) |
| 798 : size(size), |
| 799 type(type), |
| 800 format(format), |
| 801 usage(usage), |
| 802 gpu_host_id(gpu_host_id) {} |
| 803 |
| 804 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = |
| 805 default; |
| 806 |
| 807 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} |
| 808 |
| 726 } // namespace content | 809 } // namespace content |
| OLD | NEW |