CSCI441 OpenGL Library 6.1.6.0
CS@Mines CSCI441 Computer Graphics Course Library
Loading...
Searching...
No Matches
OpenGLUtils.hpp
Go to the documentation of this file.
1
15#ifndef CSCI441_OPENGL_UTILS_H
16#define CSCI441_OPENGL_UTILS_H
17
18#include "constants.h"
19#include "LogUtils.hpp"
20
21#ifdef CSCI441_USE_GLEW
22 #include <GL/glew.h>
23#else
24 #include <glad/gl.h>
25#endif
26
27#include <glm/glm.hpp>
28
29#include <cstdlib> // for atoi()
30
31//**********************************************************************************
32
37namespace CSCI441 {
41 inline constexpr glm::vec3 X_AXIS( 1.0f, 0.0f, 0.0f );
45 inline constexpr glm::vec3 Y_AXIS( 0.0f, 1.0f, 0.0f );
49 inline constexpr glm::vec3 Z_AXIS( 0.0f, 0.0f, 1.0f );
53 [[maybe_unused]] inline constexpr glm::vec3 X_AXIS_POS = X_AXIS;
57 [[maybe_unused]] inline constexpr glm::vec3 Y_AXIS_POS = Y_AXIS;
61 [[maybe_unused]] inline constexpr glm::vec3 Z_AXIS_POS = Z_AXIS;
65 [[maybe_unused]] inline constexpr glm::vec3 X_AXIS_NEG( -1.0f, 0.0f, 0.0f );
69 [[maybe_unused]] inline constexpr glm::vec3 Y_AXIS_NEG( 0.0f, -1.0f, 0.0f );
73 [[maybe_unused]] inline constexpr glm::vec3 Z_AXIS_NEG( 0.0f, 0.0f, -1.0f );
74
79 namespace OpenGLUtils {
83 void printOpenGLInfo();
87 [[maybe_unused]] void printOpenGLExtensions();
94 [[maybe_unused]] void checkOpenGLErrors(const char * str = "");
95
101 [[maybe_unused]] const char* openGLErrorMessage(GLenum err);
102
108 [[maybe_unused]] const char* debugSourceToString(GLenum source);
114 [[maybe_unused]] const char* debugTypeToString(GLenum type);
120 [[maybe_unused]] const char* debugSeverityToString(GLenum severity);
121 };
122
123}
124
125//**********************************************************************************
126//**********************************************************************************
127// Internal definitions
128
129namespace CSCI441_INTERNAL {
130 void printOpenGLHeader(const char* STRING, bool topHeader = false);
131 void printOpenGLParamHeader(int MAJOR, int MINOR );
132 void printOpenGLParamIndexed(const char *FORMAT, GLenum name, GLuint index );
133 void printOpenGLParam(const char *FORMAT, GLenum name );
134 void printOpenGLParamf(const char *FORMAT, GLenum name );
135 void printOpenGLParam2(const char *FORMAT, GLenum name );
136 void printOpenGLParam2f(const char *FORMAT, GLenum name );
137 [[maybe_unused]] void printOpenGLParam3(const char *FORMAT, GLenum name );
138 void printOpenGLParam4(const char *FORMAT, GLenum name );
139}
140
141//**********************************************************************************
142//**********************************************************************************
143// Outward facing function implementations
144
146 GLint major = 0, minor = 0, numExtensions = 0;
147 glGetIntegerv(GL_MAJOR_VERSION, &major);
148 glGetIntegerv(GL_MINOR_VERSION, &minor);
149 glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
150
151 CSCI441_INTERNAL::printOpenGLHeader("OpenGL Information", true);
152 CSCI441::LogUtils::log("[INFO]: | OpenGL Version: %35s |\n", glGetString(GL_VERSION) );
153 CSCI441::LogUtils::log("[INFO]: | OpenGL Renderer: %35s |\n", glGetString(GL_RENDERER) );
154 CSCI441::LogUtils::log("[INFO]: | OpenGL Vendor: %35s |\n", glGetString(GL_VENDOR) );
155 CSCI441::LogUtils::log("[INFO]: | Shading Version: %35s |\n", glGetString(GL_SHADING_LANGUAGE_VERSION) );
156 CSCI441::LogUtils::log("[INFO]: | Number of Extensions: %30d |\n", numExtensions );
157
158 if( (major >= 2 && minor >= 0) || major > 2 ) {
159 CSCI441_INTERNAL::printOpenGLParamHeader( 2, 0 );
160 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Color Attachments: %26d |\n", GL_MAX_COLOR_ATTACHMENTS );
161 CSCI441_INTERNAL::printOpenGLParam2f("[INFO]: | Point Size Range: %24.2f %8.2f |\n", GL_POINT_SIZE_RANGE );
162 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Point Size Granularity: %27.4f |\n", GL_POINT_SIZE_GRANULARITY );
163 CSCI441_INTERNAL::printOpenGLParam2f("[INFO]: | Line Width Smoothed Range: %15.2f %8.2f |\n", GL_SMOOTH_LINE_WIDTH_RANGE );
164 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Line Width Smoothed Granularity: %18.4f |\n", GL_SMOOTH_LINE_WIDTH_GRANULARITY );
165 CSCI441_INTERNAL::printOpenGLParam2f("[INFO]: | Line Width Aliased Range: %16.2f %8.2f |\n", GL_ALIASED_LINE_WIDTH_RANGE );
166 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max Texture Size: %33d |\n", GL_MAX_TEXTURE_SIZE );
167 }
168
169 if( (major >= 2 && minor >= 1) || major > 2 ) {
170 CSCI441_INTERNAL::printOpenGLParamHeader( 2, 1 );
171 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Attributes: %26d |\n", GL_MAX_VERTEX_ATTRIBS );
172 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Uniforms: %28d |\n", GL_MAX_VERTEX_UNIFORM_COMPONENTS );
173 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Textures: %28d |\n", GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS );
174 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Outputs: %29d |\n", GL_MAX_VERTEX_OUTPUT_COMPONENTS );
175 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Inputs: %28d |\n", GL_MAX_FRAGMENT_INPUT_COMPONENTS );
176 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Uniforms: %26d |\n", GL_MAX_FRAGMENT_UNIFORM_COMPONENTS );
177 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Textures: %26d |\n", GL_MAX_TEXTURE_IMAGE_UNITS );
178 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Draw Buffers: %31d |\n", GL_MAX_DRAW_BUFFERS );
179 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Textures Combined: %26d |\n", GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS );
180 }
181
182 if( (major >= 3 && minor >= 0) || major > 3 ) {
183 CSCI441_INTERNAL::printOpenGLParamHeader( 3, 0 );
184 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Transform Feedback Buffers: %17d |\n", GL_MAX_TRANSFORM_FEEDBACK_BUFFERS );
185 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Transform Separate Attributes: %14d |\n", GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS );
186 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Transform Separate Components: %14d |\n", GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS );
187 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Transform Interleaved Buffers: %14d |\n", GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS );
188 }
189
190 if( (major >= 3 && minor >= 1) || major > 3 ) {
191 CSCI441_INTERNAL::printOpenGLParamHeader( 3, 1 );
192 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Uniform Blocks: %20d |\n", GL_MAX_FRAGMENT_UNIFORM_BLOCKS );
193 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Uniform Blocks: %22d |\n", GL_MAX_VERTEX_UNIFORM_BLOCKS );
194 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max Uniform Blocks Size: %20d bytes |\n", GL_MAX_UNIFORM_BLOCK_SIZE );
195 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Combined Uniform Blocks: %20d |\n", GL_MAX_COMBINED_UNIFORM_BLOCKS );
196 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Uniform Bindings: %27d |\n", GL_MAX_UNIFORM_BUFFER_BINDINGS );
197 }
198
199 if( (major >= 3 && minor >= 2) || major > 3 ) {
200 CSCI441_INTERNAL::printOpenGLParamHeader( 3, 2 );
201 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Uniforms: %26d |\n", GL_MAX_GEOMETRY_UNIFORM_COMPONENTS );
202 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Uniform Blocks: %20d |\n", GL_MAX_GEOMETRY_UNIFORM_BLOCKS );
203 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Textures: %26d |\n", GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS );
204 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Inputs: %28d |\n", GL_MAX_GEOMETRY_INPUT_COMPONENTS );
205 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Output Vertices: %19d |\n", GL_MAX_GEOMETRY_OUTPUT_VERTICES );
206 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Total Output Components: %11d |\n", GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS );
207 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Outputs: %27d |\n", GL_MAX_GEOMETRY_OUTPUT_COMPONENTS );
208 }
209
210 if( (major >= 4 && minor >= 0) || major > 4 ) {
211 CSCI441_INTERNAL::printOpenGLParamHeader( 4, 0 );
212 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Patch Vertices: %29d |\n", GL_MAX_PATCH_VERTICES );
213 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tessellation Level: %25d |\n", GL_MAX_TESS_GEN_LEVEL );
214 CSCI441_INTERNAL::printOpenGLParam4("[INFO]: | Default Tessellation Outer Levels: %7d %2d %2d %2d |\n", GL_PATCH_DEFAULT_OUTER_LEVEL );
215 CSCI441_INTERNAL::printOpenGLParam2("[INFO]: | Default Tessellation Inner Levels: %13d %2d |\n", GL_PATCH_DEFAULT_INNER_LEVEL );
216 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Inputs: %24d |\n", GL_MAX_GEOMETRY_INPUT_COMPONENTS );
217 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Uniforms: %22d |\n", GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS );
218 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Uniform Blocks: %16d |\n", GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS );
219 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Textures: %22d |\n", GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS );
220 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Outputs: %23d |\n", GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS );
221 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Inputs: %21d |\n", GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS );
222 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Uniforms: %19d |\n", GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS );
223 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Uniform Blocks: %13d |\n", GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS );
224 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Textures: %19d |\n", GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS );
225 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Outputs: %20d |\n", GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS );
226 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Invocations: %23d |\n", GL_MAX_GEOMETRY_SHADER_INVOCATIONS );
227 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Streams: %29d |\n", GL_MAX_VERTEX_STREAMS );
228 }
229
230 if( (major >= 4 && minor >= 2) || major > 4 ) {
231 CSCI441_INTERNAL::printOpenGLParamHeader( 4, 2 );
232 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Atomic Counters: %21d |\n", GL_MAX_VERTEX_ATOMIC_COUNTERS );
233 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Atomic Counters: %15d |\n", GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS );
234 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Atomic Counters: %12d |\n", GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS );
235 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Atomic Counters: %19d |\n", GL_MAX_GEOMETRY_ATOMIC_COUNTERS );
236 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Atomic Counters: %19d |\n", GL_MAX_FRAGMENT_ATOMIC_COUNTERS );
237 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Combined Atomic Counters: %19d |\n", GL_MAX_COMBINED_ATOMIC_COUNTERS );
238 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Atomic Counter Buffers: %14d |\n", GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS );
239 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Atomic Counter Buffers: %8d |\n", GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS );
240 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Atomic Counter Buffers: %5d |\n", GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS );
241 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Atomic Counter Buffers: %12d |\n", GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS );
242 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Atomic Counter Buffers: %12d |\n", GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS );
243 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Combined Atomic Counter Buffers: %12d |\n", GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS );
244 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Atomic Counter Buffer Bindings: %13d |\n", GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS );
245 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max Atomic Counter Buffer Size: %17d |\n", GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE );
246 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Image Uniforms: %22d |\n", GL_MAX_VERTEX_IMAGE_UNIFORMS );
247 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Image Uniforms: %16d |\n", GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS );
248 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Image Uniforms: %13d |\n", GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS );
249 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Image Uniforms: %20d |\n", GL_MAX_GEOMETRY_IMAGE_UNIFORMS );
250 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Image Uniforms: %20d |\n", GL_MAX_FRAGMENT_IMAGE_UNIFORMS );
251 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Combined Image Uniforms: %20d |\n", GL_MAX_IMAGE_UNITS );
252 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Shader Storage Buffer Bindings: %13d |\n", GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS );
253 }
254
255 if( (major >= 4 && minor >= 3) || major > 4 ) {
256 CSCI441_INTERNAL::printOpenGLParamHeader( 4, 3 );
257 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Uniforms: %27d |\n", GL_MAX_COMPUTE_UNIFORM_COMPONENTS );
258 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Uniform Blocks: %21d |\n", GL_MAX_COMPUTE_UNIFORM_BLOCKS );
259 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Textures: %27d |\n", GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS );
260 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Image Uniforms: %21d |\n", GL_MAX_COMPUTE_IMAGE_UNIFORMS );
261 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Atomic Counters: %20d |\n", GL_MAX_COMPUTE_ATOMIC_COUNTERS );
262 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Atomic Counter Buffers: %13d |\n", GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS );
263
264 CSCI441_INTERNAL::printOpenGLParamIndexed("[INFO]: | Max # Work Groups Per Dispatch: %6d", GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0 );
265 CSCI441_INTERNAL::printOpenGLParamIndexed(" %6d", GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1 );
266 CSCI441_INTERNAL::printOpenGLParamIndexed(" %6d |\n", GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2 );
267
268 CSCI441_INTERNAL::printOpenGLParamIndexed("[INFO]: | Max Work Groups Size: %16d", GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0 );
269 CSCI441_INTERNAL::printOpenGLParamIndexed(" %6d", GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1 );
270 CSCI441_INTERNAL::printOpenGLParamIndexed(" %6d |\n", GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2 );
271
272 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Invocations Per Work Group: %18d |\n", GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS );
273 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max Total Storage Size: %22d bytes |\n", GL_MAX_COMPUTE_SHARED_MEMORY_SIZE );
274 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Vertex Shader Storage Blocks: %15d |\n", GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS );
275 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Control Shader Storage Blocks: %9d |\n", GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS );
276 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Tess Evaluation Shader Storage Blocks: %6d |\n", GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS );
277 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Geometry Shader Storage Blocks: %13d |\n", GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS );
278 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Fragment Shader Storage Blocks: %13d |\n", GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS );
279 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Compute Shader Storage Blocks: %14d |\n", GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS );
280 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Combined Shader Storage Blocks: %13d |\n", GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS );
281 CSCI441_INTERNAL::printOpenGLParam( "[INFO]: | Max # Combined Shader Output Resources: %11d |\n", GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES );
282 }
283
284 if( (major >= 4 && minor >= 6) || major > 4 ) {
285 CSCI441_INTERNAL::printOpenGLParamHeader( 4, 6 );
286
287#ifdef GL_MAX_TEXTURE_MAX_ANISOTROPY
288 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Max Texture Anisotropy: %27.4f |\n", GL_MAX_TEXTURE_MAX_ANISOTROPY );
289#elif defined(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)
290 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Max Texture Anisotropy: %27.4f |\n", GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT );
291#elif defined(GL_MAX_TEXTURE_MAX_ANISOTROPY_ARB)
292 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Max Texture Anisotropy: %27.4f |\n", GL_MAX_TEXTURE_MAX_ANISOTROPY_ARB );
293#endif
294 }
295
296 CSCI441_INTERNAL::printOpenGLHeader("Extensions");
297
298#if defined(GL_EXT_texture_filter_anisotropic) || defined(GL_ARB_texture_filter_anisotropic)
299# ifdef GL_MAX_TEXTURE_MAX_ANISOTROPY
300 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Max Texture Anisotropy: %27.4f |\n", GL_MAX_TEXTURE_MAX_ANISOTROPY );
301# elif defined(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)
302 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Max Texture Anisotropy: %27.4f |\n", GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT );
303# elif defined(GL_MAX_TEXTURE_MAX_ANISOTROPY_ARB)
304 CSCI441_INTERNAL::printOpenGLParamf( "[INFO]: | Max Texture Anisotropy: %27.4f |\n", GL_MAX_TEXTURE_MAX_ANISOTROPY_ARB );
305# else
306 CSCI441::LogUtils::log("[INFO]: | Texture Anisotropy Filtering Not Supported |\n");
307# endif
308#else
309 CSCI441::LogUtils::log("[INFO]: | Texture Anisotropy Filtering Not Supported |\n");
310#endif
311
312 CSCI441::LogUtils::log("[INFO]: \\--------------------------------------------------------/\n\n");
313}
314
315[[maybe_unused]]
317 GLint numExtensions = 0;
318 glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
319
320 CSCI441::LogUtils::log("[INFO]: Number of Extensions: %4d\n", numExtensions );
321 for (int i = 0; i < numExtensions; i++) {
322 CSCI441::LogUtils::log("[INFO]: Extension #%3d: %s \n", (i+1), glGetStringi(GL_EXTENSIONS, i) );
323 }
324}
325
326[[maybe_unused]]
327inline void CSCI441::OpenGLUtils::checkOpenGLErrors(const char * const str) {
328 GLenum err;
329 while( (err = glGetError()) != GL_NO_ERROR ) {
330 CSCI441::LogUtils::logError( "[ERROR %s]: OpenGL Error (%d): %s\n", str, err, CSCI441::OpenGLUtils::openGLErrorMessage(err) );
331 }
332}
333
334inline const char* CSCI441::OpenGLUtils::openGLErrorMessage(const GLenum err) {
335 switch(err) {
336 case GL_NO_ERROR: return "No error";
337 case GL_INVALID_ENUM: return "Invalid enum";
338 case GL_INVALID_VALUE: return "Invalid value";
339 case GL_INVALID_OPERATION: return "Invalid operation";
340 case GL_STACK_OVERFLOW: return "Stack overflow";
341 case GL_STACK_UNDERFLOW: return "Stack underflow";
342 case GL_OUT_OF_MEMORY: return "Out of memory";
343 case GL_INVALID_FRAMEBUFFER_OPERATION: return "Invalid framebuffer operation";
344 case GL_CONTEXT_LOST: return "Context lost";
345 default: return "Unknown";
346 }
347}
348
349[[maybe_unused]]
350inline const char* CSCI441::OpenGLUtils::debugSourceToString(const GLenum source) {
351 switch(source) {
352 case GL_DEBUG_SOURCE_API: return "API";
353 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: return "Window System";
354 case GL_DEBUG_SOURCE_SHADER_COMPILER: return "Shader Compiler";
355 case GL_DEBUG_SOURCE_THIRD_PARTY: return "Third Party";
356 case GL_DEBUG_SOURCE_APPLICATION: return "Application";
357 case GL_DEBUG_SOURCE_OTHER: return "Other";
358 default: return "Unknown";
359 }
360}
361
362[[maybe_unused]]
363inline const char* CSCI441::OpenGLUtils::debugTypeToString(const GLenum type) {
364 switch(type) {
365 case GL_DEBUG_TYPE_ERROR: return "Error";
366 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return "Deprecated Behavior";
367 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: return "Undefined Behavior";
368 case GL_DEBUG_TYPE_PORTABILITY: return "Portability";
369 case GL_DEBUG_TYPE_PERFORMANCE: return "Performance";
370 case GL_DEBUG_TYPE_MARKER: return "Marker";
371 case GL_DEBUG_TYPE_PUSH_GROUP: return "Push Group";
372 case GL_DEBUG_TYPE_POP_GROUP: return "Pop Group";
373 case GL_DEBUG_TYPE_OTHER: return "Other";
374 default: return "Unknown";
375 }
376}
377
378[[maybe_unused]]
379inline const char* CSCI441::OpenGLUtils::debugSeverityToString(const GLenum severity) {
380 switch(severity) {
381 case GL_DEBUG_SEVERITY_HIGH: return "High";
382 case GL_DEBUG_SEVERITY_MEDIUM: return "Medium";
383 case GL_DEBUG_SEVERITY_LOW: return "Low";
384 case GL_DEBUG_SEVERITY_NOTIFICATION: return "Notification";
385 default: return "Unknown";
386 }
387}
388
389//**********************************************************************************
390//**********************************************************************************
391// Internal function implementations
392
393inline void CSCI441_INTERNAL::printOpenGLHeader(const char* STRING, const bool topHeader) {
394 if (topHeader) {
395 CSCI441::LogUtils::log("[INFO]: /--------------------------------------------------------\\\n" );
396 } else {
397 CSCI441::LogUtils::log("[INFO]: >--------------------------------------------------------<\n" );
398 }
399
400 CSCI441::LogUtils::log("[INFO]: | %-54s |\n", STRING );
401 CSCI441::LogUtils::log("[INFO]: |--------------------------------------------------------|\n" );
402}
403
404inline void CSCI441_INTERNAL::printOpenGLParamHeader( const int MAJOR, const int MINOR ) {
405 char openGLVersion[25];
406 snprintf(openGLVersion, 25, "OpenGL %d.%d Settings", MAJOR, MINOR);
407 printOpenGLHeader(openGLVersion);
408}
409
410inline void CSCI441_INTERNAL::printOpenGLParamIndexed(const char * const FORMAT, const GLenum name, const GLuint index ) {
411 GLint value = 0;
412 glGetIntegeri_v( name, index, &value );
413 CSCI441::LogUtils::log(FORMAT, value );
414}
415
416inline void CSCI441_INTERNAL::printOpenGLParam(const char * const FORMAT, const GLenum name ) {
417 GLint value = 0;
418 glGetIntegerv( name, &value );
419 CSCI441::LogUtils::log(FORMAT, value );
420}
421
422inline void CSCI441_INTERNAL::printOpenGLParamf(const char * const FORMAT, const GLenum name ) {
423 GLfloat value = 0;
424 glGetFloatv( name, &value );
425 CSCI441::LogUtils::log(FORMAT, value );
426}
427
428inline void CSCI441_INTERNAL::printOpenGLParam2(const char * const FORMAT, const GLenum name ) {
429 GLint values[2] = {0,0};
430 glGetIntegerv( name, values );
431 CSCI441::LogUtils::log(FORMAT, values[0], values[1] );
432}
433
434inline void CSCI441_INTERNAL::printOpenGLParam2f(const char * const FORMAT, const GLenum name ) {
435 GLfloat values[2] = {0,0};
436 glGetFloatv( name, values );
437 CSCI441::LogUtils::log(FORMAT, values[0], values[1] );
438}
439
440[[maybe_unused]]
441inline void CSCI441_INTERNAL::printOpenGLParam3(const char * const FORMAT, const GLenum name ) {
442 GLint values[3] = {0,0,0};
443 glGetIntegerv( name, values );
444 CSCI441::LogUtils::log(FORMAT, values[0], values[1], values[2] );
445}
446
447inline void CSCI441_INTERNAL::printOpenGLParam4(const char * const FORMAT, const GLenum name ) {
448 GLint values[4] = {0,0,0,0};
449 glGetIntegerv( name, values );
450 CSCI441::LogUtils::log(FORMAT, values[0], values[1], values[2], values[3] );
451}
452
453#endif // CSCI441_OPENGL_UTILS_H
const char * openGLErrorMessage(GLenum err)
Converts error value to string representation.
Definition: OpenGLUtils.hpp:334
void printOpenGLInfo()
Prints information about our OpenGL context.
Definition: OpenGLUtils.hpp:145
const char * debugSeverityToString(GLenum severity)
Converts debug severity value to string representation.
Definition: OpenGLUtils.hpp:379
void checkOpenGLErrors(const char *str="")
Checks if there are any OpenGL errors, printing them if so, and clearing the error flag.
Definition: OpenGLUtils.hpp:327
void printOpenGLExtensions()
Prints the list of available extensions.
Definition: OpenGLUtils.hpp:316
const char * debugTypeToString(GLenum type)
Converts debug type value to string representation.
Definition: OpenGLUtils.hpp:363
const char * debugSourceToString(GLenum source)
Converts debug source value to string representation.
Definition: OpenGLUtils.hpp:350
void log(const char *MSG,...)
log a message to both the standard output stream and file
Definition: LogUtils.hpp:116
void logError(const char *MSG,...)
log a message to both the standard error stream and file
Definition: LogUtils.hpp:128
CSCI441 Helper Functions for OpenGL.
Definition: ArcballCam.hpp:17
constexpr glm::vec3 X_AXIS(1.0f, 0.0f, 0.0f)
constant for positive X_AXIS
constexpr glm::vec3 Y_AXIS_NEG(0.0f, -1.0f, 0.0f)
constant for negative Y_AXIS
constexpr glm::vec3 Y_AXIS_POS
alias for constant for positive Y_AXIS
Definition: OpenGLUtils.hpp:57
constexpr glm::vec3 Z_AXIS(0.0f, 0.0f, 1.0f)
constant for positive Z_AXIS
constexpr glm::vec3 Z_AXIS_NEG(0.0f, 0.0f, -1.0f)
constant for negative Z_AXIS
constexpr glm::vec3 X_AXIS_POS
alias for constant for positive X_AXIS
Definition: OpenGLUtils.hpp:53
constexpr glm::vec3 Y_AXIS(0.0f, 1.0f, 0.0f)
constant for positive Y_AXIS
constexpr glm::vec3 Z_AXIS_POS
alias for constant for positive Z_AXIS
Definition: OpenGLUtils.hpp:61
constexpr glm::vec3 X_AXIS_NEG(-1.0f, 0.0f, 0.0f)
constant for negative X_AXIS
contains OpenGL Utility functions