Home | History | Annotate | Download | only in swapinterval
      1 /*
      2  **
      3  ** Copyright 2006, The Android Open Source Project
      4  **
      5  ** Licensed under the Apache License, Version 2.0 (the "License");
      6  ** you may not use this file except in compliance with the License.
      7  ** You may obtain a copy of the License at
      8  **
      9  **     http://www.apache.org/licenses/LICENSE-2.0
     10  **
     11  ** Unless required by applicable law or agreed to in writing, software
     12  ** distributed under the License is distributed on an "AS IS" BASIS,
     13  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  ** See the License for the specific language governing permissions and
     15  ** limitations under the License.
     16  */
     17 
     18 #include <stdlib.h>
     19 #include <stdio.h>
     20 
     21 #include <EGL/egl.h>
     22 #include <GLES/gl.h>
     23 #include <GLES/glext.h>
     24 
     25 #include <utils/StopWatch.h>
     26 #include <WindowSurface.h>
     27 #include <EGLUtils.h>
     28 
     29 using namespace android;
     30 
     31 int main(int argc, char** argv)
     32 {
     33     EGLint configAttribs[] = {
     34             EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
     35             EGL_NONE
     36     };
     37 
     38     EGLint majorVersion;
     39     EGLint minorVersion;
     40     EGLContext context;
     41     EGLConfig config;
     42     EGLint numConfigs=0;
     43     EGLSurface surface;
     44     EGLint w, h;
     45     EGLDisplay dpy;
     46 
     47 
     48     WindowSurface windowSurface;
     49     EGLNativeWindowType window = windowSurface.getSurface();
     50 
     51     dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
     52     eglInitialize(dpy, &majorVersion, &minorVersion);
     53     eglGetConfigs(dpy, NULL, 0, &numConfigs);
     54     printf("# configs = %d\n", numConfigs);
     55 
     56     status_t err = EGLUtils::selectConfigForNativeWindow(
     57             dpy, configAttribs, window, &config);
     58     if (err) {
     59         fprintf(stderr, "error: %s", EGLUtils::strerror(eglGetError()));
     60         eglTerminate(dpy);
     61         return 0;
     62     }
     63 
     64     EGLint r,g,b,a, vid;
     65     eglGetConfigAttrib(dpy, config, EGL_RED_SIZE,   &r);
     66     eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g);
     67     eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE,  &b);
     68     eglGetConfigAttrib(dpy, config, EGL_ALPHA_SIZE, &a);
     69     eglGetConfigAttrib(dpy, config, EGL_NATIVE_VISUAL_ID, &vid);
     70 
     71     surface = eglCreateWindowSurface(dpy, config, window, NULL);
     72     if (surface == EGL_NO_SURFACE) {
     73         EGLint err = eglGetError();
     74         fprintf(stderr, "error: %s, config=%p, format = %d-%d-%d-%d, visual-id = %d\n",
     75                 EGLUtils::strerror(err), config, r,g,b,a, vid);
     76         eglTerminate(dpy);
     77         return 0;
     78     } else {
     79         printf("config=%p, format = %d-%d-%d-%d, visual-id = %d\n",
     80                 config, r,g,b,a, vid);
     81     }
     82 
     83     context = eglCreateContext(dpy, config, NULL, NULL);
     84     eglMakeCurrent(dpy, surface, surface, context);
     85     eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
     86     eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
     87 
     88     printf("w=%d, h=%d\n", w, h);
     89 
     90     glDisable(GL_DITHER);
     91     glEnable(GL_BLEND);
     92 
     93     glViewport(0, 0, w, h);
     94     glOrthof(0, w, 0, h, 0, 1);
     95 
     96     eglSwapInterval(dpy, 1);
     97 
     98     glClearColor(1,0,0,0);
     99     glClear(GL_COLOR_BUFFER_BIT);
    100     eglSwapBuffers(dpy, surface);
    101 
    102 
    103     int time = 10;
    104     printf("screen should flash red/green quickly for %d s...\n", time);
    105 
    106     int c = 0;
    107     nsecs_t start = systemTime();
    108     nsecs_t t;
    109     do {
    110         glClearColor(1,0,0,0);
    111         glClear(GL_COLOR_BUFFER_BIT);
    112         eglSwapBuffers(dpy, surface);
    113         glClearColor(0,1,0,0);
    114         glClear(GL_COLOR_BUFFER_BIT);
    115         eglSwapBuffers(dpy, surface);
    116         t = systemTime() - start;
    117         c += 2;
    118     } while (int(ns2s(t))<=time);
    119 
    120     double p =  (double(t) / c) / 1000000000.0;
    121     printf("refresh-rate is %f fps (%f ms)\n", 1.0f/p, p*1000.0);
    122 
    123     eglTerminate(dpy);
    124 
    125     return 0;
    126 }
    127