diff options
Diffstat (limited to 'source/blender/gpu/opengl')
-rw-r--r-- | source/blender/gpu/opengl/gl_context.cc | 7 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_debug.cc | 140 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_debug.hh | 31 |
3 files changed, 178 insertions, 0 deletions
diff --git a/source/blender/gpu/opengl/gl_context.cc b/source/blender/gpu/opengl/gl_context.cc index e89eeca1c8a..7d564004a01 100644 --- a/source/blender/gpu/opengl/gl_context.cc +++ b/source/blender/gpu/opengl/gl_context.cc @@ -25,12 +25,15 @@ #include "BLI_system.h" #include "BLI_utildefines.h" +#include "BKE_global.h" + #include "GPU_framebuffer.h" #include "GHOST_C-api.h" #include "gpu_context_private.hh" +#include "gl_debug.hh" #include "gl_immediate.hh" #include "gl_state.hh" @@ -47,6 +50,10 @@ using namespace blender::gpu; GLContext::GLContext(void *ghost_window, GLSharedOrphanLists &shared_orphan_list) : shared_orphan_list_(shared_orphan_list) { + if (G.debug & G_DEBUG_GPU) { + debug::init_gl_callbacks(); + } + float data[4] = {0.0f, 0.0f, 0.0f, 1.0f}; glGenBuffers(1, &default_attr_vbo_); glBindBuffer(GL_ARRAY_BUFFER, default_attr_vbo_); diff --git a/source/blender/gpu/opengl/gl_debug.cc b/source/blender/gpu/opengl/gl_debug.cc new file mode 100644 index 00000000000..1300cf4065e --- /dev/null +++ b/source/blender/gpu/opengl/gl_debug.cc @@ -0,0 +1,140 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup gpu + * + * Debug features of OpenGL. + */ + +#include "BLI_compiler_attrs.h" +#include "BLI_string.h" +#include "BLI_system.h" +#include "BLI_utildefines.h" + +#include "glew-mx.h" + +#include "gl_debug.hh" + +#include <stdio.h> + +namespace blender::gpu::debug { + +/* -------------------------------------------------------------------- */ +/** \name Debug Callbacks + * + * Hooks up debug callbacks to a debug OpenGL context using extensions or 4.3 core debug + * capabiliities. + * \{ */ + +/* Debug callbacks need the same calling convention as OpenGL functions. */ +#if defined(_WIN32) +# define APIENTRY __stdcall +#else +# define APIENTRY +#endif + +#define VERBOSE 1 + +static void APIENTRY debug_callback(GLenum UNUSED(source), + GLenum type, + GLuint UNUSED(id), + GLenum severity, + GLsizei UNUSED(length), + const GLchar *message, + const GLvoid *UNUSED(userParm)) +{ + const char format[] = "GPUDebug: %s%s\e[0m\n"; + + if (ELEM(severity, GL_DEBUG_SEVERITY_LOW, GL_DEBUG_SEVERITY_NOTIFICATION)) { + if (VERBOSE) { + fprintf(stderr, format, "\e[2m", message); + } + } + else { + switch (type) { + case GL_DEBUG_TYPE_ERROR: + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + fprintf(stderr, format, "\e[31;1mError\e[39m: ", 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, "\e[33;1mWarning\e[39m: ", message); + break; + } + + if (VERBOSE && severity == GL_DEBUG_SEVERITY_HIGH) { + /* Focus on error message. */ + fprintf(stderr, "\e[2m"); + BLI_system_backtrace(stderr); + fprintf(stderr, "\e[0m\n"); + fflush(stderr); + } + } +} + +#undef APIENTRY + +void init_gl_callbacks(void) +{ +#ifdef __APPLE__ + fprintf(stderr, "GPUDebug: OpenGL debug callback is not available on Apple\n"); + return; +#endif /* not Apple */ + + char msg[256] = ""; + const char format[] = "Successfully hooked OpenGL debug callback using %s"; + + if (GLEW_VERSION_4_3 || GLEW_KHR_debug) { + SNPRINTF(msg, format, GLEW_VERSION_4_3 ? "OpenGL 4.3" : "KHR_debug extension"); + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + glDebugMessageCallback((GLDEBUGPROC)debug_callback, NULL); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE); + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, + GL_DEBUG_TYPE_MARKER, + 0, + GL_DEBUG_SEVERITY_NOTIFICATION, + -1, + msg); + } + else if (GLEW_ARB_debug_output) { + SNPRINTF(msg, format, "ARB_debug_output"); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + glDebugMessageCallbackARB((GLDEBUGPROCARB)debug_callback, NULL); + glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE); + glDebugMessageInsertARB(GL_DEBUG_SOURCE_APPLICATION_ARB, + GL_DEBUG_TYPE_OTHER_ARB, + 0, + GL_DEBUG_SEVERITY_LOW_ARB, + -1, + msg); + } + else { + fprintf(stderr, "GPUDebug: Failed to hook OpenGL debug callback\n"); + } +} + +/** \} */ + +} // namespace blender::gpu::debug
\ No newline at end of file diff --git a/source/blender/gpu/opengl/gl_debug.hh b/source/blender/gpu/opengl/gl_debug.hh new file mode 100644 index 00000000000..44cd98b72f3 --- /dev/null +++ b/source/blender/gpu/opengl/gl_debug.hh @@ -0,0 +1,31 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup gpu + */ + +#pragma once + +namespace blender { +namespace gpu { +namespace debug { + +void init_gl_callbacks(void); + +} // namespace debug +} // namespace gpu +} // namespace blender |