Route render debug callback through platform services
This commit is contained in:
73
src/app.cpp
73
src/app.cpp
@@ -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()));
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -249,6 +249,10 @@ public:
|
||||
#endif
|
||||
}
|
||||
|
||||
void install_render_debug_callback() override
|
||||
{
|
||||
}
|
||||
|
||||
void begin_render_capture_frame() override
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user