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 
main(int,char **)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 
68      glBindTexture(GL_TEXTURE_2D, 0);
69      glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
70      glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
71      glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
72      glEnable(GL_TEXTURE_2D);
73      glColor4f(1,1,1,1);
74      glDisable(GL_DITHER);
75      glShadeModel(GL_FLAT);
76 
77      long long now, t;
78      int i;
79 
80      char* texels = (char*)malloc(512*512*2);
81      memset(texels,0xFF,512*512*2);
82 
83      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
84              512, 512, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, texels);
85 
86      char* dst = (char*)malloc(320*480*2);
87      memset(dst, 0, 320*480*2);
88      printf("307200 bytes memcpy\n");
89      for (i=0 ; i<4 ; i++) {
90          now = systemTime();
91          memcpy(dst, texels, 320*480*2);
92          t = systemTime();
93          printf("memcpy() time = %llu us\n", (t-now)/1000);
94          fflush(stdout);
95      }
96      free(dst);
97 
98      free(texels);
99 
100      setpriority(PRIO_PROCESS, 0, -20);
101 
102      printf("512x512 unmodified texture, 512x512 blit:\n");
103      glClear(GL_COLOR_BUFFER_BIT);
104      for (i=0 ; i<4 ; i++) {
105          GLint crop[4] = { 0, 512, 512, -512 };
106          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
107          now = systemTime();
108          glDrawTexiOES(0, 0, 0, 512, 512);
109          glFinish();
110          t = systemTime();
111          printf("glFinish() time = %llu us\n", (t-now)/1000);
112          fflush(stdout);
113          eglSwapBuffers(dpy, surface);
114      }
115 
116      printf("512x512 unmodified texture, 1x1 blit:\n");
117      glClear(GL_COLOR_BUFFER_BIT);
118      for (i=0 ; i<4 ; i++) {
119          GLint crop[4] = { 0, 1, 1, -1 };
120          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
121          now = systemTime();
122          glDrawTexiOES(0, 0, 0, 1, 1);
123          glFinish();
124          t = systemTime();
125          printf("glFinish() time = %llu us\n", (t-now)/1000);
126          fflush(stdout);
127          eglSwapBuffers(dpy, surface);
128      }
129 
130      printf("512x512 unmodified texture, 512x512 blit (x2):\n");
131      glClear(GL_COLOR_BUFFER_BIT);
132      for (i=0 ; i<4 ; i++) {
133          GLint crop[4] = { 0, 512, 512, -512 };
134          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
135          now = systemTime();
136          glDrawTexiOES(0, 0, 0, 512, 512);
137          glDrawTexiOES(0, 0, 0, 512, 512);
138          glFinish();
139          t = systemTime();
140          printf("glFinish() time = %llu us\n", (t-now)/1000);
141          fflush(stdout);
142          eglSwapBuffers(dpy, surface);
143      }
144 
145      printf("512x512 unmodified texture, 1x1 blit (x2):\n");
146      glClear(GL_COLOR_BUFFER_BIT);
147      for (i=0 ; i<4 ; i++) {
148          GLint crop[4] = { 0, 1, 1, -1 };
149          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
150          now = systemTime();
151          glDrawTexiOES(0, 0, 0, 1, 1);
152          glDrawTexiOES(0, 0, 0, 1, 1);
153          glFinish();
154          t = systemTime();
155          printf("glFinish() time = %llu us\n", (t-now)/1000);
156          fflush(stdout);
157          eglSwapBuffers(dpy, surface);
158      }
159 
160 
161      printf("512x512 (1x1 texel MODIFIED texture), 512x512 blit:\n");
162      glClear(GL_COLOR_BUFFER_BIT);
163      for (i=0 ; i<4 ; i++) {
164          uint16_t green = 0x7E0;
165          GLint crop[4] = { 0, 512, 512, -512 };
166          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
167          glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, &green);
168          now = systemTime();
169          glDrawTexiOES(0, 0, 0, 512, 512);
170          glFinish();
171          t = systemTime();
172          printf("glFinish() time = %llu us\n", (t-now)/1000);
173          fflush(stdout);
174          eglSwapBuffers(dpy, surface);
175      }
176 
177 
178      int16_t texel = 0xF800;
179      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
180              1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, &texel);
181 
182      printf("1x1 unmodified texture, 1x1 blit:\n");
183      glClear(GL_COLOR_BUFFER_BIT);
184      for (i=0 ; i<4 ; i++) {
185          GLint crop[4] = { 0, 1, 1, -1 };
186          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
187          now = systemTime();
188          glDrawTexiOES(0, 0, 0, 1, 1);
189          glFinish();
190          t = systemTime();
191          printf("glFinish() time = %llu us\n", (t-now)/1000);
192          eglSwapBuffers(dpy, surface);
193      }
194 
195      printf("1x1 unmodified texture, 512x512 blit:\n");
196      glClear(GL_COLOR_BUFFER_BIT);
197      for (i=0 ; i<4 ; i++) {
198          GLint crop[4] = { 0, 1, 1, -1 };
199          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
200          now = systemTime();
201          glDrawTexiOES(0, 0, 0, 512, 512);
202          glFinish();
203          t = systemTime();
204          printf("glFinish() time = %llu us\n", (t-now)/1000);
205          fflush(stdout);
206          eglSwapBuffers(dpy, surface);
207      }
208 
209      printf("1x1 (1x1 texel MODIFIED texture), 512x512 blit:\n");
210      glClear(GL_COLOR_BUFFER_BIT);
211      for (i=0 ; i<4 ; i++) {
212          uint16_t green = 0x7E0;
213          GLint crop[4] = { 0, 1, 1, -1 };
214          glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
215          glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, &green);
216          now = systemTime();
217          glDrawTexiOES(0, 0, 0, 1, 1);
218          glFinish();
219          t = systemTime();
220          printf("glFinish() time = %llu us\n", (t-now)/1000);
221          fflush(stdout);
222          eglSwapBuffers(dpy, surface);
223      }
224 
225      return 0;
226 }
227