filter.cpp revision 1d3bcd6e217e7ef177287d06f6fdf6149f453830
1#include <stdlib.h> 2#include <stdio.h> 3 4#include <EGL/egl.h> 5#include <GLES/gl.h> 6#include <GLES/glext.h> 7 8#include <ui/FramebufferNativeWindow.h> 9#include <ui/EGLUtils.h> 10 11using namespace android; 12 13int main(int argc, char** argv) 14{ 15 if (argc!=2 && argc!=3) { 16 printf("usage: %s <0-6> [pbuffer]\n", argv[0]); 17 return 0; 18 } 19 20 const int test = atoi(argv[1]); 21 int usePbuffer = argc==3 && !strcmp(argv[2], "pbuffer"); 22 EGLint s_configAttribs[] = { 23 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT|EGL_WINDOW_BIT, 24 EGL_RED_SIZE, 5, 25 EGL_GREEN_SIZE, 6, 26 EGL_BLUE_SIZE, 5, 27 EGL_NONE 28 }; 29 30 EGLint numConfigs = -1; 31 EGLint majorVersion; 32 EGLint minorVersion; 33 EGLConfig config; 34 EGLContext context; 35 EGLSurface surface; 36 EGLint w, h; 37 38 EGLDisplay dpy; 39 40 EGLNativeWindowType window = 0; 41 if (!usePbuffer) { 42 window = android_createDisplaySurface(); 43 } 44 45 dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 46 eglInitialize(dpy, &majorVersion, &minorVersion); 47 if (!usePbuffer) { 48 surface = eglCreateWindowSurface(dpy, config, window, NULL); 49 EGLUtils::selectConfigForNativeWindow( 50 dpy, s_configAttribs, window, &config); 51 } else { 52 printf("using pbuffer\n"); 53 eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs); 54 EGLint attribs[] = { EGL_WIDTH, 320, EGL_HEIGHT, 480, EGL_NONE }; 55 surface = eglCreatePbufferSurface(dpy, config, attribs); 56 if (surface == EGL_NO_SURFACE) { 57 printf("eglCreatePbufferSurface error %x\n", eglGetError()); 58 } 59 } 60 context = eglCreateContext(dpy, config, NULL, NULL); 61 eglMakeCurrent(dpy, surface, surface, context); 62 eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 63 eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 64 GLint dim = w<h ? w : h; 65 66 glClear(GL_COLOR_BUFFER_BIT); 67 68 GLint crop[4] = { 0, 4, 4, -4 }; 69 glBindTexture(GL_TEXTURE_2D, 0); 70 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 71 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 72 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 73 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 74 glEnable(GL_TEXTURE_2D); 75 glColor4f(1,1,1,1); 76 77 // packing is always 4 78 uint8_t t8[] = { 79 0x00, 0x55, 0x00, 0x55, 80 0xAA, 0xFF, 0xAA, 0xFF, 81 0x00, 0x55, 0x00, 0x55, 82 0xAA, 0xFF, 0xAA, 0xFF }; 83 84 uint16_t t16[] = { 85 0x0000, 0x5555, 0x0000, 0x5555, 86 0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF, 87 0x0000, 0x5555, 0x0000, 0x5555, 88 0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF }; 89 90 uint16_t t5551[] = { 91 0x0000, 0xFFFF, 0x0000, 0xFFFF, 92 0xFFFF, 0x0000, 0xFFFF, 0x0000, 93 0x0000, 0xFFFF, 0x0000, 0xFFFF, 94 0xFFFF, 0x0000, 0xFFFF, 0x0000 }; 95 96 uint32_t t32[] = { 97 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 98 0xFF00FF00, 0xFFFF0000, 0xFF000000, 0xFF0000FF, 99 0xFF00FFFF, 0xFF00FF00, 0x00FF00FF, 0xFFFFFF00, 100 0xFF000000, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF 101 }; 102 103 switch(test) 104 { 105 case 1: 106 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 107 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, t8); 108 break; 109 case 2: 110 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 111 4, 4, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, t16); 112 break; 113 case 3: 114 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 115 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, t16); 116 break; 117 case 4: 118 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 119 4, 4, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, t16); 120 break; 121 case 5: 122 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 123 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, t5551); 124 break; 125 case 6: 126 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 127 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, t32); 128 break; 129 } 130 131 glDrawTexiOES(0, 0, 0, dim, dim); 132 133 if (!usePbuffer) { 134 eglSwapBuffers(dpy, surface); 135 } else { 136 glFinish(); 137 } 138 139 eglTerminate(dpy); 140 return 0; 141} 142