projects
/
gltest.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
test for invalid FBConfigs; explicitly request an FBConfig suited for a WINDOW
[gltest.git]
/
eglbackend.cpp
diff --git
a/eglbackend.cpp
b/eglbackend.cpp
index 0d765e9cb64116d3a5455d0f8050e05548a8a38b..47e03844d0462497bcd1949c5d1f2f3bd8a6d56a 100644
(file)
--- a/
eglbackend.cpp
+++ b/
eglbackend.cpp
@@
-19,14
+19,13
@@
#include "eglbackend.h"
#include "glutil.h"
#include "eglbackend.h"
#include "glutil.h"
-#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <EGL/eglext.h>
#include <stdio.h>
#include <assert.h>
#include <EGL/eglext.h>
-#if !defined(CON_GL1) && !defined(CON_GLES2)
-#error "Valid GL contexts for EGL are: GL1, GLES2"
+#if !defined(CON_GL1) && !defined(CON_GL
3) && !defined(CON_GL
ES2)
+#error "Valid GL contexts for EGL are: GL1, GL
3, GL
ES2"
#endif
static const char *eglErrorToString(EGLint e)
#endif
static const char *eglErrorToString(EGLint e)
@@
-47,11
+46,10
@@
static const char *eglErrorToString(EGLint e)
#undef CASE
}
#undef CASE
}
-static void
exitEglError
(const char *what)
+static void
dieEgl
(const char *what)
{
EGLint e = eglGetError();
{
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[] = {
}
static const EGLint configAttribs[] = {
@@
-68,6
+66,10
@@
static const EGLint configAttribs[] = {
static const EGLint contextAttribs[] = {
#ifdef CON_GLES2
EGL_CONTEXT_CLIENT_VERSION, 2,
static const EGLint contextAttribs[] = {
#ifdef CON_GLES2
EGL_CONTEXT_CLIENT_VERSION, 2,
+#elif CON_GL3
+ EGL_CONTEXT_MAJOR_VERSION_KHR, 3,
+ EGL_CONTEXT_MINOR_VERSION_KHR, 0,
+ EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR,
#endif
EGL_NONE
};
#endif
EGL_NONE
};
@@
-79,30
+81,34
@@
VisualID EGLBackend::initialize(Display *xDisplay)
EGLint eglMajor, eglMinor;
display = eglGetDisplay(xDisplay);
if (display == EGL_NO_DISPLAY)
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)
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);
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);
+ if (eglMajor == 1 && eglMinor < 4) {
+ // Choosing the GL context version requires EGL 1.3, creating an OpenGL 3 context requires EGL 1.4
+ die("Need at least EGL 1.4 to function properly\n");
}
#ifdef CON_GLES2
if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE)
#else
if (eglBindAPI(EGL_OPENGL_API) == EGL_FALSE)
#endif
}
#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");
+ // check for the extension we need
+#ifdef CON_GL3
+ if (!haveEGLExtension("EGL_KHR_create_context")) {
+ die("Required EGL extension EGL_KHR_create_context is not supported\n");
+ }
+#endif
// get an appropriate config
EGLConfig configs[1];
EGLint count;
if (eglChooseConfig(display, configAttribs, configs, 1, &count) == EGL_FALSE){
// 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) {
}
if (count == 0) {
- fprintf(stderr, "Found no matching framebuffer configuration\n");
- exit(1);
+ die("Found no matching framebuffer configuration\n");
}
config = configs[0];
}
}
config = configs[0];
}
@@
-112,6
+118,13
@@
VisualID EGLBackend::initialize(Display *xDisplay)
return (VisualID)val;
}
return (VisualID)val;
}
+bool EGLBackend::haveEGLExtension(const std::string &name)
+{
+ assert(display != EGL_NO_DISPLAY);
+ std::string extensions = eglQueryString(display, EGL_EXTENSIONS);
+ return (std::string(" "+extensions+" ").find(" "+name+" ") != std::string::npos);
+}
+
void EGLBackend::createContext(Window window)
{
assert(display != EGL_NO_DISPLAY && context == EGL_NO_CONTEXT);
void EGLBackend::createContext(Window window)
{
assert(display != EGL_NO_DISPLAY && context == EGL_NO_CONTEXT);
@@
-119,9
+132,9
@@
void EGLBackend::createContext(Window window)
// create an EGL context and use it with the surface
context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
if (context == EGL_NO_CONTEXT)
// 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)
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);
printf("Using GL version: %s\n", glGetString(GL_VERSION));
// initialise GL utilities
resolveFunctionPointers(eglGetProcAddress);
@@
-144,7
+157,7
@@
void EGLBackend::swapBuffers() const
{
assert(context != EGL_NO_CONTEXT); // this implies the display is also initialized
if (eglSwapBuffers(display, surface) == EGL_FALSE)
{
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
}
void EGLBackend::setSwapInterval(int i) const
@@
-152,16
+165,14
@@
void EGLBackend::setSwapInterval(int i) const
assert(context != EGL_NO_CONTEXT);
// check if swap interval value is supported
if (i < 0) {
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) {
}
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)
}
// use it
if (eglSwapInterval(display, i) == EGL_FALSE)
-
exitEglError
("Failed to set swap interval");
+
dieEgl
("Failed to set swap interval");
}
}