Make OpenGL debug contexts a flag --debug-gpu instead of a compile time
authorAntony Riakiotakis <kalast@gmail.com>
Thu, 2 Jul 2015 17:30:08 +0000 (19:30 +0200)
committerAntony Riakiotakis <kalast@gmail.com>
Thu, 2 Jul 2015 17:30:17 +0000 (19:30 +0200)
option.

This makes sense, since contexts get created at runtime, there is little
reason to require recompilation for this.

Only works on linux currently, will be doing more OSs later

13 files changed:
CMakeLists.txt
intern/ghost/GHOST_Types.h
intern/ghost/intern/GHOST_ContextGLX.h
intern/ghost/intern/GHOST_SystemX11.cpp
intern/ghost/intern/GHOST_WindowX11.cpp
intern/ghost/intern/GHOST_WindowX11.h
source/blender/blenkernel/BKE_global.h
source/blender/gpu/GPU_debug.h
source/blender/gpu/intern/gpu_debug.c
source/blender/gpu/intern/gpu_init_exit.c
source/blender/gpu/intern/gpu_private.h
source/blender/windowmanager/intern/wm_window.c
source/creator/creator.c

index f710662ec63b4c68d83bc2c9a416e9bf92cb0c5a..8b14ec86a16d9def4b634996355bd1754b413919 100644 (file)
@@ -411,7 +411,6 @@ option(WITH_GL_EGL              "Use the EGL OpenGL system library instead of th
 option(WITH_GL_PROFILE_COMPAT   "Support using the OpenGL 'compatibility' profile. (deprecated)"                                                    ON )
 option(WITH_GL_PROFILE_CORE     "Support using the OpenGL 3.2+ 'core' profile."                                                                     OFF)
 option(WITH_GL_PROFILE_ES20     "Support using OpenGL ES 2.0. (thru either EGL or the AGL/WGL/XGL 'es20' profile)"                                  OFF)
-option(WITH_GPU_DEBUG           "Create a debug OpenGL context (allows inserting custom messages and getting notifications for bad GL use)"         OFF)
 
 mark_as_advanced(
        WITH_GLEW_MX
@@ -420,7 +419,6 @@ mark_as_advanced(
        WITH_GL_PROFILE_COMPAT
        WITH_GL_PROFILE_CORE
        WITH_GL_PROFILE_ES20
-       WITH_GPU_DEBUG
 )
 
 if(WITH_GL_PROFILE_COMPAT)
@@ -2351,10 +2349,6 @@ if(WITH_GL_EGL)
        list(APPEND GL_DEFINITIONS -DWITH_EGL)
 endif()
 
-if(WITH_GPU_DEBUG)
-       list(APPEND GL_DEFINITIONS -DWITH_GPU_DEBUG)
-endif()
-
 #-----------------------------------------------------------------------------
 # Configure OpenMP.
 if(WITH_OPENMP)
@@ -2862,7 +2856,6 @@ if(FIRST_RUN)
        info_cfg_option(WITH_GL_PROFILE_COMPAT)
        info_cfg_option(WITH_GL_PROFILE_CORE)
        info_cfg_option(WITH_GL_PROFILE_ES20)
-       info_cfg_option(WITH_GPU_DEBUG)
        if(WIN32)
                info_cfg_option(WITH_GL_ANGLE)
        endif()
index 752a45c7473202982473d0d19bdd3d37b3bf95bf..7a73af3f2490388ebfe7bf1e856be8a45abc25d9 100644 (file)
@@ -57,7 +57,8 @@ typedef struct {
 
 typedef enum {
        GHOST_glStereoVisual = (1 << 0),
-       GHOST_glWarnSupport  = (1 << 1)
+       GHOST_glWarnSupport  = (1 << 1),
+       GHOST_glDebugContext = (1 << 2),
 } GHOST_GLFlags;
 
 
index b33c0b5252a185583ccb3eddc49a39202714d711..04fe58a0e8234a06b7cf3b6c03b23e5e51304e9c 100644 (file)
@@ -46,11 +46,8 @@ extern "C" GLXEWContext *glxewContext;
 
 
 #ifndef GHOST_OPENGL_GLX_CONTEXT_FLAGS
-#  ifdef WITH_GPU_DEBUG
-#    define GHOST_OPENGL_GLX_CONTEXT_FLAGS GLX_CONTEXT_DEBUG_BIT_ARB
-#  else
-#    define GHOST_OPENGL_GLX_CONTEXT_FLAGS 0
-#  endif
+/* leave as convenience define for the future */
+#define GHOST_OPENGL_GLX_CONTEXT_FLAGS 0
 #endif
 
 #ifndef GHOST_OPENGL_GLX_RESET_NOTIFICATION_STRATEGY
index 45237391effe81028945d7f0a024501667ea43e2..325cba0c6312508d608124e1705e5712dcc7c18a 100644 (file)
@@ -306,7 +306,7 @@ createWindow(const STR_String& title,
                                     left, top, width, height,
                                     state, parentWindow, type,
                                     ((glSettings.flags & GHOST_glStereoVisual) != 0), exclusive,
-                                    glSettings.numOfAASamples);
+                                    glSettings.numOfAASamples, (glSettings.flags & GHOST_glDebugContext) != 0);
 
        if (window) {
                /* Both are now handle in GHOST_WindowX11.cpp
index bd0d6829e273c878836ff7bd92abc01894359f41..9c66900111ab18bf28cb66386fac502b569021bb 100644 (file)
@@ -272,8 +272,7 @@ static XVisualInfo *x11_visualinfo_from_glx(
 }
 
 GHOST_WindowX11::
-GHOST_WindowX11(
-        GHOST_SystemX11 *system,
+GHOST_WindowX11(GHOST_SystemX11 *system,
         Display *display,
         const STR_String &title,
         GHOST_TInt32 left,
@@ -285,7 +284,7 @@ GHOST_WindowX11(
         GHOST_TDrawingContextType type,
         const bool stereoVisual,
         const bool exclusive,
-        const GHOST_TUns16 numOfAASamples)
+        const GHOST_TUns16 numOfAASamples, const bool is_debug)
     : GHOST_Window(width, height, state, stereoVisual, exclusive, numOfAASamples),
       m_display(display),
       m_visualInfo(NULL),
@@ -301,7 +300,8 @@ GHOST_WindowX11(
 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
       m_xic(NULL),
 #endif
-      m_valid_setup(false)
+      m_valid_setup(false),
+      m_is_debug_context(is_debug)
 {
        if (type == GHOST_kDrawingContextTypeOpenGL) {
                m_visualInfo = x11_visualinfo_from_glx(m_display, stereoVisual, &m_wantNumOfAASamples);
@@ -1284,7 +1284,7 @@ GHOST_Context *GHOST_WindowX11::newDrawingContext(GHOST_TDrawingContextType type
                        m_visualInfo,
                        GLX_CONTEXT_OPENGL_CORE_PROFILE_BIT,
                        3, 2,
-                       GHOST_OPENGL_GLX_CONTEXT_FLAGS,
+                       GHOST_OPENGL_GLX_CONTEXT_FLAGS | (m_is_debug_context ? GLX_CONTEXT_DEBUG_BIT_ARB : 0),
                        GHOST_OPENGL_GLX_RESET_NOTIFICATION_STRATEGY);
 #elif defined(WITH_GL_PROFILE_ES20)
                GHOST_Context *context = new GHOST_ContextGLX(
@@ -1295,7 +1295,7 @@ GHOST_Context *GHOST_WindowX11::newDrawingContext(GHOST_TDrawingContextType type
                        m_visualInfo,
                        GLX_CONTEXT_ES2_PROFILE_BIT_EXT,
                        2, 0,
-                       GHOST_OPENGL_GLX_CONTEXT_FLAGS,
+                       GHOST_OPENGL_GLX_CONTEXT_FLAGS | (m_is_debug_context ? GLX_CONTEXT_DEBUG_BIT_ARB : 0),
                        GHOST_OPENGL_GLX_RESET_NOTIFICATION_STRATEGY);
 #elif defined(WITH_GL_PROFILE_COMPAT)
                GHOST_Context *context = new GHOST_ContextGLX(
@@ -1306,7 +1306,7 @@ GHOST_Context *GHOST_WindowX11::newDrawingContext(GHOST_TDrawingContextType type
                        m_visualInfo,
                        0, // profile bit
                        0, 0,
-                       GHOST_OPENGL_GLX_CONTEXT_FLAGS,
+                       GHOST_OPENGL_GLX_CONTEXT_FLAGS | (m_is_debug_context ? GLX_CONTEXT_DEBUG_BIT_ARB : 0),
                        GHOST_OPENGL_GLX_RESET_NOTIFICATION_STRATEGY);
 #else
 #  error
index 77287c1befcb5ab94ebd6e5466a4937554d104ae..5beb7b43032e08cea042ef64aaa9bfef5a8ac910 100644 (file)
@@ -88,7 +88,8 @@ public:
            GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
            const bool stereoVisual = false,
            const bool exclusive = false,
-           const GHOST_TUns16 numOfAASamples = 0
+           const GHOST_TUns16 numOfAASamples = 0,
+           const bool is_debug = false
            );
 
        bool
@@ -354,6 +355,7 @@ private:
 #endif
 
        bool m_valid_setup;
+       bool m_is_debug_context;
 
        void icccmSetState(int state);
        int icccmGetState() const;
index 7585dc23342256e7f6c321fd123dc5ba113e458f..8a3ffc66e356216b7ec45123c55c438acf1c12ff 100644 (file)
@@ -128,6 +128,7 @@ enum {
        G_DEBUG_SIMDATA =   (1 << 9), /* sim debug data display */
        G_DEBUG_GPU_MEM =   (1 << 10), /* gpu memory in status bar */
        G_DEBUG_DEPSGRAPH_NO_THREADS = (1 << 11),  /* sinle threaded depsgraph */
+       G_DEBUG_GPU =        (1 << 12), /* gpu debug */
 };
 
 #define G_DEBUG_ALL  (G_DEBUG | G_DEBUG_FFMPEG | G_DEBUG_PYTHON | G_DEBUG_EVENTS | G_DEBUG_WM | G_DEBUG_JOBS | \
index f89df2b54aa5b15df560b697f5f3634d962af973..2c1728bfff19cd583f09cc694aec130de338ee95 100644 (file)
@@ -49,9 +49,9 @@ const char *gpuErrorString(GLenum err);
 /* prints current OpenGL state */
 void GPU_state_print(void);
 
-void gpu_assert_no_gl_errors(const char *file, int line, const char *str);
+void GPU_assert_no_gl_errors(const char *file, int line, const char *str);
 
-#  define GPU_ASSERT_NO_GL_ERRORS(str) gpu_assert_no_gl_errors(__FILE__, __LINE__, (str))
+#  define GPU_ASSERT_NO_GL_ERRORS(str) GPU_assert_no_gl_errors(__FILE__, __LINE__, (str))
 
 #  define GPU_CHECK_ERRORS_AROUND(glProcCall)                      \
        (                                             \
@@ -61,14 +61,8 @@ void gpu_assert_no_gl_errors(const char *file, int line, const char *str);
        )
 
 
-#ifdef WITH_GPU_DEBUG
 /* inserts a debug marker message for the debug context messaging system */
-void gpu_string_marker(size_t size, const char *str);
-
-#  define GPU_STRING_MARKER(size, str) gpu_string_marker((size), (str))
-#else /* WITH_GPU_DEBUG */
-#  define GPU_STRING_MARKER(len, str)  ((void)(size),(void)(str))
-#endif /* WITH_GPU_DEBUG */
+void GPU_string_marker(size_t size, const char *str);
 
 #ifdef __cplusplus
 }
index d06c154be5bd0a9399d4109f9e0d5364db9e4f0f..3066467517a79821e3596aabebc1d6d664899dfc 100644 (file)
@@ -153,8 +153,6 @@ const char* gpuErrorString(GLenum err)
 }
 
 
