RendererGL: Limit warning output to 5 per message type.

BUG=768943

Change-Id: I8ed69c70d1914b56145c52ffe26f13193fb55e9e
Reviewed-on: https://chromium-review.googlesource.com/685278
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/renderer/gl/RendererGL.cpp b/src/libANGLE/renderer/gl/RendererGL.cpp
index 6d9de89..09524f8 100644
--- a/src/libANGLE/renderer/gl/RendererGL.cpp
+++ b/src/libANGLE/renderer/gl/RendererGL.cpp
@@ -65,100 +65,9 @@
                                                    const GLchar *message,
                                                    const void *userParam)
 {
-    std::string sourceText;
-    switch (source)
-    {
-        case GL_DEBUG_SOURCE_API:
-            sourceText = "OpenGL";
-            break;
-        case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
-            sourceText = "Windows";
-            break;
-        case GL_DEBUG_SOURCE_SHADER_COMPILER:
-            sourceText = "Shader Compiler";
-            break;
-        case GL_DEBUG_SOURCE_THIRD_PARTY:
-            sourceText = "Third Party";
-            break;
-        case GL_DEBUG_SOURCE_APPLICATION:
-            sourceText = "Application";
-            break;
-        case GL_DEBUG_SOURCE_OTHER:
-            sourceText = "Other";
-            break;
-        default:
-            sourceText = "UNKNOWN";
-            break;
-    }
-
-    std::string typeText;
-    switch (type)
-    {
-        case GL_DEBUG_TYPE_ERROR:
-            typeText = "Error";
-            break;
-        case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
-            typeText = "Deprecated behavior";
-            break;
-        case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
-            typeText = "Undefined behavior";
-            break;
-        case GL_DEBUG_TYPE_PORTABILITY:
-            typeText = "Portability";
-            break;
-        case GL_DEBUG_TYPE_PERFORMANCE:
-            typeText = "Performance";
-            break;
-        case GL_DEBUG_TYPE_OTHER:
-            typeText = "Other";
-            break;
-        case GL_DEBUG_TYPE_MARKER:
-            typeText = "Marker";
-            break;
-        default:
-            typeText = "UNKNOWN";
-            break;
-    }
-
-    std::string severityText;
-    switch (severity)
-    {
-        case GL_DEBUG_SEVERITY_HIGH:
-            severityText = "High";
-            break;
-        case GL_DEBUG_SEVERITY_MEDIUM:
-            severityText = "Medium";
-            break;
-        case GL_DEBUG_SEVERITY_LOW:
-            severityText = "Low";
-            break;
-        case GL_DEBUG_SEVERITY_NOTIFICATION:
-            severityText = "Notification";
-            break;
-        default:
-            severityText = "UNKNOWN";
-            break;
-    }
-
-    if (type == GL_DEBUG_TYPE_ERROR)
-    {
-        ERR() << std::endl
-              << "\tSource: " << sourceText << std::endl
-              << "\tType: " << typeText << std::endl
-              << "\tID: " << gl::Error(id) << std::endl
-              << "\tSeverity: " << severityText << std::endl
-              << "\tMessage: " << message;
-    }
-    else
-    {
-        // TODO(ynovikov): filter into WARN and INFO if INFO is ever implemented
-        WARN() << std::endl
-               << "\tSource: " << sourceText << std::endl
-               << "\tType: " << typeText << std::endl
-               << "\tID: " << gl::Error(id) << std::endl
-               << "\tSeverity: " << severityText << std::endl
-               << "\tMessage: " << message;
-    }
+    ASSERT(userParam != nullptr);
+    rx::RendererGL *renderer = static_cast<rx::RendererGL *>(const_cast<void *>(userParam));
+    renderer->onDebugMessage(source, type, id, severity, length, message);
 }
 
 namespace rx
@@ -199,7 +108,7 @@
                                         nullptr, GL_FALSE);
         mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION,
                                         0, nullptr, GL_FALSE);
-        mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr);
+        mFunctions->debugMessageCallback(&LogGLDebugMessage, this);
     }
 
     if (mWorkarounds.initializeCurrentVertexAttributes)
@@ -703,4 +612,27 @@
     return gl::NoError();
 }
 
+void RendererGL::onDebugMessage(GLenum source,
+                                GLenum type,
+                                GLuint id,
+                                GLenum severity,
+                                GLsizei length,
+                                const GLchar *message)
+{
+    constexpr size_t kMaxDebugMessagesPerNonErrorType = 5;
+    const std::string formattedMessage =
+        nativegl::FormatDebugMessage(source, type, id, severity, length, message);
+    if (type == GL_DEBUG_TYPE_ERROR)
+    {
+        ERR() << std::endl << formattedMessage;
+    }
+    else if (mDebugMessageCounts[id] < kMaxDebugMessagesPerNonErrorType)
+    {
+        // TODO(ynovikov): filter into WARN and INFO if INFO is ever implemented
+        WARN() << std::endl << formattedMessage;
+    }
+
+    mDebugMessageCounts[id]++;
+}
+
 }  // namespace rx