BootAnimation.cpp revision 8434c5369304e639efe8eab368ca410c589d87c2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#define LOG_TAG "BootAnimation" 18bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 24b4d5a72691846bce5779cc3db056f09a5031d7ccMathias Agopian#include <signal.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26ac31a3b8b09aba1c5ebc73f0cf65cac2210aa6b7Mathias Agopian#include <binder/IPCThreadState.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/AssetManager.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Rect.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Region.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/DisplayInfo.h> 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/ISurfaceComposer.h> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/ISurfaceFlingerClient.h> 39dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian#include <ui/FramebufferNativeWindow.h> 40738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian#include <ui/EGLUtils.h> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <core/SkBitmap.h> 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <images/SkImageDecoder.h> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/glext.h> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/eglext.h> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "BootAnimation.h" 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias AgopianBootAnimation::BootAnimation() : Thread(false) 56627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian{ 57627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian mSession = new SurfaceComposerClient(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectBootAnimation::~BootAnimation() { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid BootAnimation::onFirstRef() { 64bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian status_t err = mSession->linkToComposerDeath(this); 65bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian LOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err)); 668434c5369304e639efe8eab368ca410c589d87c2Mathias Agopian if (err == NO_ERROR) { 67bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian run("BootAnimation", PRIORITY_DISPLAY); 68bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopiansp<SurfaceComposerClient> BootAnimation::session() const { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSession; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian 76bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopianvoid BootAnimation::binderDied(const wp<IBinder>& who) 77bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian{ 78bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian // woah, surfaceflinger died! 79bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian LOGD("SurfaceFlinger died, exiting..."); 80bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian 81bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian // calling requestExit() is not enough here because the Surface code 82bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian // might be blocked on a condition variable that will never be updated. 83bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian kill( getpid(), SIGKILL ); 84bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian requestExit(); 85bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian} 86bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BootAnimation::initTexture(Texture* texture, AssetManager& assets, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* name) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* asset = assets.open(name, Asset::ACCESS_BUFFER); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!asset) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkBitmap bitmap; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(), 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset->close(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete asset; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ensure we can call getPixels(). No need to call unlock, since the 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bitmap will go out of scope when we return from this method. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bitmap.lockPixels(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int w = bitmap.width(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int h = bitmap.height(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const void* p = bitmap.getPixels(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLint crop[4] = { 0, h, w, -h }; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texture->w = w; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texture->h = h; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glGenTextures(1, &texture->name); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, texture->name); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (bitmap.getConfig()) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kA8_Config: 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_ALPHA, 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_BYTE, p); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kARGB_4444_Config: 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_SHORT_4_4_4_4, p); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kARGB_8888_Config: 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_BYTE, p); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kRGB_565_Config: 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_SHORT_5_6_5, p); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BootAnimation::readyToRun() { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets.addDefaultAssets(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayInfo dinfo; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = session()->getDisplayInfo(0, &dinfo); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status) 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create the native surface 15117f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian sp<SurfaceControl> control = session()->createSurface( 152317a6280cc109e873646e4652be1582d870eedfdMathias Agopian getpid(), 0, dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project session()->openTransaction(); 15417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian control->setLayer(0x40000000); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project session()->closeTransaction(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian sp<Surface> s = control->getSurface(); 15817f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize opengl and egl 160738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian const EGLint attribs[] = { 161738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian EGL_DEPTH_SIZE, 0, 162738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian EGL_NONE 163738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian }; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLint w, h, dummy; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLint numConfigs; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLConfig config; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLSurface surface; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLContext context; 169627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 171627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian 172627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian eglInitialize(display, 0, 0); 173738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian EGLUtils::selectConfigForNativeWindow(display, attribs, s.get(), &config); 1741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian surface = eglCreateWindowSurface(display, config, s.get(), NULL); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = eglCreateContext(display, config, NULL, NULL); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglQuerySurface(display, surface, EGL_WIDTH, &w); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglQuerySurface(display, surface, EGL_HEIGHT, &h); 178abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian 179abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) 180abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian return NO_INIT; 181abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplay = display; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurface = surface; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = w; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = h; 18717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian mFlingerSurfaceControl = control; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlingerSurface = s; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize GL 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glShadeModel(GL_FLAT); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_TEXTURE_2D); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool BootAnimation::threadLoop() { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool r = android(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglDestroyContext(mDisplay, mContext); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglDestroySurface(mDisplay, mSurface); 2036cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mFlingerSurface.clear(); 20417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian mFlingerSurfaceControl.clear(); 205627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian eglTerminate(mDisplay); 206627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian IPCThreadState::self()->stopProcess(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool BootAnimation::android() { 211b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png"); 212b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png"); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clear screen 215b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glDisable(GL_DITHER); 216b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glDisable(GL_SCISSOR_TEST); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 220b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian const GLint xc = (mWidth - mAndroid[0].w) / 2; 221b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian const GLint yc = (mHeight - mAndroid[0].h) / 2; 222b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // draw and update only what we need 2251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian mFlingerSurface->setSwapRectangle(updateRect); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(), 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateRect.height()); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 230b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian // Blend state 231b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 232b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 233b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const nsecs_t startTime = systemTime(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 2361379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian nsecs_t now = systemTime(); 2371379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian double time = now - startTime; 238b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian float t = 4.0f * float(time / us2ns(16667)) / mAndroid[1].w; 239b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w; 240b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian GLint x = xc - offset; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2428166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian glDisable(GL_SCISSOR_TEST); 2438166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian glClear(GL_COLOR_BUFFER_BIT); 2448166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian 2458166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian glEnable(GL_SCISSOR_TEST); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_BLEND); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mAndroid[1].name); 248b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glDrawTexiOES(x, yc, 0, mAndroid[1].w, mAndroid[1].h); 249b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glDrawTexiOES(x + mAndroid[1].w, yc, 0, mAndroid[1].w, mAndroid[1].h); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 251b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glEnable(GL_BLEND); 252b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); 253b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 255627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian EGLBoolean res = eglSwapBuffers(mDisplay, mSurface); 256627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian if (res == EGL_FALSE) 257627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian break; 258627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian 2591379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian // 12fps: don't animate too fast to preserve CPU 2601379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now); 2611379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian if (sleepTime > 0) 2621379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian usleep(sleepTime); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (!exitPending()); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mAndroid[0].name); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mAndroid[1].name); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project; // namespace android 274