1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <WindowSurface.h>
96ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <EGLUtils.h>
10653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian
11653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopianusing namespace android;
12653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian
13687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#define USE_DRAW_TEXTURE 1
14687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint main(int argc, char** argv)
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (argc!=2 && argc!=3) {
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        printf("usage: %s <0-6> [pbuffer]\n", argv[0]);
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int test = atoi(argv[1]);
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int usePbuffer = argc==3 && !strcmp(argv[2], "pbuffer");
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint s_configAttribs[] = {
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGL_SURFACE_TYPE, EGL_PBUFFER_BIT|EGL_WINDOW_BIT,
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGL_RED_SIZE,       5,
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGL_GREEN_SIZE,     6,
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGL_BLUE_SIZE,      5,
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGL_NONE
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     };
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLint numConfigs = -1;
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLint majorVersion;
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLint minorVersion;
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLConfig config;
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLContext context;
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLSurface surface;
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLint w, h;
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     EGLDisplay dpy;
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
421d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian     EGLNativeWindowType window = 0;
436ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden     WindowSurface* windowSurface = NULL;
441d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian     if (!usePbuffer) {
456ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden         windowSurface = new WindowSurface();
466ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden         window = windowSurface->getSurface();
471d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian     }
481d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglInitialize(dpy, &majorVersion, &minorVersion);
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     if (!usePbuffer) {
52653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian         EGLUtils::selectConfigForNativeWindow(
53653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian                 dpy, s_configAttribs, window, &config);
54cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         surface = eglCreateWindowSurface(dpy, config, window, NULL);
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     } else {
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         printf("using pbuffer\n");
57653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian         eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs);
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGLint attribs[] = { EGL_WIDTH, 320, EGL_HEIGHT, 480, EGL_NONE };
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         surface = eglCreatePbufferSurface(dpy, config, attribs);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         if (surface == EGL_NO_SURFACE) {
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             printf("eglCreatePbufferSurface error %x\n", eglGetError());
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         }
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     }
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     context = eglCreateContext(dpy, config, NULL, NULL);
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglMakeCurrent(dpy, surface, surface, context);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     GLint dim = w<h ? w : h;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glViewport(0, 0, w, h);
71cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glMatrixMode(GL_PROJECTION);
72cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glLoadIdentity();
73687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian     glOrthof(0, w, 0, h, 0, 1);
74cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
75cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glClearColor(0,0,0,0);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glClear(GL_COLOR_BUFFER_BIT);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     GLint crop[4] = { 0, 4, 4, -4 };
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glBindTexture(GL_TEXTURE_2D, 0);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glEnable(GL_TEXTURE_2D);
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glColor4f(1,1,1,1);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     // packing is always 4
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint8_t t8[]  = {
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x00, 0x55, 0x00, 0x55,
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAA, 0xFF, 0xAA, 0xFF,
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x00, 0x55, 0x00, 0x55,
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAA, 0xFF, 0xAA, 0xFF  };
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint16_t t16[]  = {
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0x5555, 0x0000, 0x5555,
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF,
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0x5555, 0x0000, 0x5555,
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF  };
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint16_t t5551[]  = {
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0xFFFF, 0x0000, 0xFFFF,
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFFFF, 0x0000, 0xFFFF, 0x0000,
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0xFFFF, 0x0000, 0xFFFF,
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFFFF, 0x0000, 0xFFFF, 0x0000  };
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint32_t t32[]  = {
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000,
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF00FF00, 0xFFFF0000, 0xFF000000, 0xFF0000FF,
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF00FFFF, 0xFF00FF00, 0x00FF00FF, 0xFFFFFF00,
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF000000, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     };
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     switch(test)
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     {
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 1:
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, t8);
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 2:
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, t16);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 3:
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, t16);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 4:
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, t16);
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 5:
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, t5551);
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 6:
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, t32);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     }
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
141cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     //glDrawTexiOES(0, 0, 0, dim, dim);
142cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
143cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     const GLfloat vertices[4][2] = {
144cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,    0   },
145cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,    dim },
146cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { dim,  dim },
147cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { dim,  0   }
148cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     };
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     const GLfloat texCoords[4][2] = {
151cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,  0 },
152cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,  1 },
153cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 1,  1 },
154cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 1,  0 }
155cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     };
156cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     if (!usePbuffer) {
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         eglSwapBuffers(dpy, surface);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     }
160687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian
161cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glMatrixMode(GL_MODELVIEW);
1626c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian     glScissor(0,dim,dim,h-dim);
1636c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian     glDisable(GL_SCISSOR_TEST);
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     for (int y=0 ; y<dim ; y++) {
1666c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian         //glDisable(GL_SCISSOR_TEST);
167cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glClear(GL_COLOR_BUFFER_BIT);
168687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian
1696c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian         //glEnable(GL_SCISSOR_TEST);
1706c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian
171687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#if USE_DRAW_TEXTURE && GL_OES_draw_texture
172687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glDrawTexiOES(0, y, 1, dim, dim);
173687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#else
174687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glLoadIdentity();
175687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glTranslatef(0, y, 0);
176cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glEnableClientState(GL_VERTEX_ARRAY);
177cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
178cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glVertexPointer(2, GL_FLOAT, 0, vertices);
179cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
180687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
181687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#endif
182cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
183cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         if (!usePbuffer) {
184cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             eglSwapBuffers(dpy, surface);
185cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         } else {
186cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             glFinish();
187cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         }
188cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     }
189cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglTerminate(dpy);
1916ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden     delete windowSurface;
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return 0;
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
194