diff --git a/src/Graphics/OpenGLContext/GLFunctions.cpp b/src/Graphics/OpenGLContext/GLFunctions.cpp index 5d85f0e4..2c885131 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.cpp +++ b/src/Graphics/OpenGLContext/GLFunctions.cpp @@ -194,6 +194,8 @@ PFNGLTEXTUREBARRIERNVPROC ptrTextureBarrierNV; PFNGLCLEARBUFFERFVPROC ptrClearBufferfv; PFNGLENABLEIPROC ptrEnablei; PFNGLDISABLEIPROC ptrDisablei; +PFNGLDEBUGMESSAGECALLBACKPROC ptrDebugMessageCallback; +PFNGLDEBUGMESSAGECONTROLPROC ptrDebugMessageControl; PFNGLEGLIMAGETARGETTEXTURE2DOESPROC ptrEGLImageTargetTexture2DOES; void initGLFunctions() @@ -378,5 +380,7 @@ void initGLFunctions() GL_GET_PROC_ADR(PFNGLCLEARBUFFERFVPROC, ClearBufferfv); GL_GET_PROC_ADR(PFNGLENABLEIPROC, Enablei); GL_GET_PROC_ADR(PFNGLDISABLEIPROC, Disablei); + GL_GET_PROC_ADR(PFNGLDEBUGMESSAGECALLBACKPROC, DebugMessageCallback); + GL_GET_PROC_ADR(PFNGLDEBUGMESSAGECONTROLPROC, DebugMessageControl); GL_GET_PROC_ADR(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, EGLImageTargetTexture2DOES); } diff --git a/src/Graphics/OpenGLContext/GLFunctions.h b/src/Graphics/OpenGLContext/GLFunctions.h index 52bb9f1a..ffd86842 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.h +++ b/src/Graphics/OpenGLContext/GLFunctions.h @@ -188,6 +188,9 @@ extern PFNGLTEXTUREBARRIERNVPROC ptrTextureBarrierNV; extern PFNGLCLEARBUFFERFVPROC ptrClearBufferfv; extern PFNGLENABLEIPROC ptrEnablei; extern PFNGLDISABLEIPROC ptrDisablei; +extern PFNGLDEBUGMESSAGECALLBACKPROC ptrDebugMessageCallback; +extern PFNGLDEBUGMESSAGECONTROLPROC ptrDebugMessageControl; + typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, void* image); extern PFNGLEGLIMAGETARGETTEXTURE2DOESPROC ptrEGLImageTargetTexture2DOES; @@ -327,6 +330,8 @@ void initGLFunctions(); #define glEnablei(...) opengl::FunctionWrapper::wrEnablei(__VA_ARGS__) #define glDisablei(...) opengl::FunctionWrapper::wrDisablei(__VA_ARGS__) #define glEGLImageTargetTexture2DOES(...) opengl::FunctionWrapper::wrEGLImageTargetTexture2DOES(__VA_ARGS__) +#define glDebugMessageCallback(...) opengl::FunctionWrapper::wrDebugMessageCallback(__VA_ARGS__) +#define glDebugMessageControl(...) opengl::FunctionWrapper::wrDebugMessageControl(__VA_ARGS__) #define GL_TEXTURE_EXTERNAL_OES 0x8D65 diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h index 7631a2e1..58e21567 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_WrappedFunctions.h @@ -4746,6 +4746,78 @@ private: void* m_image; }; +class GlDebugMessageCallbackCommand : public OpenGlCommand +{ + public: + GlDebugMessageCallbackCommand() : + OpenGlCommand(true, false, "glDebugMessageCallback") + { + } + + static std::shared_ptr get(GLDEBUGPROC callback, const void *userParam) + { + static int poolId = OpenGlCommandPool::get().getNextAvailablePool(); + auto ptr = getFromPool(poolId); + ptr->set(callback, userParam); + return ptr; + } + + void commandToExecute() override + { + ptrDebugMessageCallback(m_callback, m_userParam); + } + +private: + void set(GLDEBUGPROC callback, const void *userParam) + { + m_callback = callback; + m_userParam = userParam; + } + + GLDEBUGPROC m_callback; + const void* m_userParam; +}; + +class GlDebugMessageControlCommand : public OpenGlCommand +{ +public: + GlDebugMessageControlCommand() : + OpenGlCommand(true, false, "glDebugMessageControl") + { + } + + static std::shared_ptr get(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) + { + static int poolId = OpenGlCommandPool::get().getNextAvailablePool(); + auto ptr = getFromPool(poolId); + ptr->set(source, type, severity, count, ids, enabled); + return ptr; + } + + void commandToExecute() override + { + ptrDebugMessageControl(m_source, m_type, m_severity, m_count, m_ids, m_enabled); + } + +private: + void set(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) + { + m_source = source; + m_type = type; + m_severity = severity; + m_count = count; + m_ids = ids; + m_enabled = enabled; + } + + GLenum m_source; + GLenum m_type; + GLenum m_severity; + GLsizei m_count; + const GLuint* m_ids; + GLboolean m_enabled; +}; + class ShutdownCommand : public OpenGlCommand { public: diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp index f583ba70..2bc5a7a9 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.cpp @@ -1310,6 +1310,24 @@ namespace opengl { ptrEGLImageTargetTexture2DOES(target, image); } + void FunctionWrapper::wrDebugMessageCallback(GLDEBUGPROC callback, const void *userParam) + { + if (m_threaded_wrapper) + executeCommand(GlDebugMessageCallbackCommand::get(callback, userParam)); + else + ptrDebugMessageCallback(callback, userParam); + } + + + void FunctionWrapper::wrDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) + { + if (m_threaded_wrapper) + executeCommand(GlDebugMessageControlCommand::get(source, type, severity, count, ids, enabled)); + else + ptrDebugMessageControl(source, type, severity, count, ids, enabled); + } + + #if defined(OS_ANDROID) EGLClientBuffer FunctionWrapper::ewrGetNativeClientBufferANDROID(const AHardwareBuffer *buffer) { diff --git a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h index efa714ec..9e017a0c 100644 --- a/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h +++ b/src/Graphics/OpenGLContext/ThreadedOpenGl/opengl_Wrapper.h @@ -172,6 +172,9 @@ namespace opengl { static void wrFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length); static void wrFinish(); static void wrEGLImageTargetTexture2DOES(GLenum target, void* image); + static void wrDebugMessageCallback(GLDEBUGPROC callback, const void *userParam); + static void wrDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + #if defined(OS_ANDROID) static EGLClientBuffer ewrGetNativeClientBufferANDROID(const AHardwareBuffer *buffer); diff --git a/src/Graphics/OpenGLContext/opengl_GLInfo.cpp b/src/Graphics/OpenGLContext/opengl_GLInfo.cpp index 498175d0..0de4d6fb 100644 --- a/src/Graphics/OpenGLContext/opengl_GLInfo.cpp +++ b/src/Graphics/OpenGLContext/opengl_GLInfo.cpp @@ -13,6 +13,11 @@ using namespace opengl; +static void on_gl_error(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* message, const void *userParam) +{ + LOG(LOG_ERROR, "%s", message); +} + void GLInfo::init() { const char * strDriverVersion = reinterpret_cast(glGetString(GL_VERSION)); isGLESX = strstr(strDriverVersion, "OpenGL ES") != nullptr; @@ -158,4 +163,18 @@ void GLInfo::init() { LOG(LOG_WARNING, "Your GPU does not support the extensions needed for N64 Depth Compare."); } } + +#ifdef EGL + if (isGLESX) + { + ptrDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) eglGetProcAddress("glDebugMessageCallbackKHR"); + ptrDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) eglGetProcAddress("glDebugMessageControlKHR"); + } +#endif + +#ifdef GL_DEBUG + glDebugMessageCallback(on_gl_error, nullptr); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); +#endif }