Home | History | Annotate | Download | only in finish
      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 
     32 using namespace android;
     33 
     34 int 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