0
Files
src/content/common/peak_gpu_memory_callback.cc
Aman Verma 39fe049c83 Move PeakGpuMemoryTracker to //components/input
This CL introduces PeakGpuMemoryTrackerFactory to refactor
PeakGpuMemoryTracker interface and to move the creation of
PeakGpuMemoryTracker objects to a content API. PeakGpuMemoryTracker is
moved to //components/input to allow Viz to keep track of peak gpu
memory in scroll scenarios.

Bug: b:346760308
Change-Id: I3351880a0e0b1dd7d2e835d75c62de5272e16e5e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5630399
Reviewed-by: Colin Blundell <blundell@chromium.org>
Reviewed-by: Dave Tapuska <dtapuska@chromium.org>
Commit-Queue: Aman Verma <amanvr@google.com>
Cr-Commit-Position: refs/heads/main@{#1315812}
2024-06-17 14:07:01 +00:00

121 lines
4.4 KiB
C++

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
#pragma allow_unsafe_buffers
#endif
#include "content/common/peak_gpu_memory_callback.h"
#include <memory>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/location.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/strcat.h"
namespace content {
namespace {
// These count values should be recalculated in case of changes to the number
// of values in their respective enums.
constexpr int kUsageTypeCount =
static_cast<int>(input::PeakGpuMemoryTracker::Usage::USAGE_MAX) + 1;
constexpr int kAllocationSourceTypeCount =
static_cast<int>(gpu::GpuPeakMemoryAllocationSource::
GPU_PEAK_MEMORY_ALLOCATION_SOURCE_MAX) +
1;
constexpr int kAllocationSourceHistogramIndex =
kUsageTypeCount * kAllocationSourceTypeCount;
// Histogram values based on MEMORY_METRICS_HISTOGRAM_MB, allowing this to match
// Memory.Gpu.PrivateMemoryFootprint. Previously this was reported in KB, with a
// maximum of 500 MB. However that maximum is too low for Mac.
constexpr int kMemoryHistogramMin = 1;
constexpr int kMemoryHistogramMax = 64000;
constexpr int kMemoryHistogramBucketCount = 100;
constexpr const char* GetUsageName(input::PeakGpuMemoryTracker::Usage usage) {
switch (usage) {
case input::PeakGpuMemoryTracker::Usage::CHANGE_TAB:
return "ChangeTab2";
case input::PeakGpuMemoryTracker::Usage::PAGE_LOAD:
return "PageLoad";
case input::PeakGpuMemoryTracker::Usage::SCROLL:
return "Scroll";
}
}
constexpr const char* GetAllocationSourceName(
gpu::GpuPeakMemoryAllocationSource source) {
switch (source) {
case gpu::GpuPeakMemoryAllocationSource::UNKNOWN:
return "Unknown";
case gpu::GpuPeakMemoryAllocationSource::COMMAND_BUFFER:
return "CommandBuffer";
case gpu::GpuPeakMemoryAllocationSource::SHARED_CONTEXT_STATE:
return "SharedContextState";
case gpu::GpuPeakMemoryAllocationSource::SHARED_IMAGE_STUB:
return "SharedImageStub";
case gpu::GpuPeakMemoryAllocationSource::SKIA:
return "Skia";
}
}
std::string GetPeakMemoryUsageUMAName(
input::PeakGpuMemoryTracker::Usage usage) {
return base::StrCat({"Memory.GPU.PeakMemoryUsage2.", GetUsageName(usage)});
}
std::string GetPeakMemoryAllocationSourceUMAName(
input::PeakGpuMemoryTracker::Usage usage,
gpu::GpuPeakMemoryAllocationSource source) {
return base::StrCat({"Memory.GPU.PeakMemoryAllocationSource2.",
GetUsageName(usage), ".",
GetAllocationSourceName(source)});
}
} // namespace
// Callback provided to the GpuService, which will be notified of the
// |peak_memory| used. This will then report that to UMA Histograms, for the
// requested |usage|. Some tests may provide an optional |testing_callback| in
// order to sync tests with the work done here on the UI thread.
void PeakGpuMemoryCallback(
input::PeakGpuMemoryTracker::Usage usage,
base::OnceClosure testing_callback,
const uint64_t peak_memory,
const base::flat_map<gpu::GpuPeakMemoryAllocationSource, uint64_t>&
allocation_per_source) {
uint64_t memory_in_mb = peak_memory / 1048576u;
STATIC_HISTOGRAM_POINTER_GROUP(
GetPeakMemoryUsageUMAName(usage), static_cast<int>(usage),
kUsageTypeCount, Add(memory_in_mb),
base::Histogram::FactoryGet(
GetPeakMemoryUsageUMAName(usage), kMemoryHistogramMin,
kMemoryHistogramMax, kMemoryHistogramBucketCount,
base::HistogramBase::kUmaTargetedHistogramFlag));
for (auto& source : allocation_per_source) {
uint64_t source_memory_in_mb = source.second / 1048576u;
STATIC_HISTOGRAM_POINTER_GROUP(
GetPeakMemoryAllocationSourceUMAName(usage, source.first),
static_cast<int>(usage) * kAllocationSourceTypeCount +
static_cast<int>(source.first),
kAllocationSourceHistogramIndex, Add(source_memory_in_mb),
base::Histogram::FactoryGet(
GetPeakMemoryAllocationSourceUMAName(usage, source.first),
kMemoryHistogramMin, kMemoryHistogramMax,
kMemoryHistogramBucketCount,
base::HistogramBase::kUmaTargetedHistogramFlag));
}
std::move(testing_callback).Run();
}
} // namespace content