125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil/* 225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * Copyright (C) 2010 The Android Open Source Project 325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * 425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * Licensed under the Apache License, Version 2.0 (the "License"); 525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * you may not use this file except in compliance with the License. 625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * You may obtain a copy of the License at 725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * 825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * http://www.apache.org/licenses/LICENSE-2.0 925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * 1025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * Unless required by applicable law or agreed to in writing, software 1125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * distributed under the License is distributed on an "AS IS" BASIS, 1225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * See the License for the specific language governing permissions and 1425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil * limitations under the License. 1525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil */ 1625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 1725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <stdlib.h> 1825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <stdio.h> 1925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <time.h> 2025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <sched.h> 2125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <sys/resource.h> 2225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 2325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <EGL/egl.h> 2425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <EGL/eglext.h> 2525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <GLES/gl.h> 2625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <GLES/glext.h> 2725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 2825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <utils/Timers.h> 2925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 3025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <ui/FramebufferNativeWindow.h> 3125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <ui/GraphicBuffer.h> 3225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#include <ui/EGLUtils.h> 3325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 3425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilusing namespace android; 3525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 3625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilstatic void printGLString(const char *name, GLenum s) { 3725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // fprintf(stderr, "printGLString %s, %d\n", name, s); 3825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil const char *v = (const char *) glGetString(s); 3925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // int error = glGetError(); 4025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // fprintf(stderr, "glGetError() = %d, result of glGetString = %x\n", error, 4125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // (unsigned int) v); 4225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // if ((v < (const char*) 0) || (v > (const char*) 0x10000)) 4325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // fprintf(stderr, "GL %s = %s\n", name, v); 4425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // else 4525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil // fprintf(stderr, "GL %s = (null) 0x%08x\n", name, (unsigned int) v); 4625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "GL %s = %s\n", name, v); 4725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 4825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 4925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilstatic void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { 5025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (returnVal != EGL_TRUE) { 5125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "%s() returned %d\n", op, returnVal); 5225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 5325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 5425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil for (EGLint error = eglGetError(); error != EGL_SUCCESS; error 5525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil = eglGetError()) { 5625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error), 5725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil error); 5825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 5925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 6025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 6125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilstatic void checkGlError(const char* op) { 6225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil for (GLint error = glGetError(); error; error 6325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil = glGetError()) { 6425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "after %s() glError (0x%x)\n", op, error); 6525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 6625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 6725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 6825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilbool setupGraphics(int w, int h) { 6925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glViewport(0, 0, w, h); 7025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glViewport"); 7125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return true; 7225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 7325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 7425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilint align(int x, int a) { 7525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return (x + (a-1)) & (~(a-1)); 7625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 7725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 7825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexWidth = 600; 7925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexHeight = 480; 8025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexUsage = GraphicBuffer::USAGE_HW_TEXTURE | 8125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil GraphicBuffer::USAGE_SW_WRITE_RARELY; 8225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexFormat = HAL_PIXEL_FORMAT_YV12; 8325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexOffsetY = 0; 8425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexStrideY = (yuvTexWidth + 0xf) & ~0xf; 8525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexOffsetV = yuvTexStrideY * yuvTexHeight; 8625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexStrideV = (yuvTexStrideY/2 + 0xf) & ~0xf; 8725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexOffsetU = yuvTexOffsetV + yuvTexStrideV * yuvTexHeight/2; 8825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst int yuvTexStrideU = yuvTexStrideV; 8925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilconst bool yuvTexSameUV = false; 9025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilstatic sp<GraphicBuffer> yuvTexBuffer; 9125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilstatic GLuint yuvTex; 9225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 9325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilbool setupYuvTexSurface(EGLDisplay dpy, EGLContext context) { 9425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil int blockWidth = yuvTexWidth > 16 ? yuvTexWidth / 16 : 1; 9525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil int blockHeight = yuvTexHeight > 16 ? yuvTexHeight / 16 : 1; 9625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil yuvTexBuffer = new GraphicBuffer(yuvTexWidth, yuvTexHeight, yuvTexFormat, 9725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil yuvTexUsage); 9825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil char* buf = NULL; 9925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil status_t err = yuvTexBuffer->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&buf)); 10025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (err != 0) { 10125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "yuvTexBuffer->lock(...) failed: %d\n", err); 10225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return false; 10325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 10425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil for (int x = 0; x < yuvTexWidth; x++) { 10525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil for (int y = 0; y < yuvTexHeight; y++) { 10625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil int parityX = (x / blockWidth) & 1; 10725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil int parityY = (y / blockHeight) & 1; 10825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil unsigned char intensity = (parityX ^ parityY) ? 63 : 191; 10925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetY + (y * yuvTexStrideY) + x] = intensity; 11025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (x < yuvTexWidth / 2 && y < yuvTexHeight / 2) { 11125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetU + (y * yuvTexStrideU) + x] = intensity; 11225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (yuvTexSameUV) { 11325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetV + (y * yuvTexStrideV) + x] = intensity; 11425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } else if (x < yuvTexWidth / 4 && y < yuvTexHeight / 4) { 11525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 0] = 11625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetV + (y*2 * yuvTexStrideV) + x*2 + 1] = 11725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 0] = 11825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil buf[yuvTexOffsetV + ((y*2+1) * yuvTexStrideV) + x*2 + 1] = intensity; 11925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 12025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 12125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 12225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 12325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 12425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil err = yuvTexBuffer->unlock(); 12525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (err != 0) { 12625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "yuvTexBuffer->unlock() failed: %d\n", err); 12725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return false; 12825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 12925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 13025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLClientBuffer clientBuffer = (EGLClientBuffer)yuvTexBuffer->getNativeBuffer(); 13125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLImageKHR img = eglCreateImageKHR(dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, 13225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil clientBuffer, 0); 13325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglCreateImageKHR"); 13425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (img == EGL_NO_IMAGE_KHR) { 13525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return false; 13625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 13725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 13825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glGenTextures(1, &yuvTex); 13925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glGenTextures"); 14025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTex); 14125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glBindTexture"); 14225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)img); 14325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glEGLImageTargetTexture2DOES"); 14425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 14525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glTexParameteri"); 14625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 14725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glTexParameteri"); 14825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 14925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glTexEnvx"); 15025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 15125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil GLint crop[4] = { 0, 0, yuvTexWidth, yuvTexHeight }; 15225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glTexParameteriv(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_CROP_RECT_OES, crop); 15325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glTexParameteriv"); 15425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 15525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return true; 15625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 15725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 15825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilvoid renderFrame(int w, int h) { 15925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 16025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glClearColor"); 16125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 16225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glClear"); 16325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 16425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glBindTexture(GL_TEXTURE_EXTERNAL_OES, yuvTex); 16525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glBindTexture"); 16625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glEnable(GL_TEXTURE_EXTERNAL_OES); 16725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glEnable"); 16825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 16925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil glDrawTexiOES(0, 0, 0, w, h); 17025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkGlError("glDrawTexiOES"); 17125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 17225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 17325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilvoid printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { 17425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 17525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#define X(VAL) {VAL, #VAL} 17625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil struct {EGLint attribute; const char* name;} names[] = { 17725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_BUFFER_SIZE), 17825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_ALPHA_SIZE), 17925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_BLUE_SIZE), 18025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_GREEN_SIZE), 18125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_RED_SIZE), 18225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_DEPTH_SIZE), 18325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_STENCIL_SIZE), 18425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_CONFIG_CAVEAT), 18525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_CONFIG_ID), 18625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_LEVEL), 18725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_MAX_PBUFFER_HEIGHT), 18825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_MAX_PBUFFER_PIXELS), 18925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_MAX_PBUFFER_WIDTH), 19025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_NATIVE_RENDERABLE), 19125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_NATIVE_VISUAL_ID), 19225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_NATIVE_VISUAL_TYPE), 19325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_SAMPLES), 19425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_SAMPLE_BUFFERS), 19525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_SURFACE_TYPE), 19625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_TRANSPARENT_TYPE), 19725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_TRANSPARENT_RED_VALUE), 19825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_TRANSPARENT_GREEN_VALUE), 19925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_TRANSPARENT_BLUE_VALUE), 20025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_BIND_TO_TEXTURE_RGB), 20125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_BIND_TO_TEXTURE_RGBA), 20225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_MIN_SWAP_INTERVAL), 20325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_MAX_SWAP_INTERVAL), 20425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_LUMINANCE_SIZE), 20525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_ALPHA_MASK_SIZE), 20625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_COLOR_BUFFER_TYPE), 20725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_RENDERABLE_TYPE), 20825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil X(EGL_CONFORMANT), 20925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil }; 21025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil#undef X 21125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 21225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { 21325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint value = -1; 21425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); 21525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint error = eglGetError(); 21625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (returnVal && error == EGL_SUCCESS) { 21725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf(" %s: ", names[j].name); 21825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("%d (0x%x)", value, value); 21925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 22025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 22125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("\n"); 22225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 22325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 22425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtilint main(int argc, char** argv) { 22525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLBoolean returnValue; 22625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLConfig myConfig = {0}; 22725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 22825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE }; 22925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint s_configAttribs[] = { 23025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 23125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, 23225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGL_NONE }; 23325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint majorVersion; 23425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint minorVersion; 23525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLContext context; 23625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLSurface surface; 23725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLint w, h; 23825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 23925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLDisplay dpy; 24025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 24125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("<init>"); 24225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); 24325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglGetDisplay"); 24425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (dpy == EGL_NO_DISPLAY) { 24525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("eglGetDisplay returned EGL_NO_DISPLAY.\n"); 24625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 0; 24725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 24825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 24925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil returnValue = eglInitialize(dpy, &majorVersion, &minorVersion); 25025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglInitialize", returnValue); 25125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "EGL version %d.%d\n", majorVersion, minorVersion); 25225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (returnValue != EGL_TRUE) { 25325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("eglInitialize failed\n"); 25425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 0; 25525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 25625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 25725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil EGLNativeWindowType window = android_createDisplaySurface(); 25825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil returnValue = EGLUtils::selectConfigForNativeWindow(dpy, s_configAttribs, window, &myConfig); 25925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (returnValue) { 26025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("EGLUtils::selectConfigForNativeWindow() returned %d", returnValue); 26125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 1; 26225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 26325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 26425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("EGLUtils::selectConfigForNativeWindow"); 26525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 26625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("Chose this configuration:\n"); 26725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printEGLConfiguration(dpy, myConfig); 26825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 26925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil surface = eglCreateWindowSurface(dpy, myConfig, window, NULL); 27025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglCreateWindowSurface"); 27125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (surface == EGL_NO_SURFACE) { 27225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("gelCreateWindowSurface failed.\n"); 27325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 1; 27425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 27525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 27625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil context = eglCreateContext(dpy, myConfig, EGL_NO_CONTEXT, context_attribs); 27725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglCreateContext"); 27825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (context == EGL_NO_CONTEXT) { 27925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printf("eglCreateContext failed\n"); 28025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 1; 28125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 28225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil returnValue = eglMakeCurrent(dpy, surface, surface, context); 28325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglMakeCurrent", returnValue); 28425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (returnValue != EGL_TRUE) { 28525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 1; 28625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 28725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil eglQuerySurface(dpy, surface, EGL_WIDTH, &w); 28825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglQuerySurface"); 28925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil eglQuerySurface(dpy, surface, EGL_HEIGHT, &h); 29025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglQuerySurface"); 29125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil GLint dim = w < h ? w : h; 29225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 29325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "Window dimensions: %d x %d\n", w, h); 29425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 29525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printGLString("Version", GL_VERSION); 29625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printGLString("Vendor", GL_VENDOR); 29725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printGLString("Renderer", GL_RENDERER); 29825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil printGLString("Extensions", GL_EXTENSIONS); 29925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 30025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if(!setupYuvTexSurface(dpy, context)) { 30125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "Could not set up texture surface.\n"); 30225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 1; 30325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 30425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 30525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if(!setupGraphics(w, h)) { 30625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil fprintf(stderr, "Could not set up graphics.\n"); 30725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 1; 30825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 30925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 31025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil for (;;) { 31125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil static int dir = -1; 31225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 31325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil renderFrame(w, h); 31425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil eglSwapBuffers(dpy, surface); 31525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil checkEglError("eglSwapBuffers"); 31625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 31725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (w <= 10 || h <= 10) 31825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil { 31925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil dir = -dir; 32025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 32125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 32225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil if (w >= 1300 || h >= 900) 32325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil { 32425443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil dir = -dir; 32525443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 32625443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 32725443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 32825443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil w += dir; 32925443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil h += dir; 33025443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil } 33125443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil 33225443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil return 0; 33325443b2d8fff2b8ffbb65315cce6f35410682bfbNuno Subtil} 334