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 1433bded9177b579d96d72397d73b8f85bba47ec438Chih-Hung Hsieh const GLfloat fdim = dim; 144cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian const GLfloat vertices[4][2] = { 1453bded9177b579d96d72397d73b8f85bba47ec438Chih-Hung Hsieh { 0, 0 }, 1463bded9177b579d96d72397d73b8f85bba47ec438Chih-Hung Hsieh { 0, fdim }, 1473bded9177b579d96d72397d73b8f85bba47ec438Chih-Hung Hsieh { fdim, fdim }, 1483bded9177b579d96d72397d73b8f85bba47ec438Chih-Hung Hsieh { fdim, 0 } 149cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian }; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 151cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian const GLfloat texCoords[4][2] = { 152cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian { 0, 0 }, 153cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian { 0, 1 }, 154cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian { 1, 1 }, 155cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian { 1, 0 } 156cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian }; 157cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!usePbuffer) { 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglSwapBuffers(dpy, surface); 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 161687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian 162cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glMatrixMode(GL_MODELVIEW); 1636c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian glScissor(0,dim,dim,h-dim); 1646c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian glDisable(GL_SCISSOR_TEST); 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian for (int y=0 ; y<dim ; y++) { 1676c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian //glDisable(GL_SCISSOR_TEST); 168cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glClear(GL_COLOR_BUFFER_BIT); 169687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian 1706c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian //glEnable(GL_SCISSOR_TEST); 1716c06ffc6d051b3418ca52f632a8497d1db6235c5Mathias Agopian 172687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#if USE_DRAW_TEXTURE && GL_OES_draw_texture 173687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian glDrawTexiOES(0, y, 1, dim, dim); 174687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#else 175687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian glLoadIdentity(); 176687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian glTranslatef(0, y, 0); 177cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glEnableClientState(GL_VERTEX_ARRAY); 178cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 179cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glVertexPointer(2, GL_FLOAT, 0, vertices); 180cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 181687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 182687bea235903fb7fd78b131487d189aba88f6d05Mathias Agopian#endif 183cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian 184cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian if (!usePbuffer) { 185cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian eglSwapBuffers(dpy, surface); 186cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian } else { 187cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian glFinish(); 188cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian } 189cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian } 190cba73d3210c18f0fbcac2e9b5b95a717d4a6d977Mathias Agopian 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project eglTerminate(dpy); 1926ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden delete windowSurface; 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 195