X-Git-Url: https://git.ralfj.de/gltest.git/blobdiff_plain/aa4575e1aa768daff8ca10c7a8a06aa0603e998f..08f1ed05c2541efad748e78db01af569d84c3363:/eglbackend.cpp?ds=sidebyside diff --git a/eglbackend.cpp b/eglbackend.cpp index 359d54a..ac7ab38 100644 --- a/eglbackend.cpp +++ b/eglbackend.cpp @@ -1,3 +1,21 @@ +/* gltest - small OpenGL tearing test program + * Copyright (C) 2012-2013 Ralf Jung + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + #include "eglbackend.h" #include @@ -31,8 +49,7 @@ static void exitEglError(const char *what) exit(1); } -/* attributes for a double buffered visual in RGBA format with at least -* 4 bits per color */ +// attributes for a visual in RGBA format with at least 4 bits per color static const EGLint config_attribs[] = { EGL_RED_SIZE, 4, EGL_GREEN_SIZE, 4, @@ -47,16 +64,16 @@ VisualID EGLBackend::initialize(Display *xDisplay) // get connection and bind API EGLint eglMajor, eglMinor; display = eglGetDisplay(xDisplay); - if (display == EGL_NO_DISPLAY) + if (display == EGL_NO_DISPLAY) exitEglError("Failed to get EGL display"); - if (eglInitialize(display, &eglMajor, &eglMinor) == EGL_FALSE) + if (eglInitialize(display, &eglMajor, &eglMinor) == EGL_FALSE) exitEglError("Failed to initialize EGL"); printf("Using EGL version %d.%d\n", eglMajor, eglMinor); eglBindAPI(EGL_OPENGL_API); // get an appropriate config EGLConfig configs[1]; EGLint count; - if (eglChooseConfig(display, config_attribs, configs, 1, &count) == EGL_FALSE || count == 0) + if (eglChooseConfig(display, config_attribs, configs, 1, &count) == EGL_FALSE || count == 0) exitEglError("Failed to choose config"); config = configs[0]; } @@ -70,7 +87,7 @@ void EGLBackend::createContext(Window window) { assert(display != EGL_NO_DISPLAY && context == EGL_NO_CONTEXT); surface = eglCreateWindowSurface(display, config, window, NULL); - /* create an EGL context and use it with the surface */ + // create an EGL context and use it with the surface context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL); if (context == EGL_NO_CONTEXT) exitEglError("Failed to create context"); @@ -94,11 +111,26 @@ EGLBackend::~EGLBackend() void EGLBackend::swapBuffers() const { assert(context != EGL_NO_CONTEXT); // this implies the display is also initialized - eglSwapBuffers(display, surface); + if (eglSwapBuffers(display, surface) == EGL_FALSE) + exitEglError("Failed to swap buffers"); } void EGLBackend::setSwapInterval(int i) const { assert(context != EGL_NO_CONTEXT); - eglSwapInterval(display, i); + // check if swap interval value is supported + EGLint val; + eglGetConfigAttrib(display, config, EGL_MIN_SWAP_INTERVAL, &val); + if (i < val) { + fprintf(stderr, "Cannot set swap interval to %d, minimum supported value is %d\n", i, val); + exit(1); + } + 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); + } + // use it + if (eglSwapInterval(display, i) == EGL_FALSE) + exitEglError("Failed to set swap interval"); }