|  | /* | 
|  | ** | 
|  | ** Copyright 2006, The Android Open Source Project | 
|  | ** | 
|  | ** Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | ** you may not use this file except in compliance with the License. | 
|  | ** You may obtain a copy of the License at | 
|  | ** | 
|  | **     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | ** | 
|  | ** Unless required by applicable law or agreed to in writing, software | 
|  | ** distributed under the License is distributed on an "AS IS" BASIS, | 
|  | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | ** See the License for the specific language governing permissions and | 
|  | ** limitations under the License. | 
|  | */ | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include <stdio.h> | 
|  |  | 
|  | #include <EGL/egl.h> | 
|  | #include <GLES/gl.h> | 
|  | #include <GLES/glext.h> | 
|  |  | 
|  | #include <utils/StopWatch.h> | 
|  | #include <WindowSurface.h> | 
|  | #include <EGLUtils.h> | 
|  |  | 
|  | using namespace android; | 
|  |  | 
|  | int main(int /*argc*/, char** /*argv*/) | 
|  | { | 
|  | EGLint configAttribs[] = { | 
|  | EGL_SURFACE_TYPE,   EGL_WINDOW_BIT, | 
|  | EGL_NONE | 
|  | }; | 
|  |  | 
|  | EGLint majorVersion; | 
|  | EGLint minorVersion; | 
|  | EGLContext context; | 
|  | EGLConfig config; | 
|  | EGLint numConfigs=0; | 
|  | EGLSurface surface; | 
|  | EGLint w, h; | 
|  | EGLDisplay dpy; | 
|  |  | 
|  |  | 
|  | WindowSurface windowSurface; | 
|  | EGLNativeWindowType window = windowSurface.getSurface(); | 
|  |  | 
|  | dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); | 
|  | eglInitialize(dpy, &majorVersion, &minorVersion); | 
|  | eglGetConfigs(dpy, NULL, 0, &numConfigs); | 
|  | printf("# configs = %d\n", numConfigs); | 
|  |  | 
|  | status_t err = EGLUtils::selectConfigForNativeWindow( | 
|  | dpy, configAttribs, window, &config); | 
|  | if (err) { | 
|  | fprintf(stderr, "error: %s", EGLUtils::strerror(eglGetError())); | 
|  | eglTerminate(dpy); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | EGLint r,g,b,a, vid; | 
|  | eglGetConfigAttrib(dpy, config, EGL_RED_SIZE,   &r); | 
|  | eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g); | 
|  | eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE,  &b); | 
|  | eglGetConfigAttrib(dpy, config, EGL_ALPHA_SIZE, &a); | 
|  | eglGetConfigAttrib(dpy, config, EGL_NATIVE_VISUAL_ID, &vid); | 
|  |  | 
|  | surface = eglCreateWindowSurface(dpy, config, window, NULL); | 
|  | if (surface == EGL_NO_SURFACE) { | 
|  | EGLint err = eglGetError(); | 
|  | fprintf(stderr, "error: %s, config=%p, format = %d-%d-%d-%d, visual-id = %d\n", | 
|  | EGLUtils::strerror(err), config, r,g,b,a, vid); | 
|  | eglTerminate(dpy); | 
|  | return 0; | 
|  | } else { | 
|  | printf("config=%p, format = %d-%d-%d-%d, visual-id = %d\n", | 
|  | config, r,g,b,a, vid); | 
|  | } | 
|  |  | 
|  | context = eglCreateContext(dpy, config, NULL, NULL); | 
|  | eglMakeCurrent(dpy, surface, surface, context); | 
|  | eglQuerySurface(dpy, surface, EGL_WIDTH, &w); | 
|  | eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); | 
|  |  | 
|  | printf("w=%d, h=%d\n", w, h); | 
|  |  | 
|  | glDisable(GL_DITHER); | 
|  | glEnable(GL_BLEND); | 
|  |  | 
|  | glViewport(0, 0, w, h); | 
|  | glOrthof(0, w, 0, h, 0, 1); | 
|  |  | 
|  | eglSwapInterval(dpy, 1); | 
|  |  | 
|  | glClearColor(1,0,0,0); | 
|  | glClear(GL_COLOR_BUFFER_BIT); | 
|  | eglSwapBuffers(dpy, surface); | 
|  |  | 
|  |  | 
|  | int time = 10; | 
|  | printf("screen should flash red/green quickly for %d s...\n", time); | 
|  |  | 
|  | int c = 0; | 
|  | nsecs_t start = systemTime(); | 
|  | nsecs_t t; | 
|  | do { | 
|  | glClearColor(1,0,0,0); | 
|  | glClear(GL_COLOR_BUFFER_BIT); | 
|  | eglSwapBuffers(dpy, surface); | 
|  | glClearColor(0,1,0,0); | 
|  | glClear(GL_COLOR_BUFFER_BIT); | 
|  | eglSwapBuffers(dpy, surface); | 
|  | t = systemTime() - start; | 
|  | c += 2; | 
|  | } while (int(ns2s(t))<=time); | 
|  |  | 
|  | double p =  (double(t) / c) / 1000000000.0; | 
|  | printf("refresh-rate is %f fps (%f ms)\n", 1.0f/p, p*1000.0); | 
|  |  | 
|  | eglTerminate(dpy); | 
|  |  | 
|  | return 0; | 
|  | } |