#include "eglbackend.h"
#include "glutil.h"
-#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#undef CASE
}
-static void exitEglError(const char *what)
+static void dieEgl(const char *what)
{
EGLint e = eglGetError();
- fprintf(stderr, "EGL error %d (%s): %s\n", e, eglErrorToString(e), what);
- exit(1);
+ die("EGL error %d (%s): %s\n", e, eglErrorToString(e), what);
}
static const EGLint configAttribs[] = {
EGLint eglMajor, eglMinor;
display = eglGetDisplay(xDisplay);
if (display == EGL_NO_DISPLAY)
- exitEglError("Failed to get EGL display");
+ dieEgl("Failed to get EGL display");
if (eglInitialize(display, &eglMajor, &eglMinor) == EGL_FALSE)
- exitEglError("Failed to initialize EGL");
+ dieEgl("Failed to initialize EGL");
printf("Using EGL version: %d.%d\n", eglMajor, eglMinor);
if (eglMajor == 1 && eglMinor < 3) {
// Choosing the GL context version requires EGL 1.3
- fprintf(stderr, "Need at least EGL 1.3 to function properly\n");
- exit(1);
+ die("Need at least EGL 1.3 to function properly\n");
}
#ifdef CON_GLES2
if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE)
#else
if (eglBindAPI(EGL_OPENGL_API) == EGL_FALSE)
#endif
- exitEglError("Failed to bind API");
+ dieEgl("Failed to bind API");
// get an appropriate config
EGLConfig configs[1];
EGLint count;
if (eglChooseConfig(display, configAttribs, configs, 1, &count) == EGL_FALSE){
- exitEglError("Failed to choose framebuffer configuration");
+ dieEgl("Failed to choose framebuffer configuration");
}
if (count == 0) {
- fprintf(stderr, "Found no matching framebuffer configuration\n");
- exit(1);
+ die("Found no matching framebuffer configuration\n");
}
config = configs[0];
}
// create an EGL context and use it with the surface
context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
if (context == EGL_NO_CONTEXT)
- exitEglError("Failed to create context");
+ dieEgl("Failed to create context");
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE)
- exitEglError("Failed to make context current");
+ dieEgl("Failed to make context current");
printf("Using GL version: %s\n", glGetString(GL_VERSION));
// initialise GL utilities
resolveFunctionPointers(eglGetProcAddress);
{
assert(context != EGL_NO_CONTEXT); // this implies the display is also initialized
if (eglSwapBuffers(display, surface) == EGL_FALSE)
- exitEglError("Failed to swap buffers");
+ dieEgl("Failed to swap buffers");
}
void EGLBackend::setSwapInterval(int i) const
assert(context != EGL_NO_CONTEXT);
// check if swap interval value is supported
if (i < 0) {
- fprintf(stderr, "Cannot set swap interval to %d, must not be negative\n", i);
- exit(1);
+ die("Cannot set swap interval to %d, must not be negative\n", i);
}
EGLint val;
eglGetConfigAttrib(display, config, EGL_MAX_SWAP_INTERVAL, &val);
if (i > val) {
- fprintf(stderr, "Cannot set swap interval to %d, maximum supported value is %d\n", i, val);
- exit(1);
+ die("Cannot set swap interval to %d, maximum supported value is %d\n", i, val);
}
// use it
if (eglSwapInterval(display, i) == EGL_FALSE)
- exitEglError("Failed to set swap interval");
+ dieEgl("Failed to set swap interval");
}
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
+
+void die(const char *msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+ vfprintf(stderr, msg, ap);
+ va_end(ap);
+ exit(1);
+}
static const char *glErrorToString(GLenum e)
{
{
GLenum e = glGetError();
if (e == GL_NO_ERROR) return;
- fprintf(stderr, "GL error %d (%s): %s\n", e, glErrorToString(e), what);
- exit(1);
+ die("GL error %d (%s): %s\n", e, glErrorToString(e), what);
}
#include <GL/gl.h>
#endif
+/**
+ * GNUC has the ability to check format strings that follow the syntax used in printf and others.
+Hide the differences between different compilers in this GNUC_FORMAT_CHECK macro.
+Copied from Wireshark sources.
+*/
+#if __GNUC__ >= 2
+ #define GNUC_FORMAT_CHECK(archetype, string_index, first_to_check) __attribute__((format (archetype, string_index, first_to_check)))
+#else
+ #define GNUC_FORMAT_CHECK(archetype, string_index, first_to_check)
+#endif
+
/* Function name resolving: Call this after initialising the context, but before any utility function is called */
typedef void (*T_proc)(void);
typedef T_proc (*T_glGetProcAddress)(char const * procname);
void resolveFunctionPointers(T_glGetProcAddress p_glGetProcAddress);
/* The actual utility functions */
+void die(const char *msg, ...) GNUC_FORMAT_CHECK(printf, 1, 2);
void checkGlError(const char *what);
void initialise2dProjection();
void drawQuad(GLfloat red, GLfloat green, GLfloat blue, GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
{
T_proc proc = p_glGetProcAddress(name);
if (proc == NULL) {
- fprintf(stderr, "Error resolvung function %s\n", name);
- exit(1);
+ die("Error resolvung function %s\n", name);
}
return proc;
}
int majorVersion;
ssm >> majorVersion;
if (majorVersion < 2) {
- fprintf(stderr, "Need at least GL 2.0 to function properly, but detected version %d\n", majorVersion);
- exit(1);
+ die("Need at least GL 2.0 to function properly, but detected version %d\n", majorVersion);
}
#endif
#include <stdio.h>
#include <assert.h>
-#include <stdlib.h>
#include <GL/glxext.h>
#include <string>
printf("Using GLX version: %d.%d\n", glxMajor, glxMinor);
if (glxMajor < 1 || (glxMajor == 1 && glxMinor < 3)) {
// glXChooseFBConfig and glXCreateNewContext require GLX 1.3
- fprintf(stderr, "Need at least GLX 1.3 to function properly\n");
- exit(1);
+ die("Need at least GLX 1.3 to function properly\n");
}
// check for extension-based functions
funSwapIntervalMesa = (PFNGLXSWAPINTERVALMESAPROC)resolveGLXFunction("GLX_MESA_swap_control", "glXSwapIntervalMESA");
int count = 0;
GLXFBConfig *configs = glXChooseFBConfig(display, DefaultScreen(display), configAttribs, &count);
if (count < 1) {
- fprintf(stderr, "Failed to choose framebuffer configuration\n");
- exit(1);
+ die("Failed to choose framebuffer configuration\n");
}
config = configs[0];
XFree(configs);
context = glXCreateNewContext(display, config, GLX_RGBA_TYPE, NULL, GL_TRUE);
#else
if (!funCreateContextAttribsARB) {
- fprintf(stderr, "Cannot create GL3 context: GLX_ARB_create_context not supported\n");
- exit(1);
+ die("Cannot create GL3 context: GLX_ARB_create_context not supported\n");
}
context = funCreateContextAttribsARB(display, config, NULL, GL_TRUE, contextAttribs);
#endif
if (!context) {
- fprintf(stderr, "Error creating context\n");
- exit(1);
+ die("Error creating context\n");
}
glXMakeCurrent(display, window, context);
assert(glXIsDirect(display, context));
assert(context != None);
// check if swap interval value is supported
if (i < 0) {
- fprintf(stderr, "Cannot set swap interval to %d, must not be negative\n", i);
- exit(1);
+ die("Cannot set swap interval to %d, must not be negative\n", i);
}
// set it
if (funSwapIntervalExt)
else if (funSwapIntervalMesa)
funSwapIntervalMesa(i);
else {
- fprintf(stderr, "At least one of GLX_EXT_swap_control, GLX_MESA_swap_control must be supported by the system\n");
- abort();
+ die("At least one of GLX_EXT_swap_control, GLX_MESA_swap_control must be supported by the system\n");
}
}