| Index: content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| diff --git a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| index b5bcebc05ea17c1a5adcc31d4063c462d094634b..07d2feff4ebc729834c1a37b1abd692476067504 100644
|
| --- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| +++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| @@ -15,6 +15,14 @@
|
|
|
| namespace content {
|
| namespace {
|
| +
|
| +void GpuMemoryBufferAllocatedForChildProcess(
|
| + const BrowserGpuMemoryBufferManager::AllocationCallback& callback,
|
| + const gfx::GpuMemoryBufferHandle& handle) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + callback.Run(handle);
|
| +}
|
|
|
| BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr;
|
|
|
| @@ -88,30 +96,14 @@
|
| const AllocationCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
|
|
| - gfx::GpuMemoryBufferId new_id = g_next_gpu_memory_buffer_id.GetNext();
|
| -
|
| - BufferMap& buffers = clients_[child_client_id];
|
| - DCHECK(buffers.find(new_id) == buffers.end());
|
| -
|
| - // Note: Handling of cases where the child process is removed before the
|
| - // allocation completes is less subtle if we set the buffer type to
|
| - // EMPTY_BUFFER here and verify that this has not changed when allocation
|
| - // completes.
|
| - buffers[new_id] = gfx::EMPTY_BUFFER;
|
| -
|
| GpuMemoryBufferImpl::AllocateForChildProcess(
|
| - new_id,
|
| + g_next_gpu_memory_buffer_id.GetNext(),
|
| size,
|
| format,
|
| usage,
|
| child_process_handle,
|
| child_client_id,
|
| - base::Bind(&BrowserGpuMemoryBufferManager::
|
| - GpuMemoryBufferAllocatedForChildProcess,
|
| - base::Unretained(this),
|
| - child_process_handle,
|
| - child_client_id,
|
| - callback));
|
| + base::Bind(&GpuMemoryBufferAllocatedForChildProcess, callback));
|
| }
|
|
|
| gfx::GpuMemoryBuffer*
|
| @@ -120,108 +112,21 @@
|
| return GpuMemoryBufferImpl::FromClientBuffer(buffer);
|
| }
|
|
|
| -void BrowserGpuMemoryBufferManager::SetDestructionSyncPoint(
|
| - gfx::GpuMemoryBuffer* buffer,
|
| - uint32 sync_point) {
|
| - static_cast<GpuMemoryBufferImpl*>(buffer)
|
| - ->set_destruction_sync_point(sync_point);
|
| -}
|
| -
|
| void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer(
|
| + gfx::GpuMemoryBufferType type,
|
| gfx::GpuMemoryBufferId id,
|
| base::ProcessHandle child_process_handle,
|
| int child_client_id,
|
| uint32 sync_point) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - DCHECK(clients_.find(child_client_id) != clients_.end());
|
| -
|
| - BufferMap& buffers = clients_[child_client_id];
|
| -
|
| - BufferMap::iterator buffer_it = buffers.find(id);
|
| - if (buffer_it == buffers.end()) {
|
| - LOG(ERROR) << "Invalid GpuMemoryBuffer ID for child process.";
|
| - return;
|
| - }
|
| -
|
| - // This can happen if a child process managed to trigger a call to this while
|
| - // a buffer is in the process of being allocated.
|
| - if (buffer_it->second == gfx::EMPTY_BUFFER) {
|
| - LOG(ERROR) << "Invalid GpuMemoryBuffer type.";
|
| - return;
|
| - }
|
|
|
| GpuMemoryBufferImpl::DeletedByChildProcess(
|
| - buffer_it->second, id, child_process_handle, child_client_id, sync_point);
|
| -
|
| - buffers.erase(buffer_it);
|
| + type, id, child_process_handle, child_client_id, sync_point);
|
| }
|
|
|
| void BrowserGpuMemoryBufferManager::ProcessRemoved(
|
| - base::ProcessHandle process_handle,
|
| - int client_id) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - ClientMap::iterator client_it = clients_.find(client_id);
|
| - if (client_it == clients_.end())
|
| - return;
|
| -
|
| - for (auto &buffer_it : client_it->second) {
|
| - // This might happen if buffer is currenlty in the process of being
|
| - // allocated. The buffer will in that case be cleaned up when allocation
|
| - // completes.
|
| - if (buffer_it.second == gfx::EMPTY_BUFFER)
|
| - continue;
|
| -
|
| - GpuMemoryBufferImpl::DeletedByChildProcess(buffer_it.second,
|
| - buffer_it.first,
|
| - process_handle,
|
| - client_id,
|
| - 0);
|
| - }
|
| -
|
| - clients_.erase(client_it);
|
| -}
|
| -
|
| -void BrowserGpuMemoryBufferManager::GpuMemoryBufferAllocatedForChildProcess(
|
| - base::ProcessHandle child_process_handle,
|
| - int child_client_id,
|
| - const AllocationCallback& callback,
|
| - const gfx::GpuMemoryBufferHandle& handle) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - ClientMap::iterator client_it = clients_.find(child_client_id);
|
| -
|
| - // This can happen if the child process is removed while the buffer is being
|
| - // allocated.
|
| - if (client_it == clients_.end()) {
|
| - if (!handle.is_null()) {
|
| - GpuMemoryBufferImpl::DeletedByChildProcess(handle.type,
|
| - handle.id,
|
| - child_process_handle,
|
| - child_client_id,
|
| - 0);
|
| - }
|
| - callback.Run(gfx::GpuMemoryBufferHandle());
|
| - return;
|
| - }
|
| -
|
| - BufferMap& buffers = client_it->second;
|
| -
|
| - BufferMap::iterator buffer_it = buffers.find(handle.id);
|
| - DCHECK(buffer_it != buffers.end());
|
| - DCHECK_EQ(buffer_it->second, gfx::EMPTY_BUFFER);
|
| -
|
| - if (handle.is_null()) {
|
| - buffers.erase(buffer_it);
|
| - callback.Run(gfx::GpuMemoryBufferHandle());
|
| - return;
|
| - }
|
| -
|
| - // Store the type for this buffer so it can be cleaned up if the child
|
| - // process is removed.
|
| - buffer_it->second = handle.type;
|
| -
|
| - callback.Run(handle);
|
| + base::ProcessHandle process_handle) {
|
| + // TODO(reveman): Handle child process removal correctly.
|
| }
|
|
|
| // static
|
| @@ -247,4 +152,11 @@
|
| request->event.Signal();
|
| }
|
|
|
| +void BrowserGpuMemoryBufferManager::SetDestructionSyncPoint(
|
| + gfx::GpuMemoryBuffer* buffer,
|
| + uint32 sync_point) {
|
| + static_cast<GpuMemoryBufferImpl*>(buffer)
|
| + ->set_destruction_sync_point(sync_point);
|
| +}
|
| +
|
| } // namespace content
|
|
|