Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1025)

Unified Diff: content/browser/gpu/browser_gpu_memory_buffer_manager.cc

Issue 1993333002: Implement GpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add todos and bug numbers Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {}
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698