-#ifdef WITH_GPU_DEBUG
-
 /* Debug callbacks need the same calling convention as OpenGL functions.
  */
 #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
@@ -191,10 +189,10 @@ void gpu_debug_init(void)
 
 #if !defined(WITH_GLEW_ES) && !defined(GLEW_ES_ONLY)
        if (GLEW_VERSION_4_3) {
-               //glEnable(GL_DEBUG_OUTPUT);
+               glEnable(GL_DEBUG_OUTPUT);
                glDebugMessageCallback(gpu_debug_proc, mxGetCurrentContext());
                glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
-               GPU_STRING_MARKER(sizeof(success), success);
+               GPU_string_marker(sizeof(success), success);
                return;
        }
 #endif
@@ -203,7 +201,7 @@ void gpu_debug_init(void)
 #ifndef GLEW_ES_ONLY
                        glDebugMessageCallback(gpu_debug_proc, mxGetCurrentContext());
                        glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
-                       GPU_STRING_MARKER(sizeof(success), success);
+                       GPU_string_marker(sizeof(success), success);
 #endif
                return;
        }
@@ -212,7 +210,7 @@ void gpu_debug_init(void)
        if (GLEW_ARB_debug_output) {
                glDebugMessageCallbackARB(gpu_debug_proc, mxGetCurrentContext());
                glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
-               GPU_STRING_MARKER(sizeof(success), success);
+               GPU_string_marker(sizeof(success), success);
 
                return;
        }
