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