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

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

Issue 1055403010: content: Add GpuMemoryBuffer MemoryDumpProvider implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: register/unregister Created 5 years, 8 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 59b2ed7f26f9081b053248e234bbc7ee58914df1..1ec8aeb84e0726d2cece87af4a93c2c1a104069a 100644
--- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
+++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
@@ -7,8 +7,10 @@
#include "base/atomic_sequence_num.h"
#include "base/bind.h"
#include "base/lazy_instance.h"
+#include "base/strings/stringprintf.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_restrictions.h"
+#include "base/trace_event/process_memory_dump.h"
#include "base/trace_event/trace_event.h"
#include "content/common/gpu/client/gpu_memory_buffer_factory_host.h"
#include "content/common/gpu/client/gpu_memory_buffer_impl.h"
@@ -23,6 +25,8 @@ BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr;
// Global atomic to generate gpu memory buffer unique IDs.
base::StaticAtomicSequenceNumber g_next_gpu_memory_buffer_id;
+const char kMemoryAllocatorName[] = "gpumemorybuffer";
+
} // namespace
struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest {
@@ -145,7 +149,7 @@ void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
return;
}
- buffers[new_id] = gfx::SHARED_MEMORY_BUFFER;
+ buffers[new_id] = BufferInfo(size, format, gfx::SHARED_MEMORY_BUFFER);
callback.Run(GpuMemoryBufferImplSharedMemory::AllocateForChildProcess(
new_id, size, format, child_process_handle));
return;
@@ -155,7 +159,7 @@ void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
// allocation completes is less subtle if we set the buffer type to
// EMPTY_BUFFER here and verify that this has not changed when allocation
// completes.
- buffers[new_id] = gfx::EMPTY_BUFFER;
+ buffers[new_id] = BufferInfo(size, format, gfx::EMPTY_BUFFER);
gpu_memory_buffer_factory_host_->CreateGpuMemoryBuffer(
new_id, size, format, usage, child_client_id, 0,
@@ -177,6 +181,38 @@ void BrowserGpuMemoryBufferManager::SetDestructionSyncPoint(
->set_destruction_sync_point(sync_point);
}
+bool BrowserGpuMemoryBufferManager::OnMemoryDump(
+ base::trace_event::ProcessMemoryDump* pmd) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ for (auto& client_it : clients_) {
Primiano Tucci (use gerrit) 2015/04/28 20:13:08 Maybe these two could be "const" auto& (or is ther
reveman 2015/04/28 20:52:25 Done.
+ for (auto& buffer_it : client_it.second) {
+ if (buffer_it.second.type == gfx::EMPTY_BUFFER)
+ continue;
+
+ base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(
+ base::StringPrintf("%s/%d", kMemoryAllocatorName, buffer_it.first));
+ if (!dump)
+ return false;
+
+ size_t buffer_size_in_bytes = 0;
+ // Note: BufferSizeInBytes returns an approximated size for the buffer
+ // but the factory can be made to return the exact size if this
+ // approximation is not good enough.
+ bool valid_size = GpuMemoryBufferImpl::BufferSizeInBytes(
+ buffer_it.second.size, buffer_it.second.format,
+ &buffer_size_in_bytes);
+ DCHECK(valid_size);
+
+ dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameInnerSize,
Primiano Tucci (use gerrit) 2015/04/28 20:13:08 Is it this really intending to be InnerSize (As op
reveman 2015/04/28 20:52:25 I used InnerSize as we don't know what the interna
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes,
+ buffer_size_in_bytes);
+ }
+ }
+
+ return true;
+}
+
void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
base::ProcessHandle child_process_handle,
@@ -195,14 +231,14 @@ void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer(
// This can happen if a child process managed to trigger a call to this while
// a buffer is in the process of being allocated.
- if (buffer_it->second == gfx::EMPTY_BUFFER) {
+ if (buffer_it->second.type == gfx::EMPTY_BUFFER) {
LOG(ERROR) << "Invalid GpuMemoryBuffer type.";
return;
}
// Buffers allocated using the factory need to be destroyed through the
// factory.
- if (buffer_it->second != gfx::SHARED_MEMORY_BUFFER) {
+ if (buffer_it->second.type != gfx::SHARED_MEMORY_BUFFER) {
gpu_memory_buffer_factory_host_->DestroyGpuMemoryBuffer(id,
child_client_id,
sync_point);
@@ -224,11 +260,11 @@ void BrowserGpuMemoryBufferManager::ProcessRemoved(
// This might happen if buffer is currenlty in the process of being
// allocated. The buffer will in that case be cleaned up when allocation
// completes.
- if (buffer_it.second == gfx::EMPTY_BUFFER)
+ if (buffer_it.second.type == gfx::EMPTY_BUFFER)
continue;
// Skip shared memory buffers as they were not allocated using the factory.
- if (buffer_it.second == gfx::SHARED_MEMORY_BUFFER)
+ if (buffer_it.second.type == gfx::SHARED_MEMORY_BUFFER)
continue;
gpu_memory_buffer_factory_host_->DestroyGpuMemoryBuffer(buffer_it.first,
@@ -305,7 +341,7 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferAllocatedForChildProcess(
BufferMap::iterator buffer_it = buffers.find(handle.id);
DCHECK(buffer_it != buffers.end());
- DCHECK_EQ(buffer_it->second, gfx::EMPTY_BUFFER);
+ DCHECK_EQ(buffer_it->second.type, gfx::EMPTY_BUFFER);
if (handle.is_null()) {
buffers.erase(buffer_it);
@@ -318,7 +354,7 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferAllocatedForChildProcess(
// Store the type of this buffer so it can be cleaned up if the child
// process is removed.
- buffer_it->second = handle.type;
+ buffer_it->second.type = handle.type;
callback.Run(handle);
}
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | content/common/gpu/client/gpu_memory_buffer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698