diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index 9103376ae88ebd..0e38b9ceae3e5d 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc @@ -67,6 +67,7 @@ #include "net/base/network_change_notifier.h" #include "net/socket/client_socket_factory.h" #include "net/ssl/ssl_config_service.h" +#include "skia/ext/skia_memory_dump_provider.h" #include "ui/base/clipboard/clipboard.h" #if defined(USE_AURA) || (defined(OS_MACOSX) && !defined(OS_IOS)) @@ -631,6 +632,8 @@ void BrowserMainLoop::PostMainMessageLoopStart() { // Enable the dump providers. base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( HostSharedBitmapManager::current()); + base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( + skia::SkiaMemoryDumpProvider::GetInstance()); #if defined(TCMALLOC_TRACE_MEMORY_SUPPORTED) trace_memory_controller_.reset(new base::trace_event::TraceMemoryController( diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 8b7e6425775a5c..4ab30d58f3c1f4 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -29,6 +29,7 @@ #include "base/threading/simple_thread.h" #include "base/threading/thread_local.h" #include "base/threading/thread_restrictions.h" +#include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_event.h" #include "base/values.h" #include "cc/base/switches.h" @@ -128,6 +129,7 @@ #include "net/base/net_errors.h" #include "net/base/port_util.h" #include "skia/ext/event_tracer_impl.h" +#include "skia/ext/skia_memory_dump_provider.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebThread.h" #include "third_party/WebKit/public/web/WebCache.h" @@ -738,6 +740,8 @@ void RenderThreadImpl::Init() { GetContentClient()->renderer()->RenderThreadStarted(); InitSkiaEventTracer(); + base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( + skia::SkiaMemoryDumpProvider::GetInstance()); const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 9eb998c12013a9..3ef715549e1f71 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn @@ -291,6 +291,7 @@ component("skia") { "ext/platform_device_mac.cc", "ext/platform_device_win.cc", "ext/recursive_gaussian_convolution.cc", + "ext/skia_memory_dump_provider.cc", "ext/skia_utils_base.cc", "ext/skia_utils_ios.mm", "ext/skia_utils_mac.mm", @@ -600,6 +601,7 @@ test("skia_unittests") { "ext/platform_canvas_unittest.cc", "ext/recursive_gaussian_convolution_unittest.cc", "ext/refptr_unittest.cc", + "ext/skia_memory_dump_provider_unittest.cc", "ext/skia_utils_ios_unittest.mm", "ext/skia_utils_mac_unittest.mm", ] diff --git a/skia/ext/skia_memory_dump_provider.cc b/skia/ext/skia_memory_dump_provider.cc new file mode 100644 index 00000000000000..a7c445fd5d4f1f --- /dev/null +++ b/skia/ext/skia_memory_dump_provider.cc @@ -0,0 +1,42 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "skia_memory_dump_provider.h" + +#include "base/trace_event/memory_allocator_dump.h" +#include "base/trace_event/memory_dump_manager.h" +#include "base/trace_event/process_memory_dump.h" +#include "third_party/skia/include/core/SkGraphics.h" +#include "third_party/skia/src/core/SkResourceCache.h" + +namespace skia { + +// static +SkiaMemoryDumpProvider* SkiaMemoryDumpProvider::GetInstance() { + return Singleton>::get(); +} + +SkiaMemoryDumpProvider::SkiaMemoryDumpProvider() {} + +SkiaMemoryDumpProvider::~SkiaMemoryDumpProvider() {} + +bool SkiaMemoryDumpProvider::OnMemoryDump( + base::trace_event::ProcessMemoryDump* process_memory_dump) { + auto font_mad = + process_memory_dump->CreateAllocatorDump("skia/sk_font_cache"); + font_mad->AddScalar("size", "bytes", SkGraphics::GetFontCacheUsed()); + font_mad->AddScalar("count", "objects", SkGraphics::GetFontCacheCountUsed()); + + auto resource_mad = + process_memory_dump->CreateAllocatorDump("skia/sk_resource_cache"); + resource_mad->AddScalar("size", "bytes", + SkResourceCache::GetTotalBytesUsed()); + // TODO(ssid): crbug.com/503168. Add sub-allocation edges from discardable or + // malloc memory dumps to avoid double counting. + + return true; +} + +} // namespace skia diff --git a/skia/ext/skia_memory_dump_provider.h b/skia/ext/skia_memory_dump_provider.h new file mode 100644 index 00000000000000..65e732bbd45eaf --- /dev/null +++ b/skia/ext/skia_memory_dump_provider.h @@ -0,0 +1,34 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SKIA_EXT_SKIA_MEMORY_DUMP_PROVIDER_H_ +#define SKIA_EXT_SKIA_MEMORY_DUMP_PROVIDER_H_ + +#include "base/memory/singleton.h" +#include "base/trace_event/memory_dump_provider.h" +#include "third_party/skia/include/core/SkTypes.h" + +namespace skia { + +class SK_API SkiaMemoryDumpProvider + : public base::trace_event::MemoryDumpProvider { + public: + static SkiaMemoryDumpProvider* GetInstance(); + + // base::trace_event::MemoryDumpProvider implementation: + bool OnMemoryDump( + base::trace_event::ProcessMemoryDump* process_memory_dump) override; + + private: + friend struct DefaultSingletonTraits; + + SkiaMemoryDumpProvider(); + ~SkiaMemoryDumpProvider() override; + + DISALLOW_COPY_AND_ASSIGN(SkiaMemoryDumpProvider); +}; + +} // namespace skia + +#endif // SKIA_EXT_SKIA_MEMORY_DUMP_PROVIDER_H_ diff --git a/skia/ext/skia_memory_dump_provider_unittest.cc b/skia/ext/skia_memory_dump_provider_unittest.cc new file mode 100644 index 00000000000000..bea4a8b1fc9e86 --- /dev/null +++ b/skia/ext/skia_memory_dump_provider_unittest.cc @@ -0,0 +1,21 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/trace_event/process_memory_dump.h" +#include "skia/ext/skia_memory_dump_provider.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace skia { + +TEST(SkiaMemoryDumpProviderTest, OnMemoryDump) { + scoped_ptr process_memory_dump( + new base::trace_event::ProcessMemoryDump(nullptr)); + SkiaMemoryDumpProvider::GetInstance()->OnMemoryDump( + process_memory_dump.get()); + + ASSERT_TRUE(process_memory_dump->GetAllocatorDump("skia/sk_font_cache")); + ASSERT_TRUE(process_memory_dump->GetAllocatorDump("skia/sk_resource_cache")); +} + +} // namespace skia diff --git a/skia/skia_chrome.gypi b/skia/skia_chrome.gypi index f9f92ebfb567b0..1554497848c855 100644 --- a/skia/skia_chrome.gypi +++ b/skia/skia_chrome.gypi @@ -48,6 +48,7 @@ 'ext/recursive_gaussian_convolution.cc', 'ext/SkDiscardableMemory_chrome.cc', 'ext/SkMemory_new_handler.cpp', + 'ext/skia_memory_dump_provider.cc', 'ext/skia_utils_base.cc', 'ext/skia_utils_ios.mm', 'ext/skia_utils_mac.mm', diff --git a/skia/skia_tests.gyp b/skia/skia_tests.gyp index 015065c8080e5f..f120d7c5604c75 100644 --- a/skia/skia_tests.gyp +++ b/skia/skia_tests.gyp @@ -27,6 +27,7 @@ 'ext/platform_canvas_unittest.cc', 'ext/recursive_gaussian_convolution_unittest.cc', 'ext/refptr_unittest.cc', + 'ext/skia_memory_dump_provider_unittest.cc', 'ext/skia_utils_ios_unittest.mm', 'ext/skia_utils_mac_unittest.mm', ],