Euphoria
debuggl.cc
Go to the documentation of this file.
1 #include "render/debuggl.h"
2 
3 #include "render/gl.h"
4 #include "assert/assert.h"
5 #include "log/log.h"
6 
7 
8 namespace
9 {
10  std::string
11  source_to_string(GLenum source)
12  {
13  switch(source)
14  {
15  case GL_DEBUG_SOURCE_API_ARB: return "API"; break;
16  case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: return "Window System"; break;
17  case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: return "Shader Compiler"; break;
18  case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: return "Third Party"; break;
19  case GL_DEBUG_SOURCE_APPLICATION_ARB: return "Application"; break;
20  case GL_DEBUG_SOURCE_OTHER_ARB: return "Other"; break;
21  default: return "Unknown";
22  }
23  }
24 
25  std::string
26  type_to_string(GLenum type)
27  {
28  switch(type)
29  {
30  case GL_DEBUG_TYPE_ERROR_ARB: return "Error";
31  case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: return "Deprecated Behaviour";
32  case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: return "Undefined Behaviour";
33  case GL_DEBUG_TYPE_PORTABILITY_ARB: return "Portability";
34  case GL_DEBUG_TYPE_PERFORMANCE_ARB: return "Performance";
35  case GL_DEBUG_TYPE_OTHER_ARB: return "Other";
36  default: return "Unknown";
37  }
38  }
39 
40  std::string
41  severity_to_string(GLenum severity)
42  {
43  switch(severity)
44  {
45  case GL_DEBUG_SEVERITY_HIGH_ARB: return "high"; break;
46  case GL_DEBUG_SEVERITY_MEDIUM_ARB: return "medium"; break;
47  case GL_DEBUG_SEVERITY_LOW_ARB: return "low"; break;
48  default: return "unknown";
49  }
50  }
51 }
52 
53 
54 
55 namespace eu::render
56 {
57  std::string
58  from_opengl_error_to_string(GLenum error_code)
59  {
60  switch(error_code)
61  {
62  case GL_INVALID_ENUM: return "INVALID_ENUM";
63  case GL_INVALID_VALUE: return "INVALID_VALUE";
64  case GL_INVALID_OPERATION: return "INVALID_OPERATION";
65 #ifdef GL_STACK_OVERFLOW
66  case GL_STACK_OVERFLOW: return "STACK_OVERFLOW";
67 #endif
68 #ifdef GL_STACK_UNDERFLOW
69  case GL_STACK_UNDERFLOW: return "STACK_UNDERFLOW";
70 #endif
71  case GL_OUT_OF_MEMORY: return "OUT_OF_MEMORY";
72  case GL_INVALID_FRAMEBUFFER_OPERATION: return "INVALID_FRAMEBUFFER_OPERATION";
73  default: return "UNKNOWN";
74  }
75  }
76 
77 
78  void
79  print_all_opengl_errors(const char* file, int line)
80  {
81  GLenum error_code = 0;
82  while((error_code = glGetError()) != GL_NO_ERROR)
83  {
84  const std::string error = from_opengl_error_to_string(error_code);
85  LOG_ERROR("{0} | {1}({2})", error, file, line);
86  }
87  }
88 
89 
90  void APIENTRY
92  (
93  GLenum source,
94  GLenum type,
95  GLuint id,
96  GLenum severity,
97  GLsizei /*length*/,
98  const GLchar* message,
99  const GLvoid* /*userParam*/
100  )
101  {
102  // ignore non-significant error/warning codes
103  if(type == GL_DEBUG_TYPE_OTHER_ARB)
104  {
105  return;
106  }
107 
108  // only display the first 10
109  static int error_count = 0;
110  if(error_count > 10)
111  {
112  return;
113  }
114  ++error_count;
115 
116  LOG_ERROR("---------------");
117  LOG_ERROR("Debug message ({0}): {1}", id, message);
118  LOG_ERROR
119  (
120  "Source {0} type: {1} Severity: {2}",
121  source_to_string(source),
122  type_to_string(type),
123  severity_to_string(severity)
124  );
125  // ASSERT(false);
126  }
127 
128 
129  void
131  {
132  const bool has_debug = GLAD_GL_ARB_debug_output == 1;
133  if(has_debug)
134  {
135  LOG_INFO("Enabling OpenGL debug output");
136  glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
137  glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
138  glDebugMessageCallbackARB(on_opengl_error, nullptr);
139  glDebugMessageControlARB
140  (
141  GL_DONT_CARE,
142  GL_DONT_CARE,
143  GL_DONT_CARE,
144  0,
145  nullptr,
146  GL_TRUE
147  );
148  }
149  }
150 }
#define LOG_INFO(...)
Definition: log.h:7
#define LOG_ERROR(...)
Definition: log.h:9
constexpr ParseResult error
no error occurred
Definition: argparse.h:73
void setup_opengl_debug()
Definition: debuggl.cc:130
std::string from_opengl_error_to_string(GLenum error_code)
Definition: debuggl.cc:58
void print_all_opengl_errors(const char *file, int line)
Definition: debuggl.cc:79
void APIENTRY on_opengl_error(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei, const GLchar *message, const GLvoid *)
Definition: debuggl.cc:92
int line
Definition: nlp_sentence.cc:91