Explorar el Código

OpenGL: Log GL_KHR_debug messages we receive

This allows the driver to communicate errors, warnings and improvement
suggestions about our usage of the API.
Emmanuel Gil Peyrot hace 10 años
padre
commit
53df67376d
Se han modificado 1 ficheros con 57 adiciones y 0 borrados
  1. 57 0
      src/video_core/renderer_opengl/renderer_opengl.cpp

+ 57 - 0
src/video_core/renderer_opengl/renderer_opengl.cpp

@@ -369,6 +369,58 @@ void RendererOpenGL::SetWindow(EmuWindow* window) {
     render_window = window;
 }
 
+static const char* GetSource(GLenum source) {
+#define RET(s) case GL_DEBUG_SOURCE_##s: return #s
+    switch (source) {
+    RET(API);
+    RET(WINDOW_SYSTEM);
+    RET(SHADER_COMPILER);
+    RET(THIRD_PARTY);
+    RET(APPLICATION);
+    RET(OTHER);
+    default:
+        UNREACHABLE();
+    }
+#undef RET
+}
+
+static const char* GetType(GLenum type) {
+#define RET(t) case GL_DEBUG_TYPE_##t: return #t
+    switch (type) {
+    RET(ERROR);
+    RET(DEPRECATED_BEHAVIOR);
+    RET(UNDEFINED_BEHAVIOR);
+    RET(PORTABILITY);
+    RET(PERFORMANCE);
+    RET(OTHER);
+    RET(MARKER);
+    default:
+        UNREACHABLE();
+    }
+#undef RET
+}
+
+static void DebugHandler(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
+                         const GLchar* message, const void* user_param) {
+    Log::Level level;
+    switch (severity) {
+    case GL_DEBUG_SEVERITY_HIGH:
+        level = Log::Level::Error;
+        break;
+    case GL_DEBUG_SEVERITY_MEDIUM:
+        level = Log::Level::Warning;
+        break;
+    case GL_DEBUG_SEVERITY_NOTIFICATION:
+        level = Log::Level::Info;
+        break;
+    case GL_DEBUG_SEVERITY_LOW:
+        level = Log::Level::Debug;
+        break;
+    }
+    LOG_GENERIC(Log::Class::Render_OpenGL, level, "%s %s %d: %s",
+                GetSource(source), GetType(type), id, message);
+}
+
 /// Initialize the renderer
 void RendererOpenGL::Init() {
     render_window->MakeCurrent();
@@ -379,6 +431,11 @@ void RendererOpenGL::Init() {
         exit(-1);
     }
 
+    if (GLAD_GL_KHR_debug) {
+        glEnable(GL_DEBUG_OUTPUT);
+        glDebugMessageCallback(DebugHandler, nullptr);
+    }
+
     LOG_INFO(Render_OpenGL, "GL_VERSION: %s", glGetString(GL_VERSION));
     LOG_INFO(Render_OpenGL, "GL_VENDOR: %s", glGetString(GL_VENDOR));
     LOG_INFO(Render_OpenGL, "GL_RENDERER: %s", glGetString(GL_RENDERER));