1ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil/* 2ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * Copyright (C) 2010 The Android Open Source Project 3ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * 4ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * Licensed under the Apache License, Version 2.0 (the "License"); 5ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * you may not use this file except in compliance with the License. 6ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * You may obtain a copy of the License at 7ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * 8ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * http://www.apache.org/licenses/LICENSE-2.0 9ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * 10ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * Unless required by applicable law or agreed to in writing, software 11ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * distributed under the License is distributed on an "AS IS" BASIS, 12ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * See the License for the specific language governing permissions and 14ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil * limitations under the License. 15ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil */ 16ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 17ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <stdlib.h> 18ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <stdio.h> 19ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <time.h> 20ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <sched.h> 21ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <sys/resource.h> 22ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 23ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <EGL/egl.h> 24ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <EGL/eglext.h> 25ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <GLES/gl.h> 26ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <GLES/glext.h> 27ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 28ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <utils/Timers.h> 29ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 306ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <WindowSurface.h> 31ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#include <ui/GraphicBuffer.h> 326ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <EGLUtils.h> 33ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 34ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilusing namespace android; 35ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 36ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilstatic void printGLString(const char *name, GLenum s) { 37ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // fprintf(stderr, "printGLString %s, %d\n", name, s); 38ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil const char *v = (const char *) glGetString(s); 39ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // int error = glGetError(); 40ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // fprintf(stderr, "glGetError() = %d, result of glGetString = %x\n", error, 41ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // (unsigned int) v); 42ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // if ((v < (const char*) 0) || (v > (const char*) 0x10000)) 43ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // fprintf(stderr, "GL %s = %s\n", name, v); 44ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // else 45ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil // fprintf(stderr, "GL %s = (null) 0x%08x\n", name, (unsigned int) v); 46ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "GL %s = %s\n", name, v); 47ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 48ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 49ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { 50ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (returnVal != EGL_TRUE) { 51ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "%s() returned %d\n", op, returnVal); 52ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 53ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 54ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 55ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil = eglGetError()) { 56ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error), 57ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil error); 58ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 59ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 60ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 61ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilstatic void checkGlError(const char* op) { 62ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil for (GLint error = glGetError(); error; error 63ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil = glGetError()) { 64ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "after %s() glError (0x%x)\n", op, error); 65ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 66ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 67ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 68ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilbool setupGraphics(int w, int h) { 69ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glViewport(0, 0, w, h); 70ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glViewport"); 71ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return true; 72ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 73ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 74ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilint align(int x, int a) { 75ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return (x + (a-1)) & (~(a-1)); 76ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 77ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 78ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexWidth = 600; 79ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexHeight = 480; 80ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexUsage = GraphicBuffer::USAGE_HW_TEXTURE | 81ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil GraphicBuffer::USAGE_SW_WRITE_RARELY; 82ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexFormat = HAL_PIXEL_FORMAT_YV12; 83ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexOffsetY = 0; 84ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexStrideY = (yuvTexWidth + 0xf) & ~0xf; 85ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexOffsetV = yuvTexStrideY * yuvTexHeight; 86ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 87ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * yuvTexHeight/2; 88ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst int yuvTexStrideU = yuvTexStrideV; 89ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilconst bool yuvTexSameUV = false; 90ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilstatic sp<GraphicBuffer> yuvTexBuffer; 91ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilstatic GLuint yuvTex; 92ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 93ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilbool setupYuvTexSurface(EGLDisplay dpy, EGLContext context) { 94ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil int blockWidth = yuvTexWidth > 16 ? yuvTexWidth / 16 : 1; 95ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil int blockHeight = yuvTexHeight > 16 ? yuvTexHeight / 16 : 1; 96ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil yuvTexBuffer = new GraphicBuffer(yuvTexWidth, yuvTexHeight, yuvTexFormat, 97ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil yuvTexUsage); 98ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil char* buf = NULL; 99ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil status_t err = yuvTexBuffer->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&buf)); 100ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (err != 0) { 101ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "yuvTexBuffer->lock(...) failed: %d\n", err); 102ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return false; 103ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 104ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil for (int x = 0; x < yuvTexWidth; x++) { 105ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil for (int y = 0; y < yuvTexHeight; y++) { 106ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil int parityX = (x / blockWidth) & 1; 107ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil int parityY = (y / blockHeight) & 1; 108ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil unsigned char intensity = (parityX ^ parityY) ? 63 : 191; 109ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 110ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (x < yuvTexWidth / 2 && y < yuvTexHeight / 2) { 111ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity; 112ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (yuvTexSameUV) { 113ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] = intensity; 114ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } else if (x < yuvTexWidth / 4 && y < yuvTexHeight / 4) { 115ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] = 116ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] = 117ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] = 118ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] = intensity; 119ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 120ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 121ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 122ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 123ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 124ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil err = yuvTexBuffer->unlock(); 125ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (err != 0) { 126ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "yuvTexBuffer->unlock() failed: %d\n", err); 127ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return false; 128ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 129ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 130ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLClientBuffer clientBuffer = (EGLClientBuffer)yuvTexBuffer->getNativeBuffer(); 131ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLImageKHR img = eglCreateImageKHR(dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, 132ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil clientBuffer, 0); 133ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglCreateImageKHR"); 134ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (img == EGL_NO_IMAGE_KHR) { 135ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return false; 136ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 137ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 138ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glGenTextures(1, &yuvTex); 139ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glGenTextures"); 140ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTex); 141ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glBindTexture"); 142ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)img); 143ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glEGLImageTargetTexture2DOES"); 144ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 145ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glTexParameteri"); 146ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 147ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glTexParameteri"); 148ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 149ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glTexEnvx"); 150ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 151ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil GLint crop[4] = { 0, 0, yuvTexWidth, yuvTexHeight }; 152ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glTexParameteriv(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_CROP_RECT_OES, crop); 153ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glTexParameteriv"); 154ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 155ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return true; 156ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 157ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 158ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilvoid renderFrame(int w, int h) { 159ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 160ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glClearColor"); 161ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 162ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glClear"); 163ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 164ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTex); 165ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glBindTexture"); 166ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glEnable(GL_TEXTURE_EXTERNAL_OES); 167ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glEnable"); 168ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 169ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil glDrawTexiOES(0, 0, 0, w, h); 170ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkGlError("glDrawTexiOES"); 171ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 172ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 173ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilvoid printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { 174ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 175ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#define X(VAL) {VAL, #VAL} 176ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil struct {EGLint attribute; const char* name;} names[] = { 177ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_BUFFER_SIZE), 178ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_ALPHA_SIZE), 179ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_BLUE_SIZE), 180ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_GREEN_SIZE), 181ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_RED_SIZE), 182ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_DEPTH_SIZE), 183ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_STENCIL_SIZE), 184ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_CONFIG_CAVEAT), 185ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_CONFIG_ID), 186ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_LEVEL), 187ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_MAX_PBUFFER_HEIGHT), 188ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_MAX_PBUFFER_PIXELS), 189ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_MAX_PBUFFER_WIDTH), 190ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_NATIVE_RENDERABLE), 191ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_NATIVE_VISUAL_ID), 192ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_NATIVE_VISUAL_TYPE), 193ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_SAMPLES), 194ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_SAMPLE_BUFFERS), 195ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_SURFACE_TYPE), 196ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_TRANSPARENT_TYPE), 197ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_TRANSPARENT_RED_VALUE), 198ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_TRANSPARENT_GREEN_VALUE), 199ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_TRANSPARENT_BLUE_VALUE), 200ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_BIND_TO_TEXTURE_RGB), 201ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_BIND_TO_TEXTURE_RGBA), 202ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_MIN_SWAP_INTERVAL), 203ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_MAX_SWAP_INTERVAL), 204ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_LUMINANCE_SIZE), 205ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_ALPHA_MASK_SIZE), 206ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_COLOR_BUFFER_TYPE), 207ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_RENDERABLE_TYPE), 208ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil X(EGL_CONFORMANT), 209ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil }; 210ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil#undef X 211ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 212ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { 213ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint value = -1; 214ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); 215ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint error = eglGetError(); 216ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (returnVal && error == EGL_SUCCESS) { 217ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf(" %s: ", names[j].name); 218ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("%d (0x%x)", value, value); 219ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 220ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 221ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("\n"); 222ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 223ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 224ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtilint main(int argc, char** argv) { 225ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLBoolean returnValue; 226ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLConfig myConfig = {0}; 227ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 228ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE }; 229ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint s_configAttribs[] = { 230ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 231ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, 232ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGL_NONE }; 233ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint majorVersion; 234ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint minorVersion; 235ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLContext context; 236ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLSurface surface; 237ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLint w, h; 238ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 239ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil EGLDisplay dpy; 240ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 241ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("<init>"); 242ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 243ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglGetDisplay"); 244ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (dpy == EGL_NO_DISPLAY) { 245ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 246ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 0; 247ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 248ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 249ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 250ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglInitialize", returnValue); 251ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 252ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (returnValue != EGL_TRUE) { 253ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("eglInitialize failed\n"); 254ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 0; 255ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 256ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 2576ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden WindowSurface windowSurface; 2586ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden EGLNativeWindowType window = windowSurface.getSurface(); 259ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil returnValue = EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &myConfig); 260ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (returnValue) { 261ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("EGLUtils::selectConfigForNativeWindow() returned %d", returnValue); 262ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 1; 263ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 264ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 265ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("EGLUtils::selectConfigForNativeWindow"); 266ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 267ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("Chose this configuration:\n"); 268ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printEGLConfiguration(dpy, myConfig); 269ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 270ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); 271ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglCreateWindowSurface"); 272ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (surface == EGL_NO_SURFACE) { 273ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("gelCreateWindowSurface failed.\n"); 274ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 1; 275ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 276ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 277ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, context_attribs); 278ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglCreateContext"); 279ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (context == EGL_NO_CONTEXT) { 280ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printf("eglCreateContext failed\n"); 281ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 1; 282ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 283ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil returnValue = eglMakeCurrent(dpy, surface, surface, context); 284ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglMakeCurrent", returnValue); 285ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (returnValue != EGL_TRUE) { 286ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 1; 287ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 288ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 289ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglQuerySurface"); 290ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 291ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglQuerySurface"); 292ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil GLint dim = w < h ? w : h; 293ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 294ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 295ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 296ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printGLString("Version", GL_VERSION); 297ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printGLString("Vendor", GL_VENDOR); 298ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printGLString("Renderer", GL_RENDERER); 299ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil printGLString("Extensions", GL_EXTENSIONS); 300ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 301ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if(!setupYuvTexSurface(dpy, context)) { 302ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "Could not set up texture surface.\n"); 303ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 1; 304ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 305ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 306ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if(!setupGraphics(w, h)) { 307ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil fprintf(stderr, "Could not set up graphics.\n"); 308ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 1; 309ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 310ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 311ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil for (;;) { 312ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil static int dir = -1; 313ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 314ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil renderFrame(w, h); 315ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil eglSwapBuffers(dpy, surface); 316ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil checkEglError("eglSwapBuffers"); 317ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 318ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (w <= 10 || h <= 10) 319ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil { 320ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil dir = -dir; 321ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 322ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 323ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil if (w >= 1300 || h >= 900) 324ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil { 325ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil dir = -dir; 326ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 327ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 328ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 329ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil w += dir; 330ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil h += dir; 331ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil } 332ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil 333ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil return 0; 334ce0a5ca4238ff82c523ea7ce9cfb5de00bc16bcbNuno Subtil} 335