[Bf-blender-cvs] [ac63afca7d4] master: GL: Make use of the new debug layer

Clément Foucault noreply at git.blender.org
Mon Sep 14 17:31:07 CEST 2020


Commit: ac63afca7d4564d21577e5a97b692cee71897089
Author: Clément Foucault
Date:   Mon Sep 14 17:29:28 2020 +0200
Branches: master
https://developer.blender.org/rBac63afca7d4564d21577e5a97b692cee71897089

GL: Make use of the new debug layer

This makes replay analysis inside renderdoc much easier by using the new
debug group functionality.

===================================================================

M	source/blender/gpu/opengl/gl_context.hh
M	source/blender/gpu/opengl/gl_debug.cc

===================================================================

diff --git a/source/blender/gpu/opengl/gl_context.hh b/source/blender/gpu/opengl/gl_context.hh
index 4d9c2470db0..5cebc2a3f3e 100644
--- a/source/blender/gpu/opengl/gl_context.hh
+++ b/source/blender/gpu/opengl/gl_context.hh
@@ -135,6 +135,9 @@ class GLContext : public Context {
   void vao_cache_register(GLVaoCache *cache);
   void vao_cache_unregister(GLVaoCache *cache);
 
+  void debug_group_begin(const char *name, int index);
+  void debug_group_end(void);
+
  private:
   static void orphans_add(Vector<GLuint> &orphan_list, std::mutex &list_mutex, GLuint id);
   void orphans_clear(void);
diff --git a/source/blender/gpu/opengl/gl_debug.cc b/source/blender/gpu/opengl/gl_debug.cc
index 747d8ee2e3e..67d4311750d 100644
--- a/source/blender/gpu/opengl/gl_debug.cc
+++ b/source/blender/gpu/opengl/gl_debug.cc
@@ -30,6 +30,7 @@
 
 #include "BKE_global.h"
 
+#include "GPU_debug.h"
 #include "GPU_platform.h"
 
 #include "glew-mx.h"
@@ -70,7 +71,11 @@ static void APIENTRY debug_callback(GLenum UNUSED(source),
                                     const GLchar *message,
                                     const GLvoid *UNUSED(userParm))
 {
-  const char format[] = "GPUDebug: %s%s\033[0m\n";
+  if (ELEM(type, GL_DEBUG_TYPE_PUSH_GROUP, GL_DEBUG_TYPE_POP_GROUP)) {
+    /* The debug layer will emit a message each time a debug group is pushed or popped.
+     * We use that for easy command grouping inside frame analyser tools. */
+    return;
+  }
 
   if (TRIM_NVIDIA_BUFFER_INFO &&
       GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_OFFICIAL) &&
@@ -79,24 +84,29 @@ static void APIENTRY debug_callback(GLenum UNUSED(source),
     return;
   }
 
+  const char format[] = "GPUDebug: %s%s%s\033[0m\n";
+
   if (ELEM(severity, GL_DEBUG_SEVERITY_LOW, GL_DEBUG_SEVERITY_NOTIFICATION)) {
     if (VERBOSE) {
-      fprintf(stderr, format, "\033[2m", message);
+      fprintf(stderr, format, "\033[2m", "", message);
     }
   }
   else {
+    char debug_groups[512] = "";
+    GPU_debug_get_groups_names(sizeof(debug_groups), debug_groups);
+
     switch (type) {
       case GL_DEBUG_TYPE_ERROR:
       case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
       case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
-        fprintf(stderr, format, "\033[31;1mError\033[39m: ", message);
+        fprintf(stderr, format, "\033[31;1mError\033[39m: ", debug_groups, message);
         break;
       case GL_DEBUG_TYPE_PORTABILITY:
       case GL_DEBUG_TYPE_PERFORMANCE:
       case GL_DEBUG_TYPE_OTHER:
       case GL_DEBUG_TYPE_MARKER: /* KHR has this, ARB does not */
       default:
-        fprintf(stderr, format, "\033[33;1mWarning\033[39m: ", message);
+        fprintf(stderr, format, "\033[33;1mWarning\033[39m: ", debug_groups, message);
         break;
     }
 
@@ -321,3 +331,31 @@ void object_label(GLenum type, GLuint object, const char *name)
 /** \} */
 
 }  // namespace blender::gpu::debug
+
+namespace blender::gpu {
+
+/* -------------------------------------------------------------------- */
+/** \name Debug Groups
+ *
+ * Useful for debugging through render-doc. This makes all the API calls grouped into "passes".
+ * \{ */
+
+void GLContext::debug_group_begin(const char *name, int index)
+{
+  if ((G.debug & G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
+    /* Add 10 to avoid conlision with other indices from other possible callback layers. */
+    index += 10;
+    glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, index, -1, name);
+  }
+}
+
+void GLContext::debug_group_end(void)
+{
+  if ((G.debug & G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
+    glPopDebugGroup();
+  }
+}
+
+/** \} */
+
+}  // namespace blender::gpu



More information about the Bf-blender-cvs mailing list