| Index: content/common/gpu/client/command_buffer_metrics.cc
|
| diff --git a/content/common/gpu/client/command_buffer_metrics.cc b/content/common/gpu/client/command_buffer_metrics.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c8a016c26ec93ab976731fde072d5380213ac614
|
| --- /dev/null
|
| +++ b/content/common/gpu/client/command_buffer_metrics.cc
|
| @@ -0,0 +1,143 @@
|
| +// 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 "content/common/gpu/client/command_buffer_metrics.h"
|
| +
|
| +#include "base/metrics/histogram.h"
|
| +
|
| +namespace content {
|
| +
|
| +namespace {
|
| +
|
| +enum CommandBufferContextLostReason {
|
| + // Don't add new values before _MAX_ENUM to keep the histogram consistent.
|
| + CONTEXT_INIT_FAILED,
|
| + CONTEXT_LOST_GPU_CHANNEL_ERROR,
|
| + CONTEXT_PARSE_ERROR_INVALID_SIZE,
|
| + CONTEXT_PARSE_ERROR_OUT_OF_BOUNDS,
|
| + CONTEXT_PARSE_ERROR_UNKNOWN_COMMAND,
|
| + CONTEXT_PARSE_ERROR_INVALID_ARGS,
|
| + CONTEXT_PARSE_ERROR_GENERIC_ERROR,
|
| + CONTEXT_LOST_GUILTY,
|
| + CONTEXT_LOST_INNOCENT,
|
| + CONTEXT_LOST_UNKNOWN,
|
| + CONTEXT_LOST_OUT_OF_MEMORY,
|
| + CONTEXT_LOST_MAKECURRENT_FAILED,
|
| + // Add new values above this point.
|
| + CONTEXT_LOST_REASON_MAX_ENUM = CONTEXT_LOST_MAKECURRENT_FAILED
|
| +};
|
| +
|
| +CommandBufferContextLostReason GetContextLostReason(
|
| + gpu::error::Error error,
|
| + gpu::error::ContextLostReason reason) {
|
| + if (error == gpu::error::kLostContext) {
|
| + switch (reason) {
|
| + case gpu::error::kGuilty:
|
| + return CONTEXT_LOST_GUILTY;
|
| + case gpu::error::kInnocent:
|
| + return CONTEXT_LOST_INNOCENT;
|
| + case gpu::error::kUnknown:
|
| + return CONTEXT_LOST_UNKNOWN;
|
| + case gpu::error::kOutOfMemory:
|
| + return CONTEXT_LOST_OUT_OF_MEMORY;
|
| + case gpu::error::kMakeCurrentFailed:
|
| + return CONTEXT_LOST_MAKECURRENT_FAILED;
|
| + }
|
| + }
|
| + switch (error) {
|
| + case gpu::error::kInvalidSize:
|
| + return CONTEXT_PARSE_ERROR_INVALID_SIZE;
|
| + case gpu::error::kOutOfBounds:
|
| + return CONTEXT_PARSE_ERROR_OUT_OF_BOUNDS;
|
| + case gpu::error::kUnknownCommand:
|
| + return CONTEXT_PARSE_ERROR_UNKNOWN_COMMAND;
|
| + case gpu::error::kInvalidArguments:
|
| + return CONTEXT_PARSE_ERROR_INVALID_ARGS;
|
| + case gpu::error::kGenericError:
|
| + return CONTEXT_PARSE_ERROR_GENERIC_ERROR;
|
| + case gpu::error::kDeferCommandUntilLater:
|
| + case gpu::error::kNoError:
|
| + case gpu::error::kLostContext:
|
| + NOTREACHED();
|
| + return CONTEXT_LOST_UNKNOWN;
|
| + }
|
| +}
|
| +
|
| +const char* GetHistogramName(CommandBufferContextType type) {
|
| + switch (type) {
|
| + case OFFSCREEN_CONTEXT_FOR_TESTING:
|
| + return "";
|
| + case BROWSER_COMPOSITOR_ONSCREEN_CONTEXT:
|
| + return "GPU.BrowserCompositorContextLost";
|
| + case BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT:
|
| + return "GPU.BrowserMainThreadContextLost";
|
| + case RENDER_COMPOSITOR_CONTEXT:
|
| + return "GPU.RenderCompositorContextLost";
|
| + case RENDER_WORKER_CONTEXT:
|
| + return "GPU.RenderWorkerContextLost";
|
| + case RENDERER_MAINTHREAD_CONTEXT:
|
| + return "GPU.RenderMainThreadContextLost";
|
| + case GPU_VIDEO_ACCELERATOR_CONTEXT:
|
| + return "GPU.VideoAcceleratorContextLost";
|
| + case OFFSCREEN_VIDEO_CAPTURE_CONTEXT:
|
| + return "GPU.VideoCaptureContextLost";
|
| + case OFFSCREEN_CONTEXT_FOR_WEBGL:
|
| + return "GPU.WebGLContextLost";
|
| + case CONTEXT_TYPE_UNKNOWN:
|
| + return "GPU.UnknownContextTypeLost";
|
| + default:
|
| + NOTREACHED();
|
| + return "";
|
| + }
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| +std::string CommandBufferContextTypeToString(CommandBufferContextType type) {
|
| + switch (type) {
|
| + case OFFSCREEN_CONTEXT_FOR_TESTING:
|
| + return "Context-For-Testing";
|
| + case BROWSER_COMPOSITOR_ONSCREEN_CONTEXT:
|
| + return "Compositor";
|
| + case BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT:
|
| + return "Offscreen-MainThread";
|
| + case RENDER_COMPOSITOR_CONTEXT:
|
| + return "RenderCompositor";
|
| + case RENDER_WORKER_CONTEXT:
|
| + return "RenderWorker";
|
| + case RENDERER_MAINTHREAD_CONTEXT:
|
| + return "Offscreen-MainThread";
|
| + case GPU_VIDEO_ACCELERATOR_CONTEXT:
|
| + return "GPU-VideoAccelerator-Offscreen";
|
| + case OFFSCREEN_VIDEO_CAPTURE_CONTEXT:
|
| + return "Offscreen-CaptureThread";
|
| + case OFFSCREEN_CONTEXT_FOR_WEBGL:
|
| + return "Offscreen-For-WebGL";
|
| + default:
|
| + NOTREACHED();
|
| + return "unknown";
|
| + }
|
| +}
|
| +
|
| +void UmaRecordContextInitFailed(CommandBufferContextType type) {
|
| + const char* histogram_name = GetHistogramName(type);
|
| + if (histogram_name) {
|
| + UMA_HISTOGRAM_ENUMERATION(histogram_name, CONTEXT_INIT_FAILED,
|
| + CONTEXT_LOST_REASON_MAX_ENUM);
|
| + }
|
| +}
|
| +
|
| +void UmaRecordContextLost(CommandBufferContextType type,
|
| + gpu::error::Error error,
|
| + gpu::error::ContextLostReason reason) {
|
| + const char* histogram_name = GetHistogramName(type);
|
| + if (histogram_name) {
|
| + CommandBufferContextLostReason converted_reason =
|
| + GetContextLostReason(error, reason);
|
| + UMA_HISTOGRAM_ENUMERATION(histogram_name, converted_reason,
|
| + CONTEXT_LOST_REASON_MAX_ENUM);
|
| + }
|
| +}
|
| +
|
| +} // namespace content
|
|
|