| 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..599eec13c96e4d4038b3284ba4666671a03cb856 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 DestroyGpuMemoryBuffer(const gpu::SyncToken& sync_token) {
|
| + // 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.buffer) {
|
| + request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle(
|
| + buffer_it->second.buffer->GetHandle(),
|
| + buffer_it->second.size, buffer_it->second.format,
|
| + buffer_it->second.usage, base::Bind(DestroyGpuMemoryBuffer));
|
| + }
|
| +
|
| 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,21 @@ 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) {
|
| + // TODO(ccameron): Enable this for all buffer types.
|
| + // https://crbug.com/614791
|
| + if (handle.type == gfx::IO_SURFACE_BUFFER) {
|
| + buffer = gpu::GpuMemoryBufferImpl::CreateFromHandle(
|
| + handle, buffer_it->second.size, buffer_it->second.format,
|
| + buffer_it->second.usage, base::Bind(DestroyGpuMemoryBuffer));
|
| + 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 +775,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.buffer = std::move(buffer);
|
|
|
| callback.Run(handle);
|
| }
|
| @@ -806,8 +836,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),
|
| + buffer(std::move(other.buffer)) {}
|
|
|
| BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {}
|
|
|
|
|