Chromium Code Reviews| 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 cab9d93fbd1c04829cce93d31354f9a5f8dfe07e..934906874640b72139c00bd2b6c86a1595121095 100644 |
| --- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc |
| +++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc |
| @@ -130,6 +130,10 @@ GpuMemoryBufferConfigurationSet GetNativeGpuMemoryBufferConfigurations() { |
| return configurations; |
| } |
| +void DestroyGpuMemoryBufferNoOp(const gpu::SyncToken& sync_token) { |
|
reveman
2016/05/24 22:19:47
nit: no need for NoOp in the name
ccameron
2016/05/24 22:58:04
Done.
|
| + // No additional state needs to be cleaned up. |
| +} |
| + |
| BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr; |
| } // namespace |
| @@ -598,8 +602,14 @@ void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromClientIdOnIO( |
| return; |
| } |
| - // TODO(ccameron): Implement this. |
| - NOTIMPLEMENTED(); |
| + // Create a copy of the buffer to provide to the caller. |
| + if (buffer_it->second.parent_buffer_instance) { |
| + request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle( |
| + buffer_it->second.parent_buffer_instance->GetHandle(), |
| + buffer_it->second.size, buffer_it->second.format, |
| + buffer_it->second.usage, base::Bind(DestroyGpuMemoryBufferNoOp)); |
| + } |
| + |
| request->event.Signal(); |
| } |
| @@ -636,6 +646,8 @@ void BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO( |
| bool reused_gpu_process, |
| const CreateCallback& callback) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + TRACE_EVENT0("browser", |
| + "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferOnIO"); |
| GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_); |
| if (!host) { |
| @@ -693,6 +705,8 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO( |
| const CreateCallback& callback, |
| const gfx::GpuMemoryBufferHandle& handle) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + TRACE_EVENT0("browser", |
| + "BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO"); |
| ClientMap::iterator client_it = clients_.find(client_id); |
| @@ -716,6 +730,20 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO( |
| // If the handle isn't valid, that means that the GPU process crashed or is |
| // misbehaving. |
| bool valid_handle = !handle.is_null() && handle.id == id; |
| + |
| + // Open a copy of the buffer in the browser process for future use. |
| + std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer; |
| + if (valid_handle) { |
| + // This is currently only used by IOSurface buffers. |
| + if (handle.type == gfx::IO_SURFACE_BUFFER) { |
|
reveman
2016/05/24 22:19:47
This should be the correct behavior on all platfor
ccameron
2016/05/24 22:58:04
Changed this to a TODO. This is the only one that
|
| + buffer = gpu::GpuMemoryBufferImpl::CreateFromHandle( |
| + handle, buffer_it->second.size, buffer_it->second.format, |
| + buffer_it->second.usage, base::Bind(DestroyGpuMemoryBufferNoOp)); |
| + if (!buffer) |
| + valid_handle = false; |
| + } |
| + } |
| + |
| 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. |
| @@ -746,6 +774,7 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO( |
| // client is removed. |
| buffer_it->second.type = handle.type; |
| buffer_it->second.gpu_host_id = gpu_host_id; |
| + buffer_it->second.parent_buffer_instance = std::move(buffer); |
| callback.Run(handle); |
| } |
| @@ -806,8 +835,13 @@ BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo( |
| usage(usage), |
| gpu_host_id(gpu_host_id) {} |
| -BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = |
| - default; |
| +BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(BufferInfo&& other) |
| + : size(other.size), |
| + type(other.type), |
| + format(other.format), |
| + usage(other.usage), |
| + gpu_host_id(other.gpu_host_id), |
| + parent_buffer_instance(std::move(other.parent_buffer_instance)) {} |
| BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} |