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 <ui/FramebufferNativeWindow.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     EGLNativeWindowType window = android_createDisplaySurface();
     49 
     50     dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
     51     eglInitialize(dpy, &majorVersion, &minorVersion);
     52     eglGetConfigs(dpy, NULL, 0, &numConfigs);
     53     printf("# configs = %d\n", numConfigs);
     54 
     55     status_t err = EGLUtils::selectConfigForNativeWindow(
     56             dpy, configAttribs, window, &config);
     57     if (err) {
     58         fprintf(stderr, "error: %s", EGLUtils::strerror(eglGetError()));
     59         eglTerminate(dpy);
     60         return 0;
     61     }
     62 
     63     EGLint r,g,b,a, vid;
     64     eglGetConfigAttrib(dpy, config, EGL_RED_SIZE,   &r);
     65     eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g);
     66     eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE,  &b);
     67     eglGetConfigAttrib(dpy, config, EGL_ALPHA_SIZE, &a);
     68     eglGetConfigAttrib(dpy, config, EGL_NATIVE_VISUAL_ID, &vid);
     69 
     70     surface = eglCreateWindowSurface(dpy, config, window, NULL);
     71     if (surface == EGL_NO_SURFACE) {
     72         EGLint err = eglGetError();
     73         fprintf(stderr, "error: %s, config=%p, format = %d-%d-%d-%d, visual-id = %d\n",
     74                 EGLUtils::strerror(err), config, r,g,b,a, vid);
     75         eglTerminate(dpy);
     76         return 0;
     77     } else {
     78         printf("config=%p, format = %d-%d-%d-%d, visual-id = %d\n",
     79                 config, r,g,b,a, vid);
     80     }
     81 
     82     context = eglCreateContext(dpy, config, NULL, NULL);
     83     eglMakeCurrent(dpy, surface, surface, context);
     84     eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
     85     eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
     86 
     87     printf("w=%d, h=%d\n", w, h);
     88 
     89     glDisable(GL_DITHER);
     90     glEnable(GL_BLEND);
     91 
     92     glViewport(0, 0, w, h);
     93     glOrthof(0, w, 0, h, 0, 1);
     94 
     95     eglSwapInterval(dpy, 1);
     96 
     97     glClearColor(1,0,0,0);
     98     glClear(GL_COLOR_BUFFER_BIT);
     99     eglSwapBuffers(dpy, surface);
    100 
    101 
    102     int time = 10;
    103     printf("screen should flash red/green quickly for %d s...\n", time);
    104 
    105     int c = 0;
    106     nsecs_t start = systemTime();
    107     nsecs_t t;
    108     do {
    109         glClearColor(1,0,0,0);
    110         glClear(GL_COLOR_BUFFER_BIT);
    111         eglSwapBuffers(dpy, surface);
    112         glClearColor(0,1,0,0);
    113         glClear(GL_COLOR_BUFFER_BIT);
    114         eglSwapBuffers(dpy, surface);
    115         t = systemTime() - start;
    116         c += 2;
    117     } while (int(ns2s(t))<=time);
    118 
    119     double p =  (double(t) / c) / 1000000000.0;
    120     printf("refresh-rate is %f fps (%f ms)\n", 1.0f/p, p*1000.0);
    121 
    122     eglTerminate(dpy);
    123 
    124     return 0;
    125 }
    126