filter.cpp revision a1f6eff297a3e4870e22fdae926648bda3466805
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 dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 41 eglInitialize(dpy, &majorVersion, &minorVersion); 42 if (!usePbuffer) { 43 EGLNativeWindowType window = android_createDisplaySurface(); 44 surface = eglCreateWindowSurface(dpy, config, window, NULL); 45 EGLUtils::selectConfigForNativeWindow( 46 dpy, s_configAttribs, window, &config); 47 } else { 48 printf("using pbuffer\n"); 49 eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs); 50 EGLint attribs[] = { EGL_WIDTH, 320, EGL_HEIGHT, 480, EGL_NONE }; 51 surface = eglCreatePbufferSurface(dpy, config, attribs); 52 if (surface == EGL_NO_SURFACE) { 53 printf("eglCreatePbufferSurface error %x\n", eglGetError()); 54 } 55 } 56 context = eglCreateContext(dpy, config, NULL, NULL); 57 eglMakeCurrent(dpy, surface, surface, context); 58 eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 59 eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 60 GLint dim = w<h ? w : h; 61 62 glClear(GL_COLOR_BUFFER_BIT); 63 64 GLint crop[4] = { 0, 4, 4, -4 }; 65 glBindTexture(GL_TEXTURE_2D, 0); 66 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 67 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 68 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 69 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 70 glEnable(GL_TEXTURE_2D); 71 glColor4f(1,1,1,1); 72 73 // packing is always 4 74 uint8_t t8[] = { 75 0x00, 0x55, 0x00, 0x55, 76 0xAA, 0xFF, 0xAA, 0xFF, 77 0x00, 0x55, 0x00, 0x55, 78 0xAA, 0xFF, 0xAA, 0xFF }; 79 80 uint16_t t16[] = { 81 0x0000, 0x5555, 0x0000, 0x5555, 82 0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF, 83 0x0000, 0x5555, 0x0000, 0x5555, 84 0xAAAA, 0xFFFF, 0xAAAA, 0xFFFF }; 85 86 uint16_t t5551[] = { 87 0x0000, 0xFFFF, 0x0000, 0xFFFF, 88 0xFFFF, 0x0000, 0xFFFF, 0x0000, 89 0x0000, 0xFFFF, 0x0000, 0xFFFF, 90 0xFFFF, 0x0000, 0xFFFF, 0x0000 }; 91 92 uint32_t t32[] = { 93 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 94 0xFF00FF00, 0xFFFF0000, 0xFF000000, 0xFF0000FF, 95 0xFF00FFFF, 0xFF00FF00, 0x00FF00FF, 0xFFFFFF00, 96 0xFF000000, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF 97 }; 98 99 switch(test) 100 { 101 case 1: 102 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 103 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, t8); 104 break; 105 case 2: 106 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 107 4, 4, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, t16); 108 break; 109 case 3: 110 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 111 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, t16); 112 break; 113 case 4: 114 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 115 4, 4, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, t16); 116 break; 117 case 5: 118 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 119 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, t5551); 120 break; 121 case 6: 122 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 123 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, t32); 124 break; 125 } 126 127 glDrawTexiOES(0, 0, 0, dim, dim); 128 129 if (!usePbuffer) { 130 eglSwapBuffers(dpy, surface); 131 } else { 132 glFinish(); 133 } 134 135 eglTerminate(dpy); 136 return 0; 137} 138