Route render debug callback through platform services

This commit is contained in:
2026-06-03 05:30:54 +02:00
parent 87b1851d59
commit 8b12ae35d4
10 changed files with 117 additions and 82 deletions

View File

@@ -25,36 +25,6 @@ std::condition_variable App::render_cv;
namespace {
[[nodiscard]] GLenum debug_severity_notification() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_notification());
}
[[nodiscard]] GLenum debug_severity_low() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_low());
}
[[nodiscard]] GLenum debug_severity_medium() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_medium());
}
[[nodiscard]] GLenum debug_severity_high() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_high());
}
[[nodiscard]] GLenum debug_output_state() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_output_state());
}
[[nodiscard]] GLenum debug_output_synchronous_state() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_output_synchronous_state());
}
[[nodiscard]] GLenum version_string_name() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::version_string_name());
@@ -421,54 +391,13 @@ void App::upload(std::string filename, std::string name, std::function<void(floa
#endif //CURL
}
#ifdef _WIN32
static CONSOLE_SCREEN_BUFFER_INFO info;
void handle_gl_callback(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
{
static std::map<GLenum, int> colors = {
{ debug_severity_notification(), 8 },
{ debug_severity_low(), 8 },
{ debug_severity_medium(), FOREGROUND_GREEN | FOREGROUND_INTENSITY },
{ debug_severity_high(), FOREGROUND_RED | FOREGROUND_INTENSITY },
};
if (severity == debug_severity_high()
|| severity == debug_severity_medium()
|| severity == debug_severity_low())
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors[severity]);
LOG("OPENGL: %.*s", length, message);
FlushConsoleInputBuffer(GetStdHandle(STD_OUTPUT_HANDLE));
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), info.wAttributes);
#ifdef _DEBUG
if (severity == debug_severity_high())
__debugbreak();
#endif
}
}
#endif
void App::init()
{
#ifdef _WIN32
if (glDebugMessageCallback)
{
// colors: http://stackoverflow.com/questions/4053837/colorizing-text-in-the-console-with-c
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
render_task([]
{
glDebugMessageCallback(handle_gl_callback, nullptr);
glEnable(debug_output_state());
glEnable(debug_output_synchronous_state());
});
}
#endif
LOG("Screen Resolution: %dx%d", (int)width, (int)height);
render_task([]
{
App::I->install_render_debug_callback();
LOG("GL version: %s", glGetString(version_string_name()));
LOG("GL vendor: %s", glGetString(vendor_string_name()));
LOG("GL renderer: %s", glGetString(renderer_string_name()));

View File

@@ -199,6 +199,7 @@ public:
void bind_default_render_target();
void bind_main_render_target();
void apply_render_platform_hints();
void install_render_debug_callback();
void begin_render_capture_frame();
void end_render_capture_frame();
[[nodiscard]] bool platform_deletes_recorded_files_on_clear();

View File

@@ -252,6 +252,11 @@ void App::apply_render_platform_hints()
active_platform_services().apply_render_platform_hints();
}
void App::install_render_debug_callback()
{
active_platform_services().install_render_debug_callback();
}
void App::begin_render_capture_frame()
{
active_platform_services().begin_render_capture_frame();

View File

@@ -36,6 +36,7 @@ public:
virtual void bind_default_render_target() = 0;
virtual void bind_main_render_target() = 0;
virtual void apply_render_platform_hints() = 0;
virtual void install_render_debug_callback() = 0;
virtual void begin_render_capture_frame() = 0;
virtual void end_render_capture_frame() = 0;
[[nodiscard]] virtual bool deletes_recorded_files_on_clear() = 0;

View File

@@ -249,6 +249,10 @@ public:
#endif
}
void install_render_debug_callback() override
{
}
void begin_render_capture_frame() override
{
}

View File

@@ -1,9 +1,11 @@
#include "pch.h"
#include "platform_windows/windows_platform_services.h"
#include "log.h"
#include "renderer_gl/opengl_capabilities.h"
#include <deque>
#include <map>
extern HWND hWnd;
extern std::deque<std::packaged_task<void()>> main_tasklist;
@@ -20,6 +22,73 @@ void win32_update_stylus(float dt);
namespace {
static CONSOLE_SCREEN_BUFFER_INFO render_debug_console_info;
[[nodiscard]] GLenum debug_severity_notification() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_notification());
}
[[nodiscard]] GLenum debug_severity_low() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_low());
}
[[nodiscard]] GLenum debug_severity_medium() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_medium());
}
[[nodiscard]] GLenum debug_severity_high() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_severity_high());
}
[[nodiscard]] GLenum debug_output_state() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_output_state());
}
[[nodiscard]] GLenum debug_output_synchronous_state() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::debug_output_synchronous_state());
}
void handle_gl_callback(
GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar* message,
const void* userParam)
{
(void)source;
(void)type;
(void)id;
(void)userParam;
static std::map<GLenum, WORD> colors = {
{ debug_severity_notification(), static_cast<WORD>(8) },
{ debug_severity_low(), static_cast<WORD>(8) },
{ debug_severity_medium(), static_cast<WORD>(FOREGROUND_GREEN | FOREGROUND_INTENSITY) },
{ debug_severity_high(), static_cast<WORD>(FOREGROUND_RED | FOREGROUND_INTENSITY) },
};
if (severity == debug_severity_high()
|| severity == debug_severity_medium()
|| severity == debug_severity_low())
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors[severity]);
LOG("OPENGL: %.*s", length, message);
FlushConsoleInputBuffer(GetStdHandle(STD_OUTPUT_HANDLE));
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), render_debug_console_info.wAttributes);
#ifdef _DEBUG
if (severity == debug_severity_high())
__debugbreak();
#endif
}
}
void show_cursor(bool visible)
{
std::lock_guard<std::mutex> lock(main_task_mutex);
@@ -268,6 +337,18 @@ public:
glEnable(static_cast<GLenum>(pp::renderer::gl::line_smooth_state()));
}
void install_render_debug_callback() override
{
if (!glDebugMessageCallback)
return;
// colors: http://stackoverflow.com/questions/4053837/colorizing-text-in-the-console-with-c
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &render_debug_console_info);
glDebugMessageCallback(handle_gl_callback, nullptr);
glEnable(debug_output_state());
glEnable(debug_output_synchronous_state());
}
void begin_render_capture_frame() override
{
win32_renderdoc_frame_start();