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