#include "main-impl.hpp" #include namespace floormat { using Severity = GL::DebugOutput::Severity; // NOLINTNEXTLINE(readability-convert-member-functions-to-static) void main_impl::debug_callback(unsigned src, unsigned type, unsigned id, unsigned severity, StringView str) const { static thread_local auto clock = std::chrono::steady_clock{}; static const auto t0 = clock.now(); #if 1 [[maybe_unused]] volatile auto _type = type; [[maybe_unused]] volatile auto _id = id; [[maybe_unused]] volatile auto _src = src; [[maybe_unused]] volatile auto _severity = severity; [[maybe_unused]] volatile const char* _str = str.data(); #endif (void)src; (void)type; const char* p = str.data(); if (str.hasPrefix("Buffer detailed info: "_s)) p += sizeof("Buffer detailed info: ") - 1; using seconds = std::chrono::duration; const auto t = std::chrono::duration_cast(clock.now() - t0).count(); printf("[%10.03f] ", t); switch (Severity{severity}) { using enum GL::DebugOutput::Severity; case Notification: std::fputs("DEBUG ", stdout); break; case Low: std::fputs("INFO ", stdout); break; case Medium: std::fputs("NOTICE ", stdout); break; case High: std::fputs("ERROR ", stdout); break; default: std::fputs("????? ", stdout); break; } printf("%6u ", id); std::puts(p); std::fflush(stdout); std::fputs("", stdout); // put breakpoint here #if 0 if (severity != Severity::Notification) std::abort(); #endif std::fputs("", stdout); // put breakpoint here } static void _debug_callback(GL::DebugOutput::Source src, GL::DebugOutput::Type type, UnsignedInt id, GL::DebugOutput::Severity severity, StringView str, const void* self) { static_cast(self)->debug_callback((unsigned)src, (unsigned)type, (unsigned)id, (unsigned)severity, str); } void main_impl::register_debug_callback() { GL::DebugOutput::setEnabled(GL::DebugOutput::Source::Api, GL::DebugOutput::Type::Other, {131185}, false); // nvidia krap GL::DebugOutput::setCallback(_debug_callback, this); } char main_impl::maybe_register_debug_callback(fm_gpu_debug flag) { using enum fm_gpu_debug; switch (flag) { default: register_debug_callback(); break; case off: case no_error: break; } return '\0'; } } // namespace floormat