| 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 d104dd39033a848afc866d0850db87476c4ad520..61d3e563351eef86bf2a36f09bc870f15907d0a2 100644
|
| --- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| +++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| @@ -168,6 +168,21 @@ struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandleRequest
|
| gfx::GpuMemoryBufferHandle handle;
|
| };
|
|
|
| +struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientIdRequest
|
| + : public CreateGpuMemoryBufferRequest {
|
| + CreateGpuMemoryBufferFromClientIdRequest(
|
| + int client_id,
|
| + const gfx::GpuMemoryBufferId& gpu_memory_buffer_id)
|
| + : CreateGpuMemoryBufferRequest(gfx::Size(),
|
| + gfx::BufferFormat::RGBA_8888,
|
| + gfx::BufferUsage::GPU_READ,
|
| + client_id,
|
| + gpu::kNullSurfaceHandle),
|
| + gpu_memory_buffer_id(gpu_memory_buffer_id) {}
|
| + ~CreateGpuMemoryBufferFromClientIdRequest() {}
|
| + gfx::GpuMemoryBufferId gpu_memory_buffer_id;
|
| +};
|
| +
|
| BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(
|
| int gpu_client_id,
|
| uint64_t gpu_client_tracing_id)
|
| @@ -312,6 +327,30 @@ void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
|
| id, size, format, child_process_handle));
|
| }
|
|
|
| +std::unique_ptr<gfx::GpuMemoryBuffer>
|
| +BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId(
|
| + int client_id,
|
| + const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) {
|
| + DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + CreateGpuMemoryBufferFromClientIdRequest request(client_id,
|
| + gpu_memory_buffer_id);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&BrowserGpuMemoryBufferManager::
|
| + HandleCreateGpuMemoryBufferFromClientIdOnIO,
|
| + base::Unretained(this), // Safe as we wait for result below.
|
| + base::Unretained(&request)));
|
| +
|
| + // We're blocking the UI thread, which is generally undesirable.
|
| + TRACE_EVENT0(
|
| + "browser",
|
| + "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId");
|
| + base::ThreadRestrictions::ScopedAllowWait allow_wait;
|
| + request.event.Wait();
|
| + return std::move(request.result);
|
| +}
|
| +
|
| gfx::GpuMemoryBuffer*
|
| BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer(
|
| ClientBuffer buffer) {
|
| @@ -534,6 +573,31 @@ void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO(
|
| request->event.Signal();
|
| }
|
|
|
| +void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromClientIdOnIO(
|
| + CreateGpuMemoryBufferFromClientIdRequest* request) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + // This must be robust to renderer processes specifying invalid ids or the
|
| + // client being removed.
|
| + ClientMap::iterator client_it = clients_.find(request->client_id);
|
| + if (client_it == clients_.end()) {
|
| + LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid client.";
|
| + request->event.Signal();
|
| + return;
|
| + }
|
| + BufferMap& buffers = client_it->second;
|
| + BufferMap::iterator buffer_it = buffers.find(request->gpu_memory_buffer_id);
|
| + if (buffer_it == buffers.end()) {
|
| + LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid id.";
|
| + request->event.Signal();
|
| + return;
|
| + }
|
| +
|
| + // TODO(ccameron): Implement this.
|
| + NOTIMPLEMENTED();
|
| + request->event.Signal();
|
| +}
|
| +
|
| void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO(
|
| CreateGpuMemoryBufferRequest* request,
|
| const gfx::GpuMemoryBufferHandle& handle) {
|
| @@ -723,4 +787,23 @@ uint64_t BrowserGpuMemoryBufferManager::ClientIdToTracingProcessId(
|
| client_id);
|
| }
|
|
|
| +BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo() = default;
|
| +
|
| +BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(
|
| + const gfx::Size& size,
|
| + gfx::GpuMemoryBufferType type,
|
| + gfx::BufferFormat format,
|
| + gfx::BufferUsage usage,
|
| + int gpu_host_id)
|
| + : size(size),
|
| + type(type),
|
| + format(format),
|
| + usage(usage),
|
| + gpu_host_id(gpu_host_id) {}
|
| +
|
| +BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) =
|
| + default;
|
| +
|
| +BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {}
|
| +
|
| } // namespace content
|
|
|