-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdebug.cpp
More file actions
115 lines (104 loc) · 3.17 KB
/
debug.cpp
File metadata and controls
115 lines (104 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "debug.h"
#include "glad/glad.h"
#include <GLFW/glfw3.h>
#include <string>
#include <iostream>
#include <sstream>
#include <stdio.h>
namespace debug {
void printGLDiagnostics()
{
// print diagnostic information
std::cout << "GL VENDOR: " << glGetString(GL_VENDOR) << std::endl;
std::cout << "VERSION: " << glGetString(GL_VERSION) << std::endl;
std::cout << "RENDERER: " << glGetString(GL_RENDERER) << std::endl;
//std::cout << "EXTENSIONS:" << glGetString(GL_EXTENSIONS) << std::endl;
}
namespace
{
static void APIENTRY openglCallbackFunction(
GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar* message,
const void* userParam
)
{
// source string
const char* srcStr = 0;
switch (source) {
case GL_DEBUG_SOURCE_API: srcStr = "API"; break;
case GL_DEBUG_SOURCE_WINDOW_SYSTEM: srcStr = "WINDOW_SYSTEM"; break;
case GL_DEBUG_SOURCE_SHADER_COMPILER: srcStr = "SHADER_COMPILER"; break;
case GL_DEBUG_SOURCE_THIRD_PARTY: srcStr = "THIRD_PARTY"; break;
case GL_DEBUG_SOURCE_APPLICATION: srcStr = "APPLICATION"; break;
case GL_DEBUG_SOURCE_OTHER: srcStr = "OTHER"; break;
default: srcStr = "UNKNOWN"; break;
}
// type
const char* typeStr = 0;
switch (type) {
case GL_DEBUG_TYPE_ERROR: typeStr = "ERROR"; break;
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeStr = "DEPRECATED_BEHAVIOR"; break;
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: typeStr = "UNDEFINED_BEHAVIOR"; break;
case GL_DEBUG_TYPE_PORTABILITY: typeStr = "PORTABILITY"; break;
case GL_DEBUG_TYPE_PERFORMANCE: typeStr = "PERFORMANCE"; break;
case GL_DEBUG_TYPE_OTHER: typeStr = "OTHER"; break;
default: typeStr = "UNKNOWN"; break;
}
// severity
const char* sevStr = 0;
switch (severity) {
case GL_DEBUG_SEVERITY_HIGH: sevStr = "HIGH"; break;
case GL_DEBUG_SEVERITY_MEDIUM: sevStr = "MEDIUM"; break;
case GL_DEBUG_SEVERITY_LOW: sevStr = "LOW"; break;
case GL_DEBUG_SEVERITY_NOTIFICATION: sevStr = "NOTIFICATION"; break;
default: sevStr = "UNKNOWN";
}
// output message, if not just notification
std::stringstream szs;
szs << "\n"
<< "--\n"
<< "-- GL DEBUG MESSAGE:\n"
<< "-- severity = '" << sevStr << "'\n"
<< "-- type = '" << typeStr << "'\n"
<< "-- source = '" << srcStr << "'\n"
<< "-- id = " << std::hex << id << "\n"
<< "-- message:\n"
<< message << "\n"
<< "--\n"
<< "\n"
;
fprintf(stderr, "%s", szs.str().c_str());
fflush(stderr);
}
# undef CALLBACK_
}
void setupGLDebugMessages() {
if (!glfwExtensionSupported("GL_ARB_debug_output"))
{
std::cerr << "GL_debug_ouptput not suppoerted on this device" << std::endl;
return;
}
if (glDebugMessageCallback) {
/* This causes a distinc performance loss but allows
* the callback to be called immediately on error.
*/
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(openglCallbackFunction, nullptr);
glDebugMessageControl(GL_DONT_CARE,
GL_DONT_CARE,
GL_DONT_CARE,
0,
NULL,
true);
}
else
{
std::cerr << "glDebugMessageCallback not available" << std::endl;
}
}
}