| 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 5db2f2ca1f18a75a24a5616d75826bc49e3e00b9..3cb728df94b7a628b0e390ad7b480b5abee799f2 100644
|
| --- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| +++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| @@ -30,19 +30,6 @@
|
| namespace content {
|
| namespace {
|
|
|
| -void HostCreateGpuMemoryBuffer(
|
| - gpu::SurfaceHandle surface_handle,
|
| - GpuProcessHost* host,
|
| - gfx::GpuMemoryBufferId id,
|
| - const gfx::Size& size,
|
| - gfx::BufferFormat format,
|
| - gfx::BufferUsage usage,
|
| - int client_id,
|
| - const BrowserGpuMemoryBufferManager::CreateCallback& callback) {
|
| - host->CreateGpuMemoryBuffer(id, size, format, usage, client_id,
|
| - surface_handle, callback);
|
| -}
|
| -
|
| void GpuMemoryBufferDeleted(
|
| scoped_refptr<base::SingleThreadTaskRunner> destruction_task_runner,
|
| const gpu::GpuMemoryBufferImpl::DestructionCallback& destruction_callback,
|
| @@ -83,8 +70,7 @@ BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(
|
| uint64_t gpu_client_tracing_id)
|
| : native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()),
|
| gpu_client_id_(gpu_client_id),
|
| - gpu_client_tracing_id_(gpu_client_tracing_id),
|
| - gpu_host_id_(0) {
|
| + gpu_client_tracing_id_(gpu_client_tracing_id) {
|
| DCHECK(!g_gpu_memory_buffer_manager);
|
| g_gpu_memory_buffer_manager = this;
|
| }
|
| @@ -118,9 +104,8 @@ void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
|
|
|
| // Use service side allocation for native configurations.
|
| if (IsNativeGpuMemoryBufferConfiguration(format, usage)) {
|
| - CreateGpuMemoryBufferOnIO(
|
| - base::Bind(&HostCreateGpuMemoryBuffer, gpu::kNullSurfaceHandle), id,
|
| - size, format, usage, child_client_id, false, callback);
|
| + CreateGpuMemoryBufferOnIO(id, size, format, usage, gpu::kNullSurfaceHandle,
|
| + child_client_id, callback);
|
| return;
|
| }
|
|
|
| @@ -274,9 +259,8 @@ void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferOnIO(
|
| // Note: Unretained is safe as this is only used for synchronous allocation
|
| // from a non-IO thread.
|
| CreateGpuMemoryBufferOnIO(
|
| - base::Bind(&HostCreateGpuMemoryBuffer, request->surface_handle), new_id,
|
| - request->size, request->format, request->usage, request->client_id,
|
| - false,
|
| + new_id, request->size, request->format, request->usage,
|
| + request->surface_handle, request->client_id,
|
| base::Bind(
|
| &BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO,
|
| base::Unretained(this), base::Unretained(request)));
|
| @@ -330,39 +314,14 @@ void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO(
|
| }
|
|
|
| void BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO(
|
| - const CreateDelegate& create_delegate,
|
| gfx::GpuMemoryBufferId id,
|
| const gfx::Size& size,
|
| gfx::BufferFormat format,
|
| gfx::BufferUsage usage,
|
| + gpu::SurfaceHandle surface_handle,
|
| int client_id,
|
| - bool reused_gpu_process,
|
| const CreateCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
|
| - if (!host) {
|
| - host = GpuProcessHost::Get();
|
| - if (!host) {
|
| - LOG(ERROR) << "Failed to launch GPU process.";
|
| - callback.Run(gfx::GpuMemoryBufferHandle());
|
| - return;
|
| - }
|
| - gpu_host_id_ = host->host_id();
|
| - reused_gpu_process = false;
|
| - } else {
|
| - if (reused_gpu_process) {
|
| - // We come here if we retried to create the buffer because of a failure
|
| - // in GpuMemoryBufferCreatedOnIO, but we ended up with the same process
|
| - // ID, meaning the failure was not because of a channel error, but
|
| - // another reason. So fail now.
|
| - LOG(ERROR) << "Failed to create GpuMemoryBuffer.";
|
| - callback.Run(gfx::GpuMemoryBufferHandle());
|
| - return;
|
| - }
|
| - reused_gpu_process = true;
|
| - }
|
| -
|
| BufferMap& buffers = clients_[client_id];
|
|
|
| // Note: Handling of cases where the client is removed before the allocation
|
| @@ -377,23 +336,24 @@ void BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO(
|
| return;
|
| }
|
|
|
| + GpuProcessHost* host = GpuProcessHost::Get();
|
| // Note: Unretained is safe as IO thread is stopped before manager is
|
| // destroyed.
|
| - create_delegate.Run(
|
| - host, id, size, format, usage, client_id,
|
| + host->CreateGpuMemoryBuffer(
|
| + id, size, format, usage, client_id, surface_handle,
|
| base::Bind(&BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO,
|
| - base::Unretained(this), create_delegate, id, client_id,
|
| - gpu_host_id_, reused_gpu_process, callback));
|
| + base::Unretained(this), id, surface_handle, client_id,
|
| + host->host_id(), callback));
|
| }
|
|
|
| void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO(
|
| - const CreateDelegate& create_delegate,
|
| gfx::GpuMemoryBufferId id,
|
| + gpu::SurfaceHandle surface_handle,
|
| int client_id,
|
| int gpu_host_id,
|
| - bool reused_gpu_process,
|
| const CreateCallback& callback,
|
| - const gfx::GpuMemoryBufferHandle& handle) {
|
| + const gfx::GpuMemoryBufferHandle& handle,
|
| + GpuProcessHost::BufferCreationStatus status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
| ClientMap::iterator client_it = clients_.find(client_id);
|
| @@ -421,20 +381,17 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO(
|
| if (!valid_handle) {
|
| // If we failed after re-using the GPU process, it may have died in the
|
| // mean time. Retry to have a chance to create a fresh GPU process.
|
| - if (handle.is_null() && reused_gpu_process) {
|
| + if (handle.is_null() &&
|
| + status == GpuProcessHost::BufferCreationStatus::GPU_HOST_INVALID) {
|
| DVLOG(1) << "Failed to create buffer through existing GPU process. "
|
| "Trying to restart GPU process.";
|
| - // If the GPU process has already been restarted, retry without failure
|
| - // when GPU process host ID already exists.
|
| - if (gpu_host_id != gpu_host_id_)
|
| - reused_gpu_process = false;
|
| gfx::Size size = buffer_it->second.size;
|
| gfx::BufferFormat format = buffer_it->second.format;
|
| gfx::BufferUsage usage = buffer_it->second.usage;
|
| // Remove the buffer entry and call CreateGpuMemoryBufferOnIO again.
|
| buffers.erase(buffer_it);
|
| - CreateGpuMemoryBufferOnIO(create_delegate, id, size, format, usage,
|
| - client_id, reused_gpu_process, callback);
|
| + CreateGpuMemoryBufferOnIO(id, size, format, usage, surface_handle,
|
| + client_id, callback);
|
| } else {
|
| // Remove the buffer entry and run the allocation callback with an empty
|
| // handle to indicate failure.
|
|
|