diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.cpp b/rpcs3/Emu/RSX/GL/GLHelpers.cpp index 709b07f2c9..557317748c 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.cpp +++ b/rpcs3/Emu/RSX/GL/GLHelpers.cpp @@ -52,33 +52,119 @@ namespace gl g_compute_tasks.clear(); } -#ifdef WIN32 - void APIENTRY dbgFunc(GLenum source, GLenum type, GLuint id, - GLenum severity, GLsizei lenght, const GLchar* message, - const void* userParam) + // https://www.khronos.org/opengl/wiki/Debug_Output + void APIENTRY log_debug(GLenum source, GLenum type, GLuint id, + GLenum severity, GLsizei length, const GLchar* message, + const void* user_param) { + // Message source + std::string str_source; + switch (source) + { + // Calls to the OpenGL API + case GL_DEBUG_SOURCE_API: + str_source = "API"; + break; + // Calls to a window-system API + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + str_source = "WINDOW_SYSTEM"; + break; + // A compiler for a shading language + case GL_DEBUG_SOURCE_SHADER_COMPILER: + str_source = "SHADER_COMPILER"; + break; + // An application associated with OpenGL + case GL_DEBUG_SOURCE_THIRD_PARTY: + str_source = "THIRD_PARTY"; + break; + // Generated by the user of this application + case GL_DEBUG_SOURCE_APPLICATION: + str_source = "APPLICATION"; + break; + // Some source that isn't one of these + case GL_DEBUG_SOURCE_OTHER: + str_source = "OTHER"; + break; + // Not on documentation + default: + str_source = "UNKNOWN"; + rsx_log.error("log_debug(source=%d): Unknown message source", source); + } + + // Message type + std::string str_type; switch (type) { + // An error, typically from the API case GL_DEBUG_TYPE_ERROR: - { - rsx_log.error("%s", message); - return; - } + str_type = "ERROR"; + break; + // Some behavior marked deprecated has been used + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + str_type = "DEPRECATED"; + break; + // Something has invoked undefined behavior + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + str_type = "UNDEFINED"; + break; + // Some functionality the user relies upon is not portable + case GL_DEBUG_TYPE_PORTABILITY: + str_type = "PORTABILITY"; + break; + // Code has triggered possible performance issues + case GL_DEBUG_TYPE_PERFORMANCE: + str_type = "PERFORMANCE"; + break; + // Command stream annotation + case GL_DEBUG_TYPE_MARKER: + str_type = "MARKER"; + break; + // Group pushing + case GL_DEBUG_TYPE_PUSH_GROUP: + str_type = "PUSH_GROUP"; + break; + // foo + case GL_DEBUG_TYPE_POP_GROUP: + str_type = "POP_GROUP"; + break; + // Some type that isn't one of these + case GL_DEBUG_TYPE_OTHER: + str_type = "OTHER"; + break; + // Not on documentation default: - { - rsx_log.warning("%s", message); + str_type = "UNKNOWN"; + rsx_log.error("log_debug(type=%d): Unknown message type", type); + } + + switch (severity) + { + // All OpenGL Errors, shader compilation/linking errors, or highly-dangerous undefined behavior + case GL_DEBUG_SEVERITY_HIGH: + // Major performance warnings, shader compilation/linking warnings, or the use of deprecated functionality + case GL_DEBUG_SEVERITY_MEDIUM: + rsx_log.error("[DEBUG_OUTPUT] [%s] [%s] [%d]: %s", str_source, str_type, id, message); return; - } - } + // Redundant state change performance warning, or unimportant undefined behavior + case GL_DEBUG_SEVERITY_LOW: + rsx_log.warning("[DEBUG_OUTPUT] [%s] [%s] [%d]: %s", str_source, str_type, id, message); + return; + // Anything that isn't an error or performance issue + case GL_DEBUG_SEVERITY_NOTIFICATION: + rsx_log.notice("[DEBUG_OUTPUT] [%s] [%s] [%d]: %s", str_source, str_type, id, message); + return; + // Not on documentation + default: + rsx_log.error("log_debug(severity=%d): Unknown severity level", severity); + rsx_log.error("[DEBUG_OUTPUT] [%s] [%s] [%d]: %s", str_source, str_type, id, message); + return; + } } -#endif void enable_debugging() { -#ifdef WIN32 - glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); - glDebugMessageCallback(static_cast(dbgFunc), nullptr); -#endif + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + glDebugMessageCallback(log_debug, nullptr); } capabilities &get_driver_caps() diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.h b/rpcs3/Emu/RSX/GL/GLHelpers.h index 235c7009d1..1f8ddfe253 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.h +++ b/rpcs3/Emu/RSX/GL/GLHelpers.h @@ -31,6 +31,11 @@ #define GL_INTERPRETER_FRAGMENT_BLOCK 7 #define GL_COMPUTE_BUFFER_SLOT(index) (index + 8) +// Noop keyword outside of Windows (used in log_debug) +#if !defined(_WIN32) && !defined(APIENTRY) +#define APIENTRY +#endif + inline static void _SelectTexture(int unit) { glActiveTexture(GL_TEXTURE0 + unit); } namespace gl