1bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian/* 29ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** 39ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** Copyright 2006, The Android Open Source Project 49ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** 59ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License"); 69ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** you may not use this file except in compliance with the License. 79ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** You may obtain a copy of the License at 89ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** 99ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** http://www.apache.org/licenses/LICENSE-2.0 109ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** 119ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** Unless required by applicable law or agreed to in writing, software 129ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS, 139ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** See the License for the specific language governing permissions and 159ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian ** limitations under the License. 169ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian */ 17bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian 18bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <stdlib.h> 19bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <stdio.h> 20bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian 21bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <EGL/egl.h> 22bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <GLES/gl.h> 23bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <GLES/glext.h> 24bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian 25bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <utils/StopWatch.h> 26bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian#include <ui/FramebufferNativeWindow.h> 27265d9c076a588cf4cd811fbafd999c7ffe36641bMathias Agopian#include <ui/EGLUtils.h> 28bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian 29bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopianusing namespace android; 30bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian 31bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopianint main(int argc, char** argv) 32bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian{ 33bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian EGLint configAttribs[] = { 349ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 359ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGL_NONE 369ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian }; 379ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 389ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLint majorVersion; 399ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLint minorVersion; 409ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLContext context; 419ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLConfig config; 429ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLint numConfigs=0; 439ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLSurface surface; 449ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLint w, h; 459ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLDisplay dpy; 469ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 47e6f0f5c8fb4b6d249de5995545350fd95b2012f6Mathias Agopian 48e6f0f5c8fb4b6d249de5995545350fd95b2012f6Mathias Agopian EGLNativeWindowType window = android_createDisplaySurface(); 49e6f0f5c8fb4b6d249de5995545350fd95b2012f6Mathias Agopian 509ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 519ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglInitialize(dpy, 0 ,0) ;//&majorVersion, &minorVersion); 529ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglGetConfigs(dpy, NULL, 0, &numConfigs); 539ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian printf("# configs = %d\n", numConfigs); 549ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 559ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian status_t err = EGLUtils::selectConfigForNativeWindow( 569ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian dpy, configAttribs, window, &config); 579ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian if (err) { 589ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian fprintf(stderr, "couldn't find an EGLConfig matching the screen format\n"); 599ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian return 0; 609ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian } 619ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 629ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLint r,g,b,a; 639ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglGetConfigAttrib(dpy, config, EGL_RED_SIZE, &r); 649ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g); 659ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE, &b); 669ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglGetConfigAttrib(dpy, config, EGL_ALPHA_SIZE, &a); 679ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 689ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian surface = eglCreateWindowSurface(dpy, config, window, NULL); 699ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian if (surface == EGL_NO_SURFACE) { 709ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLint err = eglGetError(); 719ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian fprintf(stderr, "%s, config=%p, format = %d-%d-%d-%d\n", 729ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian EGLUtils::strerror(err), config, r,g,b,a); 739ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian return 0; 749ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian } else { 759ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian printf("config=%p, format = %d-%d-%d-%d\n", config, r,g,b,a); 769ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian } 779ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 789ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian context = eglCreateContext(dpy, config, NULL, NULL); 799ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglMakeCurrent(dpy, surface, surface, context); 809ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 819ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 829ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 839ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian printf("w=%d, h=%d\n", w, h); 849ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 859ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glDisable(GL_DITHER); 869ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glEnable(GL_BLEND); 879ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 889ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glViewport(0, 0, w, h); 899ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glOrthof(0, w, 0, h, 0, 1); 909ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 919ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglSwapInterval(dpy, 1); 929ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 939ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glClearColor(1,0,0,0); 949ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glClear(GL_COLOR_BUFFER_BIT); 959ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglSwapBuffers(dpy, surface); 969ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 979ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 989ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian int time = 10; 999ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian printf("screen should flash red/green quickly for %d s...\n", time); 1009ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 1019ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian int c = 0; 1029ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian nsecs_t start = systemTime(); 1039ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian nsecs_t t; 1049ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian do { 1059ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glClearColor(1,0,0,0); 1069ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glClear(GL_COLOR_BUFFER_BIT); 1079ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglSwapBuffers(dpy, surface); 1089ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glClearColor(0,1,0,0); 1099ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian glClear(GL_COLOR_BUFFER_BIT); 1109ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglSwapBuffers(dpy, surface); 1119ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian t = systemTime() - start; 1129ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian c += 2; 1139ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian } while (int(ns2s(t))<=time); 1149ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 1159ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian double p = (double(t) / c) / 1000000000.0; 1169ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian printf("refresh-rate is %f fps (%f ms)\n", 1.0f/p, p*1000.0); 1179ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 1189ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian eglTerminate(dpy); 1199ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian 1209ca4dd6011e30cbb3bc40cf0bba7d11362b8bc38Mathias Agopian return 0; 121bb99ffb4db008441e6ac4236d8a48b6e2b0c01d9Mathias Agopian} 122