Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/intern/draw_manager_profiling.c7
-rw-r--r--source/blender/gpu/CMakeLists.txt2
-rw-r--r--source/blender/gpu/GPU_debug.h38
-rw-r--r--source/blender/gpu/intern/gpu_context_private.hh6
-rw-r--r--source/blender/gpu/intern/gpu_debug.cc91
-rw-r--r--source/blender/gpu/intern/gpu_debug_private.hh38
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