Chromium Code Reviews

Unified Diff: mojo/services/gles2/command_buffer_impl.cc

Issue 211703003: GPU: 'Pass' SharedMemory when possible. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@GPU_ref_count_buffer
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: mojo/services/gles2/command_buffer_impl.cc
diff --git a/mojo/services/gles2/command_buffer_impl.cc b/mojo/services/gles2/command_buffer_impl.cc
index 71df2c5e7a9d9ed14cb0446528f7a7cdd42f6508..3ffa3946582edeb38325d861bc9efd97173c8f03 100644
--- a/mojo/services/gles2/command_buffer_impl.cc
+++ b/mojo/services/gles2/command_buffer_impl.cc
@@ -143,9 +143,24 @@ void CommandBufferImpl::MakeProgress(int32_t last_get_offset) {
void CommandBufferImpl::RegisterTransferBuffer(int32_t id,
const ShmHandle& transfer_buffer,
uint32_t size) {
- bool read_only = false;
- base::SharedMemory shared_memory(transfer_buffer, read_only);
- command_buffer_->RegisterTransferBuffer(id, &shared_memory, size);
+ // Duplicate the shared memory for this process.
+ base::SharedMemory shared_memory(transfer_buffer, false);
+ base::SharedMemoryHandle duped_shared_memory_handle;
+ if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(),
+ &duped_shared_memory_handle)) {
+ DVLOG(0) << "Failed to duplicate shared memory handle.";
+ return;
+ }
+ scoped_ptr<base::SharedMemory> duped_shared_memory(
+ new base::SharedMemory(duped_shared_memory_handle, false));
+
+ // Map the shared memory into this process. This validates the size.
+ if (!duped_shared_memory->Map(size)) {
+ DVLOG(0) << "Failed to map shared memory.";
+ return;
+ }
+
+ command_buffer_->RegisterTransferBuffer(id, duped_shared_memory.Pass(), size);
}
void CommandBufferImpl::DestroyTransferBuffer(int32_t id) {

Powered by Google App Engine