Chromium Code Reviews| 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..4718db3b50769b41a5f826a589ce27e1bbe5a390 |
| --- /dev/null |
| +++ b/content/common/gpu/client/command_buffer_metrics.cc |
| @@ -0,0 +1,140 @@ |
| +// 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 here. |
| + 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 here and update _MAX_ENUM. |
| + 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; |
| + } |
| + NOTREACHED(); |
| + return CONTEXT_LOST_UNKNOWN; |
| +} |
| + |
| +const char* GetHistogramName(CommandBufferContextType type) { |
| + switch (type) { |
| + case BROWSER_COMPOSITOR_ONSCREEN_CONTEXT: |
| + return "GPU.ContextLost.BrowserCompositor"; |
| + case BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT: |
| + return "GPU.ContextLost.BrowserMainThread"; |
| + case RENDER_COMPOSITOR_CONTEXT: |
| + return "GPU.ContextLost.RenderCompositor"; |
| + case RENDER_WORKER_CONTEXT: |
| + return "GPU.ContextLost.RenderWorker"; |
| + case RENDERER_MAINTHREAD_CONTEXT: |
| + return "GPU.ContextLost.RenderMainThread"; |
| + case GPU_VIDEO_ACCELERATOR_CONTEXT: |
| + return "GPU.ContextLost.VideoAccelerator"; |
| + case OFFSCREEN_VIDEO_CAPTURE_CONTEXT: |
| + return "GPU.ContextLost.VideoCapture"; |
| + case OFFSCREEN_CONTEXT_FOR_WEBGL: |
| + return "GPU.ContextLost.WebGL"; |
| + case CONTEXT_TYPE_UNKNOWN: |
| + return "GPU.ContextLost.Unknown"; |
| + } |
| +} |
| + |
| +} // 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); |
|
Alexei Svitkine (slow)
2015/04/24 19:31:58
Unfortunately this won't work.
The UMA histogram
no sievers
2015/04/24 19:56:42
Thanks for catching that. Fixed.
|
| + } |
| +} |
| + |
| +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 |