@@ -220,7 +218,7 @@ void gpu_debug_init(void)
        if (GLEW_AMD_debug_output) {
                glDebugMessageCallbackAMD(gpu_debug_proc_amd, mxGetCurrentContext());
                glDebugMessageEnableAMD(GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
-               GPU_STRING_MARKER(sizeof(success), success);
+               GPU_string_marker(sizeof(success), success);
 
                return;
        }
@@ -268,7 +266,7 @@ void gpu_debug_exit(void)
        return;
 }
 
-void gpu_string_marker(size_t length, const char *buf)
+void GPU_string_marker(size_t length, const char *buf)
 {
 #ifndef WITH_GLEW_ES
 #ifndef GLEW_ES_ONLY
@@ -310,8 +308,6 @@ void gpu_string_marker(size_t length, const char *buf)
        return;
 }
 
-#endif /* WITH_GPU_DEBUG */
-
 void GPU_print_error_debug(const char *str)
 {
        if (G.debug & G_DEBUG)
@@ -319,7 +315,7 @@ void GPU_print_error_debug(const char *str)
 }
 
 
-void gpu_assert_no_gl_errors(const char* file, int line, const char* str)
+void GPU_assert_no_gl_errors(const char* file, int line, const char* str)
 {
        if (G.debug) {
                GLboolean gl_ok = gpu_report_gl_errors(file, line, str);
index a93c1a21130d5ec382f0b58c33027432363fcb5c..aefddc774be20a3737610a30c8ee2fa480a993b4 100644 (file)
@@ -32,6 +32,8 @@
 #include "BLI_sys_types.h"
 #include "GPU_init_exit.h"  /* interface */
 
+#include "BKE_global.h"
+
 #include "intern/gpu_codegen.h"
 #include "intern/gpu_private.h"
 
@@ -54,14 +56,17 @@ void GPU_init(void)
 
        gpu_codegen_init();
 
-       GPU_DEBUG_INIT();
+       if (G.debug & G_DEBUG_GPU)
+               gpu_debug_init();
+
 }
 
 
 
 void GPU_exit(void)
 {
-       GPU_DEBUG_EXIT();
+       if (G.debug & G_DEBUG_GPU)
+               gpu_debug_exit();
        gpu_codegen_exit();
 
        gpu_extensions_exit(); /* must come last */
index 188a2d16abc29e7831218fb6fc83281369d2eb74..72627e3563e3be98f6e1d8e44ea610a8a97667c3 100644 (file)
 void gpu_extensions_init(void);
 void gpu_extensions_exit(void);
 
-
 /* gpu_debug.c */
-#ifdef WITH_GPU_DEBUG
-
 void gpu_debug_init(void);
 void gpu_debug_exit(void);
 
-#  define GPU_DEBUG_INIT() gpu_debug_init()
-#  define GPU_DEBUG_EXIT() gpu_debug_exit()
-
-#else
-
-#  define GPU_DEBUG_INIT() ((void)0)
-#  define GPU_DEBUG_EXIT() ((void)0)
-
-#endif
-
 #endif  /* __GPU_PRIVATE_H__ */
index d11d88db147d39b5215f45033123156ab021daa1..5f4869d3386b3cd71c06d845e7bc73196f39d01b 100644 (file)
@@ -400,6 +400,10 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, const char *title, wm
        if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP)
                glSettings.flags |= GHOST_glStereoVisual;
 
+       if (G.debug & G_DEBUG_GPU) {
+               glSettings.flags |= GHOST_glDebugContext;
+       }
+
        if (!(U.uiflag2 & USER_OPENGL_NO_WARN_SUPPORT))
                glSettings.flags |= GHOST_glWarnSupport;
 
index b78914aa9893b5d5e4b08f5c3fd89b1bdd450257..33a62c8ce6f6b67a073f2e7b1b5689c78cf18ecf 100644 (file)
@@ -1549,6 +1549,7 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
 
        BLI_argsAdd(ba, 1, NULL, "--debug-value", "<value>\n\tSet debug value of <value> on startup\n", set_debug_value, NULL);
        BLI_argsAdd(ba, 1, NULL, "--debug-jobs",  "\n\tEnable time profiling for background jobs.", debug_mode_generic, (void *)G_DEBUG_JOBS);
+       BLI_argsAdd(ba, 1, NULL, "--debug-gpu",  "\n\tEnable gpu debug context and information for OpenGL 4.3+.", debug_mode_generic, (void *)G_DEBUG_GPU);
        BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph", "\n\tEnable debug messages from dependency graph", debug_mode_generic, (void *)G_DEBUG_DEPSGRAPH);
        BLI_argsAdd(ba, 1, NULL, "--debug-depsgraph-no-threads", "\n\tSwitch dependency graph to a single threaded evlauation", debug_mode_generic, (void *)G_DEBUG_DEPSGRAPH_NO_THREADS);
        BLI_argsAdd(ba, 1, NULL, "--debug-gpumem", "\n\tEnable GPU memory stats in status bar", debug_mode_generic, (void *)G_DEBUG_GPU_MEM);