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
8653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian#include <ui/FramebufferNativeWindow.h>
9870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#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;
431d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian     if (!usePbuffer) {
441d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian         window = android_createDisplaySurface();
451d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian     }
461d3bcd6e217e7ef177287d06f6fdf6149f453830Mathias Agopian
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglInitialize(dpy, &majorVersion, &minorVersion);
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     if (!usePbuffer) {
50653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian         EGLUtils::selectConfigForNativeWindow(
51653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian                 dpy, s_configAttribs, window, &config);
52cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         surface = eglCreateWindowSurface(dpy, config, window, NULL);
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     } else {
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         printf("using pbuffer\n");
55653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian         eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs);
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         EGLint attribs[] = { EGL_WIDTH, 320, EGL_HEIGHT, 480, EGL_NONE };
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         surface = eglCreatePbufferSurface(dpy, config, attribs);
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         if (surface == EGL_NO_SURFACE) {
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             printf("eglCreatePbufferSurface error %x\n", eglGetError());
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         }
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     }
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     context = eglCreateContext(dpy, config, NULL, NULL);
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglMakeCurrent(dpy, surface, surface, context);
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     GLint dim = w<h ? w : h;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
68cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glViewport(0, 0, w, h);
69cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glMatrixMode(GL_PROJECTION);
70cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glLoadIdentity();
71687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian     glOrthof(0, w, 0, h, 0, 1);
72cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
73cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glClearColor(0,0,0,0);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glClear(GL_COLOR_BUFFER_BIT);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     GLint crop[4] = { 0, 4, 4, -4 };
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glBindTexture(GL_TEXTURE_2D, 0);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glEnable(GL_TEXTURE_2D);
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     glColor4f(1,1,1,1);
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     // packing is always 4
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint8_t t8[]  = {
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x00, 0x55, 0x00, 0x55,
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAA, 0xFF, 0xAA, 0xFF,
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x00, 0x55, 0x00, 0x55,
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAA, 0xFF, 0xAA, 0xFF  };
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint16_t t16[]  = {
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0x5555, 0x0000, 0x5555,
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF,
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0x5555, 0x0000, 0x5555,
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF  };
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint16_t t5551[]  = {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0xFFFF, 0x0000, 0xFFFF,
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFFFF, 0x0000, 0xFFFF, 0x0000,
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0x0000, 0xFFFF, 0x0000, 0xFFFF,
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFFFF, 0x0000, 0xFFFF, 0x0000  };
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     uint32_t t32[]  = {
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000,
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF00FF00, 0xFFFF0000, 0xFF000000, 0xFF0000FF,
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF00FFFF, 0xFF00FF00, 0x00FF00FF, 0xFFFFFF00,
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             0xFF000000, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     };
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     switch(test)
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 1:
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, t8);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 2:
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, t16);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 3:
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, t16);
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 4:
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, t16);
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 5:
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, t5551);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     case 6:
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, t32);
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         break;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     }
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     //glDrawTexiOES(0, 0, 0, dim, dim);
140cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
141cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     const GLfloat vertices[4][2] = {
142cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,    0   },
143cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,    dim },
144cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { dim,  dim },
145cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { dim,  0   }
146cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     };
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     const GLfloat texCoords[4][2] = {
149cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,  0 },
150cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 0,  1 },
151cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 1,  1 },
152cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             { 1,  0 }
153cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     };
154cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     if (!usePbuffer) {
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project         eglSwapBuffers(dpy, surface);
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     }
158687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian
159cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     glMatrixMode(GL_MODELVIEW);
1606c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian     glScissor(0,dim,dim,h-dim);
1616c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian     glDisable(GL_SCISSOR_TEST);
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
163cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     for (int y=0 ; y<dim ; y++) {
1646c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian         //glDisable(GL_SCISSOR_TEST);
165cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glClear(GL_COLOR_BUFFER_BIT);
166687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian
1676c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian         //glEnable(GL_SCISSOR_TEST);
1686c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian
169687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#if USE_DRAW_TEXTURE && GL_OES_draw_texture
170687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glDrawTexiOES(0, y, 1, dim, dim);
171687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#else
172687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glLoadIdentity();
173687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glTranslatef(0, y, 0);
174cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glEnableClientState(GL_VERTEX_ARRAY);
175cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
176cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glVertexPointer(2, GL_FLOAT, 0, vertices);
177cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
178687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
179687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#endif
180cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
181cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         if (!usePbuffer) {
182cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             eglSwapBuffers(dpy, surface);
183cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         } else {
184cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian             glFinish();
185cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian         }
186cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian     }
187cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     eglTerminate(dpy);
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return 0;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
191