Commit 7c37ca18 by Geoff Lang Committed by Commit Bot

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: 's avatarCorentin Wallez <cwallez@chromium.org>
parent a75aa3b2
...@@ -65,100 +65,9 @@ static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, ...@@ -65,100 +65,9 @@ static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source,
const GLchar *message, const GLchar *message,
const void *userParam) const void *userParam)
{ {
std::string sourceText; ASSERT(userParam != nullptr);
switch (source) rx::RendererGL *renderer = static_cast<rx::RendererGL *>(const_cast<void *>(userParam));
{ renderer->onDebugMessage(source, type, id, severity, length, message);
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;
}
} }
namespace rx namespace rx
...@@ -199,7 +108,7 @@ RendererGL::RendererGL(std::unique_ptr<FunctionsGL> functions, const egl::Attrib ...@@ -199,7 +108,7 @@ RendererGL::RendererGL(std::unique_ptr<FunctionsGL> functions, const egl::Attrib
nullptr, GL_FALSE); nullptr, GL_FALSE);
mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, mFunctions->debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION,
0, nullptr, GL_FALSE); 0, nullptr, GL_FALSE);
mFunctions->debugMessageCallback(&LogGLDebugMessage, nullptr); mFunctions->debugMessageCallback(&LogGLDebugMessage, this);
} }
if (mWorkarounds.initializeCurrentVertexAttributes) if (mWorkarounds.initializeCurrentVertexAttributes)
...@@ -703,4 +612,27 @@ gl::Error RendererGL::memoryBarrierByRegion(GLbitfield barriers) ...@@ -703,4 +612,27 @@ gl::Error RendererGL::memoryBarrierByRegion(GLbitfield barriers)
return gl::NoError(); 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 } // namespace rx
...@@ -185,6 +185,13 @@ class RendererGL : angle::NonCopyable ...@@ -185,6 +185,13 @@ class RendererGL : angle::NonCopyable
gl::Error memoryBarrier(GLbitfield barriers); gl::Error memoryBarrier(GLbitfield barriers);
gl::Error memoryBarrierByRegion(GLbitfield barriers); gl::Error memoryBarrierByRegion(GLbitfield barriers);
void onDebugMessage(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar *message);
private: private:
void ensureCapsInitialized() const; void ensureCapsInitialized() const;
void generateCaps(gl::Caps *outCaps, void generateCaps(gl::Caps *outCaps,
...@@ -203,6 +210,7 @@ class RendererGL : angle::NonCopyable ...@@ -203,6 +210,7 @@ class RendererGL : angle::NonCopyable
WorkaroundsGL mWorkarounds; WorkaroundsGL mWorkarounds;
bool mUseDebugOutput; bool mUseDebugOutput;
std::map<GLuint, size_t> mDebugMessageCounts;
mutable bool mCapsInitialized; mutable bool mCapsInitialized;
mutable gl::Caps mNativeCaps; mutable gl::Caps mNativeCaps;
......
...@@ -1212,6 +1212,100 @@ void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds ...@@ -1212,6 +1212,100 @@ void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds
namespace nativegl namespace nativegl
{ {
std::string FormatDebugMessage(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar *message)
{
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;
}
std::ostringstream stream;
stream << "\tSource: " << sourceText << std::endl
<< "\tType: " << typeText << std::endl
<< "\tID: " << gl::Error(id) << std::endl
<< "\tSeverity: " << severityText << std::endl
<< "\tMessage: " << message;
return stream.str();
}
bool SupportsFenceSync(const FunctionsGL *functions) bool SupportsFenceSync(const FunctionsGL *functions)
{ {
return functions->isAtLeastGL(gl::Version(3, 2)) || functions->hasGLExtension("GL_ARB_sync") || return functions->isAtLeastGL(gl::Version(3, 2)) || functions->hasGLExtension("GL_ARB_sync") ||
......
...@@ -68,6 +68,12 @@ void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds ...@@ -68,6 +68,12 @@ void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds
namespace nativegl namespace nativegl
{ {
std::string FormatDebugMessage(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar *message);
bool SupportsFenceSync(const FunctionsGL *functions); bool SupportsFenceSync(const FunctionsGL *functions);
bool SupportsOcclusionQueries(const FunctionsGL *functions); bool SupportsOcclusionQueries(const FunctionsGL *functions);
bool SupportsNativeRendering(const FunctionsGL *functions, bool SupportsNativeRendering(const FunctionsGL *functions,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment