From 0f48f9bf21ffb27fb74e6779c8f3702f8be300f6 Mon Sep 17 00:00:00 2001 From: assiduous Date: Sun, 10 May 2020 21:06:57 -0700 Subject: OpenGL backend: enabled debug output on Android --- .../GraphicsEngineOpenGL/include/GLStubsAndroid.h | 98 ++++++++++++++++++++++ .../GraphicsEngineOpenGL/src/GLContextAndroid.cpp | 64 ++++++++++++++ .../GraphicsEngineOpenGL/src/GLContextLinux.cpp | 14 ++-- .../GraphicsEngineOpenGL/src/GLContextWindows.cpp | 14 ++-- .../GraphicsEngineOpenGL/src/GLStubsAndroid.cpp | 7 ++ 5 files changed, 183 insertions(+), 14 deletions(-) (limited to 'Graphics/GraphicsEngineOpenGL') diff --git a/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h b/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h index ad74a146..7cd6f0e2 100644 --- a/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h +++ b/Graphics/GraphicsEngineOpenGL/include/GLStubsAndroid.h @@ -922,6 +922,94 @@ extern PFNGLMEMORYBARRIERPROC glMemoryBarrier; #endif +/* ------------------------------ GL_KHR_debug ----------------------------- */ + +#ifndef GL_DEBUG_OUTPUT_SYNCHRONOUS +# define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#endif + +#ifndef GL_DEBUG_SOURCE_API +# define GL_DEBUG_SOURCE_API 0x8246 +#endif + +#ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM +# define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#endif + +#ifndef GL_DEBUG_SOURCE_SHADER_COMPILER +# define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#endif + +#ifndef GL_DEBUG_SOURCE_THIRD_PARTY +# define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#endif + +#ifndef GL_DEBUG_SOURCE_APPLICATION +# define GL_DEBUG_SOURCE_APPLICATION 0x824A +#endif + +#ifndef GL_DEBUG_SOURCE_OTHER +# define GL_DEBUG_SOURCE_OTHER 0x824B +#endif + + + +#ifndef GL_DEBUG_TYPE_ERROR +# define GL_DEBUG_TYPE_ERROR 0x824C +#endif + +#ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR +# define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#endif + +#ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR +# define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#endif + +#ifndef GL_DEBUG_TYPE_PORTABILITY +# define GL_DEBUG_TYPE_PORTABILITY 0x824F +#endif + +#ifndef GL_DEBUG_TYPE_PERFORMANCE +# define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#endif + +#ifndef GL_DEBUG_TYPE_MARKER +# define GL_DEBUG_TYPE_MARKER 0x8268 +#endif + +#ifndef GL_DEBUG_TYPE_PUSH_GROUP +# define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#endif + +#ifndef GL_DEBUG_TYPE_POP_GROUP +# define GL_DEBUG_TYPE_POP_GROUP 0x826A +#endif + +#ifndef GL_DEBUG_TYPE_OTHER +# define GL_DEBUG_TYPE_OTHER 0x8251 +#endif + + + +#ifndef GL_DEBUG_SEVERITY_HIGH +# define GL_DEBUG_SEVERITY_HIGH 0x9146 +#endif + +#ifndef GL_DEBUG_SEVERITY_MEDIUM +# define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#endif + +#ifndef GL_DEBUG_SEVERITY_LOW +# define GL_DEBUG_SEVERITY_LOW 0x9148 +#endif + +#ifndef GL_DEBUG_SEVERITY_NOTIFICATION +# define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#endif + + + // Define unsupported GL function stubs template void UnsupportedGLFunctionStub( const T &Name ) @@ -1085,4 +1173,14 @@ extern PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstanc typedef void (GL_APIENTRY* PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); extern PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex; +#ifndef GL_ES_VERSION_3_2 + + typedef void (GL_APIENTRY* GLDEBUGPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + + #define LOAD_DEBUG_MESSAGE_CALLBACK + typedef void (GL_APIENTRY* PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); + extern PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; + +#endif + void LoadGLFunctions(); diff --git a/Graphics/GraphicsEngineOpenGL/src/GLContextAndroid.cpp b/Graphics/GraphicsEngineOpenGL/src/GLContextAndroid.cpp index 3a7e9003..b7f2e0b2 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLContextAndroid.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLContextAndroid.cpp @@ -37,6 +37,62 @@ namespace Diligent { +static void openglCallbackFunction(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) +{ + std::stringstream MessageSS; + + MessageSS << "OpenGL debug message " << id << " ("; + switch (source) + { + // clang-format off + case GL_DEBUG_SOURCE_API: MessageSS << "Source: API."; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: MessageSS << "Source: Window System."; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: MessageSS << "Source: Shader Compiler."; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: MessageSS << "Source: Third Party."; break; + case GL_DEBUG_SOURCE_APPLICATION: MessageSS << "Source: Application."; break; + case GL_DEBUG_SOURCE_OTHER: MessageSS << "Source: Other."; break; + default: MessageSS << "Source: Unknown (" << source << ")."; + // clang-format on + } + + switch (type) + { + // clang-format off + case GL_DEBUG_TYPE_ERROR: MessageSS << " Type: ERROR."; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: MessageSS << " Type: Deprecated Behaviour."; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: MessageSS << " Type: UNDEFINED BEHAVIOUR."; break; + case GL_DEBUG_TYPE_PORTABILITY: MessageSS << " Type: Portability."; break; + case GL_DEBUG_TYPE_PERFORMANCE: MessageSS << " Type: PERFORMANCE."; break; + case GL_DEBUG_TYPE_MARKER: MessageSS << " Type: Marker."; break; + case GL_DEBUG_TYPE_PUSH_GROUP: MessageSS << " Type: Push Group."; break; + case GL_DEBUG_TYPE_POP_GROUP: MessageSS << " Type: Pop Group."; break; + case GL_DEBUG_TYPE_OTHER: MessageSS << " Type: Other."; break; + default: MessageSS << " Type: Unknown (" << type << ")."; + // clang-format on + } + + switch (severity) + { + // clang-format off + case GL_DEBUG_SEVERITY_HIGH: MessageSS << " Severity: HIGH"; break; + case GL_DEBUG_SEVERITY_MEDIUM: MessageSS << " Severity: Medium"; break; + case GL_DEBUG_SEVERITY_LOW: MessageSS << " Severity: Low"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: MessageSS << " Severity: Notification"; break; + default: MessageSS << " Severity: Unknown (" << severity << ")"; break; + // clang-format on + } + + MessageSS << "): " << message; + + LOG_INFO_MESSAGE(MessageSS.str().c_str()); +} + bool GLContext::InitEGLSurface() { display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY); @@ -226,6 +282,14 @@ bool GLContext::Init(ANativeWindow* window) } InitGLES(); + if (glDebugMessageCallback) + { + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + glDebugMessageCallback(openglCallbackFunction, nullptr); + if (glGetError() != GL_NO_ERROR) + LOG_ERROR_MESSAGE("Failed to enable debug messages"); + } + egl_context_initialized_ = true; return true; diff --git a/Graphics/GraphicsEngineOpenGL/src/GLContextLinux.cpp b/Graphics/GraphicsEngineOpenGL/src/GLContextLinux.cpp index 5a9efc3a..cf77409e 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLContextLinux.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLContextLinux.cpp @@ -30,13 +30,13 @@ namespace Diligent { -void openglCallbackFunction(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) +static void openglCallbackFunction(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) { std::stringstream MessageSS; diff --git a/Graphics/GraphicsEngineOpenGL/src/GLContextWindows.cpp b/Graphics/GraphicsEngineOpenGL/src/GLContextWindows.cpp index 4d4eb383..a61df72e 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLContextWindows.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLContextWindows.cpp @@ -35,13 +35,13 @@ namespace Diligent { -void APIENTRY openglCallbackFunction(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) +static void APIENTRY openglCallbackFunction(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) { // Note: disabling flood of notifications through glDebugMessageControl() has no effect, // so we have to filter them out here diff --git a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp index ea598f4c..dd38c77f 100644 --- a/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/GLStubsAndroid.cpp @@ -195,6 +195,9 @@ DECLARE_GL_FUNCTION( glDrawElementsBaseVertex, PFNGLDRAWELEMENTSBASEVERTEXPROC, GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) #endif +#ifdef LOAD_DEBUG_MESSAGE_CALLBACK + DECLARE_GL_FUNCTION( glDebugMessageCallback, PFNGLDEBUGMESSAGECALLBACKPROC, GLDEBUGPROC callback, const void *userParam) +#endif void LoadGLFunctions() { @@ -359,4 +362,8 @@ Func = (FuncType)eglGetProcAddress( #Func );\ #ifdef LOAD_GL_DRAW_ELEMENTS_BASE_VERTEX LOAD_GL_FUNCTION( glDrawElementsBaseVertex, PFNGLDRAWELEMENTSBASEVERTEXPROC) #endif + +#ifdef LOAD_DEBUG_MESSAGE_CALLBACK + LOAD_GL_FUNCTION( glDebugMessageCallback, PFNGLDEBUGMESSAGECALLBACKPROC) +#endif } -- cgit v1.2.3