diff options
-rw-r--r-- | source/blender/draw/intern/draw_manager_profiling.c | 7 | ||||
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/gpu/GPU_debug.h | 38 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_context_private.hh | 6 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_debug.cc | 91 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_debug_private.hh | 38 |
6 files changed, 182 insertions, 0 deletions
diff --git a/source/blender/draw/intern/draw_manager_profiling.c b/source/blender/draw/intern/draw_manager_profiling.c index f8587555480..98a6b2bff00 100644 --- a/source/blender/draw/intern/draw_manager_profiling.c +++ b/source/blender/draw/intern/draw_manager_profiling.c @@ -32,6 +32,7 @@ #include "draw_manager.h" +#include "GPU_debug.h" #include "GPU_texture.h" #include "UI_resources.h" @@ -133,10 +134,13 @@ static void drw_stats_timer_start_ex(const char *name, const bool is_query) void DRW_stats_group_start(const char *name) { drw_stats_timer_start_ex(name, false); + + GPU_debug_group_begin(name); } void DRW_stats_group_end(void) { + GPU_debug_group_end(); if (DTP.is_recording) { BLI_assert(!DTP.is_querying); DTP.end_increment++; @@ -146,11 +150,14 @@ void DRW_stats_group_end(void) /* NOTE: Only call this when no sub timer will be called. */ void DRW_stats_query_start(const char *name) { + GPU_debug_group_begin(name); + drw_stats_timer_start_ex(name, false); drw_stats_timer_start_ex(name, true); } void DRW_stats_query_end(void) { + GPU_debug_group_end(); if (DTP.is_recording) { DTP.end_increment++; BLI_assert(DTP.is_querying); diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index b7ffa59538a..b763ea2a528 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -62,6 +62,7 @@ set(SRC intern/gpu_capabilities.cc intern/gpu_codegen.c intern/gpu_context.cc + intern/gpu_debug.cc intern/gpu_drawlist.cc intern/gpu_framebuffer.cc intern/gpu_immediate.cc @@ -112,6 +113,7 @@ set(SRC GPU_capabilities.h GPU_common.h GPU_context.h + GPU_debug.h GPU_drawlist.h GPU_framebuffer.h GPU_immediate.h diff --git a/source/blender/gpu/GPU_debug.h b/source/blender/gpu/GPU_debug.h new file mode 100644 index 00000000000..a219222b759 --- /dev/null +++ b/source/blender/gpu/GPU_debug.h @@ -0,0 +1,38 @@ +/* + * 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) 2020 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup gpu + * + * Helpers for GPU / drawing debugging. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void GPU_debug_group_begin(const char *name); +void GPU_debug_group_end(void); +void GPU_debug_get_groups_names(int name_buf_len, char *r_name_buf); + +#ifdef __cplusplus +} +#endif
\ No newline at end of file diff --git a/source/blender/gpu/intern/gpu_context_private.hh b/source/blender/gpu/intern/gpu_context_private.hh index 38f94b8dde9..bf34f20afe4 100644 --- a/source/blender/gpu/intern/gpu_context_private.hh +++ b/source/blender/gpu/intern/gpu_context_private.hh @@ -29,6 +29,7 @@ #include "GPU_context.h" +#include "gpu_debug_private.hh" #include "gpu_framebuffer_private.hh" #include "gpu_immediate_private.hh" #include "gpu_shader_private.hh" @@ -61,6 +62,8 @@ class Context { FrameBuffer *back_right = NULL; FrameBuffer *front_right = NULL; + DebugStack debug_stack; + protected: /** Thread on which this context is active. */ pthread_t thread_; @@ -84,6 +87,9 @@ class Context { virtual void memory_statistics_get(int *total_mem, int *free_mem) = 0; + virtual void debug_group_begin(const char *, int){}; + virtual void debug_group_end(void){}; + bool is_active_on_thread(void); }; diff --git a/source/blender/gpu/intern/gpu_debug.cc b/source/blender/gpu/intern/gpu_debug.cc new file mode 100644 index 00000000000..2c9b58f0f96 --- /dev/null +++ b/source/blender/gpu/intern/gpu_debug.cc @@ -0,0 +1,91 @@ +/* + * 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) 2020 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup gpu + * + * Debug features of OpenGL. + */ + +#include "BKE_global.h" + +#include "BLI_string.h" + +#include "gpu_context_private.hh" + +#include "GPU_debug.h" + +using namespace blender::gpu; + +void GPU_debug_group_begin(const char *name) +{ + if (!(G.debug & G_DEBUG_GPU)) { + return; + } + + DebugStack &stack = Context::get()->debug_stack; + + if (stack.index >= DEBUG_STACK_LEN) { + stack.index = DEBUG_STACK_LEN - 1; + BLI_assert(!"GPUDebug: Debug group stack overflow!"); + } + + BLI_strncpy(stack.names[stack.index++], name, sizeof(stack.names[stack.index++])); + + Context::get()->debug_group_begin(name, stack.index); +} + +void GPU_debug_group_end(void) +{ + if (!(G.debug & G_DEBUG_GPU)) { + return; + } + + DebugStack &stack = Context::get()->debug_stack; + + if (stack.index < 0) { + stack.index = 0; + BLI_assert(!"GPUDebug: Debug group stack underflow!"); + } + + stack.index--; + + Context::get()->debug_group_end(); +} + +/* Return a formated string showing the current group hierarchy in this format: + * "Group1 > Group 2 > Group3 > ... > GroupN : " */ +void GPU_debug_get_groups_names(int name_buf_len, char *r_name_buf) +{ + Context *ctx = Context::get(); + if (ctx == nullptr) { + return; + } + + DebugStack &stack = ctx->debug_stack; + if (stack.index == 0) { + r_name_buf[0] = '\0'; + return; + } + size_t sz = 0; + for (int i = 0; i < stack.index; i++) { + sz += BLI_snprintf_rlen(r_name_buf + sz, name_buf_len - sz, "%s > ", stack.names[0]); + } + r_name_buf[sz - 2] = ':'; +}
\ No newline at end of file diff --git a/source/blender/gpu/intern/gpu_debug_private.hh b/source/blender/gpu/intern/gpu_debug_private.hh new file mode 100644 index 00000000000..7432b02541e --- /dev/null +++ b/source/blender/gpu/intern/gpu_debug_private.hh @@ -0,0 +1,38 @@ +/* + * 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) 2016 by Mike Erwin. + * All rights reserved. + */ + +/** \file + * \ingroup gpu + * + * This interface allow GPU to manage GL objects for multiple context and threads. + */ + +#pragma once + +namespace blender::gpu { + +#define DEBUG_STACK_LEN 64 +#define DEBUG_STACK_NAME_LEN 128 + +struct DebugStack { + char names[DEBUG_STACK_LEN][DEBUG_STACK_NAME_LEN]; + int index = 0; +}; + +} // namespace blender::gpu
\ No newline at end of file |