@@ -91,19 +91,74 @@ void loadGLExtensions(void *context)
9191 GL::gglPerformExtensionBinds (context);
9292}
9393
94- void STDCALL glDebugCallback (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
95- const GLchar *message, const void *userParam)
94+ void APIENTRY glDebugCallback (
95+ GLenum source,
96+ GLenum type,
97+ GLuint id,
98+ GLenum severity,
99+ GLsizei length,
100+ const GLchar* message,
101+ const void * userParam)
96102{
97- // JTH [11/24/2016]: This is a temporary fix so that we do not get spammed for redundant fbo changes.
98- // This only happens on Intel cards. This should be looked into sometime in the near future.
99- if (dStrStartsWith (message, " API_ID_REDUNDANT_FBO" ))
103+ // Ignore non-significant notifications (optional)
104+ if (severity == GL_DEBUG_SEVERITY_NOTIFICATION)
100105 return ;
106+
107+ const char * srcStr = " UNKNOWN" ;
108+ const char * typeStr = " UNKNOWN" ;
109+ const char * sevStr = " UNKNOWN" ;
110+
111+ switch (source)
112+ {
113+ case GL_DEBUG_SOURCE_API: srcStr = " API" ; break ;
114+ case GL_DEBUG_SOURCE_WINDOW_SYSTEM: srcStr = " WINDOW" ; break ;
115+ case GL_DEBUG_SOURCE_SHADER_COMPILER: srcStr = " SHADER" ; break ;
116+ case GL_DEBUG_SOURCE_THIRD_PARTY: srcStr = " THIRD_PARTY" ; break ;
117+ case GL_DEBUG_SOURCE_APPLICATION: srcStr = " APP" ; break ;
118+ case GL_DEBUG_SOURCE_OTHER: srcStr = " OTHER" ; break ;
119+ }
120+
121+ switch (type)
122+ {
123+ case GL_DEBUG_TYPE_ERROR: typeStr = " ERROR" ; break ;
124+ case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeStr = " DEPRECATED" ; break ;
125+ case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeStr = " UNDEFINED" ; break ;
126+ case GL_DEBUG_TYPE_PORTABILITY: typeStr = " PORTABILITY" ; break ;
127+ case GL_DEBUG_TYPE_PERFORMANCE: typeStr = " PERFORMANCE" ; break ;
128+ case GL_DEBUG_TYPE_MARKER: typeStr = " MARKER" ; break ;
129+ case GL_DEBUG_TYPE_PUSH_GROUP: typeStr = " PUSH" ; break ;
130+ case GL_DEBUG_TYPE_POP_GROUP: typeStr = " POP" ; break ;
131+ case GL_DEBUG_TYPE_OTHER: typeStr = " OTHER" ; break ;
132+ }
133+
134+ switch (severity)
135+ {
136+ case GL_DEBUG_SEVERITY_HIGH: sevStr = " HIGH" ; break ;
137+ case GL_DEBUG_SEVERITY_MEDIUM: sevStr = " MEDIUM" ; break ;
138+ case GL_DEBUG_SEVERITY_LOW: sevStr = " LOW" ; break ;
139+ case GL_DEBUG_SEVERITY_NOTIFICATION: sevStr = " NOTIFY" ; break ;
140+ }
141+
142+ // Filter known noisy IDs here if needed
143+ // Example:
144+ // if (id == 131185) return;
145+
101146 if (severity == GL_DEBUG_SEVERITY_HIGH)
102- Con::errorf (" OPENGL: %s" , message);
147+ {
148+ Con::errorf (" OPENGL [%s][%s][%s][%u]: %s" ,
149+ sevStr, srcStr, typeStr, id, message);
150+ AssertFatal (false , " OpenGL HIGH severity error." );
151+ }
103152 else if (severity == GL_DEBUG_SEVERITY_MEDIUM)
104- Con::warnf (" OPENGL: %s" , message);
105- else if (severity == GL_DEBUG_SEVERITY_LOW)
106- Con::printf (" OPENGL: %s" , message);
153+ {
154+ Con::warnf (" OPENGL [%s][%s][%s][%u]: %s" ,
155+ sevStr, srcStr, typeStr, id, message);
156+ }
157+ else
158+ {
159+ Con::printf (" OPENGL [%s][%s][%s][%u]: %s" ,
160+ sevStr, srcStr, typeStr, id, message);
161+ }
107162}
108163
109164void STDCALL glAmdDebugCallback (GLuint id, GLenum category, GLenum severity, GLsizei length,
@@ -157,27 +212,34 @@ void GFXGLDevice::initGLState()
157212#endif
158213
159214#if TORQUE_DEBUG
160- if ( gglHasExtension (ARB_debug_output) )
161- {
162- glEnable (GL_DEBUG_OUTPUT);
163- glDebugMessageCallbackARB (glDebugCallback, NULL );
164- glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
165- GLuint unusedIds = 0 ;
166- glDebugMessageControlARB (GL_DONT_CARE,
167- GL_DONT_CARE,
168- GL_DONT_CARE,
169- 0 ,
170- &unusedIds,
171- GL_TRUE);
172- }
173- else if (gglHasExtension (AMD_debug_output))
174- {
175- glEnable (GL_DEBUG_OUTPUT);
176- glDebugMessageCallbackAMD (glAmdDebugCallback, NULL );
177- // glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
178- GLuint unusedIds = 0 ;
179- glDebugMessageEnableAMD (GL_DONT_CARE, GL_DONT_CARE, 0 ,&unusedIds, GL_TRUE);
180- }
215+
216+ bool debugInitialized = false ;
217+ int flags;
218+ glGetIntegerv (GL_CONTEXT_FLAGS, &flags);
219+ if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
220+ {
221+ glEnable (GL_DEBUG_OUTPUT);
222+ glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
223+
224+ glDebugMessageCallback (glDebugCallback, nullptr );
225+
226+ glDebugMessageControl (
227+ GL_DONT_CARE,
228+ GL_DONT_CARE,
229+ GL_DONT_CARE,
230+ 0 ,
231+ nullptr ,
232+ GL_TRUE);
233+
234+ Con::printf (" OpenGL debug output enabled." );
235+ debugInitialized = true ;
236+ }
237+
238+ if (!debugInitialized)
239+ {
240+ Con::warnf (" OpenGL debug output NOT available." );
241+ }
242+
181243#endif
182244
183245 PlatformGL::setVSync (smEnableVSync);
0 commit comments