1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <stdlib.h> 18#include <stdio.h> 19#include <time.h> 20#include <sched.h> 21#include <sys/resource.h> 22 23#include <EGL/egl.h> 24#include <GLES/gl.h> 25#include <GLES/glext.h> 26 27#include <utils/Timers.h> 28 29#include <WindowSurface.h> 30#include <EGLUtils.h> 31 32using namespace android; 33 34int main(int argc, char** argv) 35{ 36 EGLint configAttribs[] = { 37 EGL_DEPTH_SIZE, 0, 38 EGL_NONE 39 }; 40 41 EGLint majorVersion; 42 EGLint minorVersion; 43 EGLContext context; 44 EGLConfig config; 45 EGLSurface surface; 46 EGLint w, h; 47 EGLDisplay dpy; 48 49 WindowSurface windowSurface; 50 EGLNativeWindowType window = windowSurface.getSurface(); 51 52 dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 53 eglInitialize(dpy, &majorVersion, &minorVersion); 54 55 status_t err = EGLUtils::selectConfigForNativeWindow( 56 dpy, configAttribs, window, &config); 57 if (err) { 58 fprintf(stderr, "couldn't find an EGLConfig matching the screen format\n"); 59 return 0; 60 } 61 62 surface = eglCreateWindowSurface(dpy, config, window, NULL); 63 context = eglCreateContext(dpy, config, NULL, NULL); 64 eglMakeCurrent(dpy, surface, surface, context); 65 eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 66 eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 67 GLint dim = w<h ? w : h; 68 69 glBindTexture(GL_TEXTURE_2D, 0); 70 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 71 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 72 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 73 glEnable(GL_TEXTURE_2D); 74 glColor4f(1,1,1,1); 75 glDisable(GL_DITHER); 76 glShadeModel(GL_FLAT); 77 78 long long now, t; 79 int i; 80 81 char* texels = (char*)malloc(512*512*2); 82 memset(texels,0xFF,512*512*2); 83 84 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 85 512, 512, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, texels); 86 87 char* dst = (char*)malloc(320*480*2); 88 memset(dst, 0, 320*480*2); 89 printf("307200 bytes memcpy\n"); 90 for (i=0 ; i<4 ; i++) { 91 now = systemTime(); 92 memcpy(dst, texels, 320*480*2); 93 t = systemTime(); 94 printf("memcpy() time = %llu us\n", (t-now)/1000); 95 fflush(stdout); 96 } 97 free(dst); 98 99 free(texels); 100 101 setpriority(PRIO_PROCESS, 0, -20); 102 103 printf("512x512 unmodified texture, 512x512 blit:\n"); 104 glClear(GL_COLOR_BUFFER_BIT); 105 for (i=0 ; i<4 ; i++) { 106 GLint crop[4] = { 0, 512, 512, -512 }; 107 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 108 now = systemTime(); 109 glDrawTexiOES(0, 0, 0, 512, 512); 110 glFinish(); 111 t = systemTime(); 112 printf("glFinish() time = %llu us\n", (t-now)/1000); 113 fflush(stdout); 114 eglSwapBuffers(dpy, surface); 115 } 116 117 printf("512x512 unmodified texture, 1x1 blit:\n"); 118 glClear(GL_COLOR_BUFFER_BIT); 119 for (i=0 ; i<4 ; i++) { 120 GLint crop[4] = { 0, 1, 1, -1 }; 121 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 122 now = systemTime(); 123 glDrawTexiOES(0, 0, 0, 1, 1); 124 glFinish(); 125 t = systemTime(); 126 printf("glFinish() time = %llu us\n", (t-now)/1000); 127 fflush(stdout); 128 eglSwapBuffers(dpy, surface); 129 } 130 131 printf("512x512 unmodified texture, 512x512 blit (x2):\n"); 132 glClear(GL_COLOR_BUFFER_BIT); 133 for (i=0 ; i<4 ; i++) { 134 GLint crop[4] = { 0, 512, 512, -512 }; 135 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 136 now = systemTime(); 137 glDrawTexiOES(0, 0, 0, 512, 512); 138 glDrawTexiOES(0, 0, 0, 512, 512); 139 glFinish(); 140 t = systemTime(); 141 printf("glFinish() time = %llu us\n", (t-now)/1000); 142 fflush(stdout); 143 eglSwapBuffers(dpy, surface); 144 } 145 146 printf("512x512 unmodified texture, 1x1 blit (x2):\n"); 147 glClear(GL_COLOR_BUFFER_BIT); 148 for (i=0 ; i<4 ; i++) { 149 GLint crop[4] = { 0, 1, 1, -1 }; 150 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 151 now = systemTime(); 152 glDrawTexiOES(0, 0, 0, 1, 1); 153 glDrawTexiOES(0, 0, 0, 1, 1); 154 glFinish(); 155 t = systemTime(); 156 printf("glFinish() time = %llu us\n", (t-now)/1000); 157 fflush(stdout); 158 eglSwapBuffers(dpy, surface); 159 } 160 161 162 printf("512x512 (1x1 texel MODIFIED texture), 512x512 blit:\n"); 163 glClear(GL_COLOR_BUFFER_BIT); 164 for (i=0 ; i<4 ; i++) { 165 uint16_t green = 0x7E0; 166 GLint crop[4] = { 0, 512, 512, -512 }; 167 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 168 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, &green); 169 now = systemTime(); 170 glDrawTexiOES(0, 0, 0, 512, 512); 171 glFinish(); 172 t = systemTime(); 173 printf("glFinish() time = %llu us\n", (t-now)/1000); 174 fflush(stdout); 175 eglSwapBuffers(dpy, surface); 176 } 177 178 179 int16_t texel = 0xF800; 180 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 181 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, &texel); 182 183 printf("1x1 unmodified texture, 1x1 blit:\n"); 184 glClear(GL_COLOR_BUFFER_BIT); 185 for (i=0 ; i<4 ; i++) { 186 GLint crop[4] = { 0, 1, 1, -1 }; 187 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 188 now = systemTime(); 189 glDrawTexiOES(0, 0, 0, 1, 1); 190 glFinish(); 191 t = systemTime(); 192 printf("glFinish() time = %llu us\n", (t-now)/1000); 193 eglSwapBuffers(dpy, surface); 194 } 195 196 printf("1x1 unmodified texture, 512x512 blit:\n"); 197 glClear(GL_COLOR_BUFFER_BIT); 198 for (i=0 ; i<4 ; i++) { 199 GLint crop[4] = { 0, 1, 1, -1 }; 200 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 201 now = systemTime(); 202 glDrawTexiOES(0, 0, 0, 512, 512); 203 glFinish(); 204 t = systemTime(); 205 printf("glFinish() time = %llu us\n", (t-now)/1000); 206 fflush(stdout); 207 eglSwapBuffers(dpy, surface); 208 } 209 210 printf("1x1 (1x1 texel MODIFIED texture), 512x512 blit:\n"); 211 glClear(GL_COLOR_BUFFER_BIT); 212 for (i=0 ; i<4 ; i++) { 213 uint16_t green = 0x7E0; 214 GLint crop[4] = { 0, 1, 1, -1 }; 215 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 216 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, &green); 217 now = systemTime(); 218 glDrawTexiOES(0, 0, 0, 1, 1); 219 glFinish(); 220 t = systemTime(); 221 printf("glFinish() time = %llu us\n", (t-now)/1000); 222 fflush(stdout); 223 eglSwapBuffers(dpy, surface); 224 } 225 226 return 0; 227} 228