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 
main(int argc,char ** argv)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