SurfaceFlinger.cpp revision 0795272aa226f4e965968a03daddc53ce30b7cda
154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/* 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License. 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License. 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#define LOG_TAG "SurfaceFlinger" 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdlib.h> 2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdio.h> 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdint.h> 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <unistd.h> 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <fcntl.h> 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <errno.h> 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <math.h> 26207637327511c960805713971e2e7dd11cb9c290Jean-Baptiste Queru#include <limits.h> 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/types.h> 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/stat.h> 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/ioctl.h> 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <cutils/log.h> 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <cutils/properties.h> 3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h> 350795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 360795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryDealer.h> 370795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryBase.h> 3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <utils/String8.h> 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <utils/String16.h> 4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <utils/StopWatch.h> 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <ui/PixelFormat.h> 4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <ui/DisplayInfo.h> 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <ui/EGLDisplaySurface.h> 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <pixelflinger/pixelflinger.h> 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <GLES/gl.h> 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "clz.h" 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "CPUGauge.h" 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Layer.h" 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerBlur.h" 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerBuffer.h" 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerDim.h" 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerBitmap.h" 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerOrientationAnim.h" 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "OrientationAnimation.h" 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "SurfaceFlinger.h" 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "VRamHeap.h" 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "GPUHardware/GPUHardware.h" 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#define DISPLAY_COUNT 1 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectnamespace android { 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::instantiate() { 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project defaultServiceManager()->addService( 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String16("SurfaceFlinger"), new SurfaceFlinger()); 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::shutdown() { 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we should unregister here, but not really because 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // when (if) the service manager goes away, all the services 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // it has a reference to will leave too. 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSurfaceFlinger::LayerVector::LayerVector(const SurfaceFlinger::LayerVector& rhs) 8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project : lookup(rhs.lookup), layers(rhs.layers) 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::indexOf( 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* key, size_t guess) const 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (guess<size() && lookup.keyAt(guess) == key) 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return guess; 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const ssize_t i = lookup.indexOfKey(key); 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (i>=0) { 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t idx = lookup.valueAt(i); 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOG_ASSERT(layers[idx]==key, 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "LayerVector[%p]: layers[%d]=%p, key=%p", 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this, int(idx), layers[idx], key); 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return idx; 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return i; 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::add( 10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* layer, 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Vector<LayerBase*>::compar_t cmp) 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t count = layers.size(); 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t l = 0; 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t h = count-1; 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t mid; 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const* a = layers.array(); 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (l <= h) { 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mid = l + (h - l)/2; 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int c = cmp(a+mid, &layer); 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (c == 0) { l = mid; break; } 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (c<0) { l = mid+1; } 11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { h = mid-1; } 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t order = l; 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (order<count && !cmp(&layer, a+order)) { 12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project order++; 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project count = lookup.size(); 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (lookup.valueAt(i) >= order) { 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lookup.editValueAt(i)++; 12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layers.insertAt(layer, order); 13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lookup.add(layer, order); 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return order; 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::remove(LayerBase* layer) 13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const ssize_t keyIndex = lookup.indexOfKey(layer); 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (keyIndex >= 0) { 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t index = lookup.valueAt(keyIndex); 14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOG_ASSERT(layers[index]==layer, 14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "LayerVector[%p]: layers[%u]=%p, layer=%p", 14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project this, int(index), layers[index], layer); 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layers.removeItemsAt(index); 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lookup.removeItemsAt(keyIndex); 14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = lookup.size(); 14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (lookup.valueAt(i) >= size_t(index)) { 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lookup.editValueAt(i)--; 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return index; 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NAME_NOT_FOUND; 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::reorder( 15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* layer, 15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Vector<LayerBase*>::compar_t cmp) 16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // XXX: it's a little lame. but oh well... 16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t err = remove(layer); 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err >=0) 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = add(layer, cmp); 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark - 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif 17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSurfaceFlinger::SurfaceFlinger() 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project : BnSurfaceComposer(), Thread(false), 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTransactionFlags(0), 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTransactionCount(0), 17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mBootTime(systemTime()), 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastScheduledBroadcast(NULL), 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mVisibleRegionsDirty(false), 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDeferReleaseConsole(false), 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeDisplay(false), 18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeCount(0), 183c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mFreezeDisplayTime(0), 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugRegion(0), 18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugCpu(0), 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugFps(0), 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugBackground(0), 18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugNoBootAnimation(0), 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSyncObject(), 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDeplayedTransactionPending(0), 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mConsoleSignals(0), 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSecureFrameBuffer(0) 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project init(); 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::init() 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI("SurfaceFlinger is starting"); 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // debugging stuff... 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project property_get("debug.sf.showupdates", value, "0"); 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugRegion = atoi(value); 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project property_get("debug.sf.showcpu", value, "0"); 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugCpu = atoi(value); 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project property_get("debug.sf.showbackground", value, "0"); 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugBackground = atoi(value); 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project property_get("debug.sf.showfps", value, "0"); 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugFps = atoi(value); 21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project property_get("debug.sf.nobootanimation", value, "0"); 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugNoBootAnimation = atoi(value); 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI_IF(mDebugRegion, "showupdates enabled"); 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI_IF(mDebugCpu, "showcpu enabled"); 21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI_IF(mDebugBackground, "showbackground enabled"); 21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI_IF(mDebugFps, "showfps enabled"); 21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI_IF(mDebugNoBootAnimation, "boot animation disabled"); 21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSurfaceFlinger::~SurfaceFlinger() 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDeleteTextures(1, &mWormholeTexName); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete mOrientationAnimation; 22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 227f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Projectcopybit_device_t* SurfaceFlinger::getBlitEngine() const 22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return graphicPlane(0).displayHardware().getBlitEngine(); 23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 23154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 232b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Projectoverlay_control_device_t* SurfaceFlinger::getOverlayEngine() const 233f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project{ 234f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project return graphicPlane(0).displayHardware().getOverlayEngine(); 235f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project} 236f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<IMemory> SurfaceFlinger::getCblk() const 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mServerCblkMemory; 24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::requestGPU(const sp<IGPUCallback>& callback, 24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project gpu_info_t* gpu) 24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 2450c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian if (mGPU == 0) 2460c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian return INVALID_OPERATION; 2470c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian 248f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 249f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project const int pid = ipc->getCallingPid(); 250f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project status_t err = mGPU->request(pid, callback, gpu); 25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::revokeGPU() 25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 2560c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian if (mGPU == 0) 2570c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian return INVALID_OPERATION; 2580c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian 25954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mGPU->friendlyRevoke(); 26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<ISurfaceFlingerClient> SurfaceFlinger::createConnection() 26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 26554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t token = mTokens.acquire(); 26654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 26754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client = new Client(token, this); 26854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if ((client == 0) || (client->ctrlblk == 0)) { 26954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTokens.release(token); 27054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project status_t err = mClientsMap.add(token, client); 27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err < 0) { 27454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete client; 27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTokens.release(token); 27654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 27754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sp<BClient> bclient = 27954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new BClient(this, token, client->controlBlockMemory()); 28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return bclient; 28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::destroyConnection(ClientID cid) 28454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 28554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 28654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* const client = mClientsMap.valueFor(cid); 28754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (client) { 28854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // free all the layers this client owns 28954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Vector<LayerBaseClient*>& layers = client->getLayers(); 29054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = layers.size(); 29154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 29254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* const layer = layers[i]; 29354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project removeLayer_l(layer); 29454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 29554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 29654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the resources associated with this client will be freed 29754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // during the next transaction, after these surfaces have been 29854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // properly removed from the screen 29954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // remove this client from our ClientID->Client mapping. 30154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mClientsMap.removeItem(cid); 30254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // and add it to the list of disconnected clients 30454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDisconnectedClients.add(client); 30554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // request a transaction 30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTransactionNeeded); 30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst GraphicPlane& SurfaceFlinger::graphicPlane(int dpy) const 31254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 31354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGE_IF(uint32_t(dpy) >= DISPLAY_COUNT, "Invalid DisplayID %d", dpy); 31454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GraphicPlane& plane(mGraphicPlanes[dpy]); 31554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return plane; 31654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectGraphicPlane& SurfaceFlinger::graphicPlane(int dpy) 31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return const_cast<GraphicPlane&>( 32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const_cast<SurfaceFlinger const *>(this)->graphicPlane(dpy)); 32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 32354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 32454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::bootFinished() 32554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 32654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const nsecs_t now = systemTime(); 32754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const nsecs_t duration = now - mBootTime; 32854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ); 32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mBootAnimation != 0) { 33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mBootAnimation->requestExit(); 33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mBootAnimation.clear(); 33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 33354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 33454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 33554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::onFirstRef() 33654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 33754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY); 33854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 33954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Wait for the main thread to be done with its initialization 34054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mReadyToRunBarrier.wait(); 34154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 34254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic inline uint16_t pack565(int r, int g, int b) { 34554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return (r<<11)|(g<<5)|b; 34654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 34754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// this is defined in libGLES_CM.so 34954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectextern ISurfaceComposer* GLES_localSurfaceManager; 35054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::readyToRun() 35254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 35354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGI( "SurfaceFlinger's main thread ready to run. " 35454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Initializing graphics H/W..."); 35554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 356f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project // create the shared control-block 357f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mServerHeap = new MemoryDealer(4096, MemoryDealer::READ_ONLY); 358f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project LOGE_IF(mServerHeap==0, "can't create shared memory dealer"); 359f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 360f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mServerCblkMemory = mServerHeap->allocate(4096); 361f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project LOGE_IF(mServerCblkMemory==0, "can't create shared control block"); 362f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 363f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mServerCblk = static_cast<surface_flinger_cblk_t *>(mServerCblkMemory->pointer()); 364f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project LOGE_IF(mServerCblk==0, "can't get to shared control block's address"); 365f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project new(mServerCblk) surface_flinger_cblk_t; 366f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 367f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project // get a reference to the GPU if we have one 368f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mGPU = GPUFactory::getGPU(); 369f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 370f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project // create the surface Heap manager, which manages the heaps 371f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project // (be it in RAM or VRAM) where surfaces are allocated 372f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project // We give 8 MB per client. 373f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mSurfaceHeapManager = new SurfaceHeapManager(this, 8 << 20); 374f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 375f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 37654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project GLES_localSurfaceManager = static_cast<ISurfaceComposer*>(this); 37754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 37854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we only support one display currently 37954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int dpy = 0; 38054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 38154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { 38254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // initialize the main display 38354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project GraphicPlane& plane(graphicPlane(dpy)); 38454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project DisplayHardware* const hw = new DisplayHardware(this, dpy); 38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project plane.setDisplayHardware(hw); 38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 38754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 38854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // initialize primary screen 38954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // (other display should be initialized in the same manner, but 39054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // asynchronously, as they could come and go. None of this is supported 39154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // yet). 39254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GraphicPlane& plane(graphicPlane(dpy)); 39354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw = plane.displayHardware(); 39454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t w = hw.getWidth(); 39554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t h = hw.getHeight(); 39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t f = hw.getFormat(); 39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hw.makeCurrent(); 39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // initialize the shared control block 40054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mServerCblk->connected |= 1<<dpy; 40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project display_cblk_t* dcblk = mServerCblk->displays + dpy; 40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project memset(dcblk, 0, sizeof(display_cblk_t)); 40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->w = w; 40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->h = h; 40554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->format = f; 40654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->orientation = ISurfaceComposer::eOrientationDefault; 40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->xdpi = hw.getDpiX(); 40854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->ydpi = hw.getDpiY(); 40954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->fps = hw.getRefreshRate(); 410f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project dcblk->density = hw.getDensity(); 41154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project asm volatile ("":::"memory"); 41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Initialize OpenGL|ES 41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glActiveTexture(GL_TEXTURE0); 41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glBindTexture(GL_TEXTURE_2D, 0); 41654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 422f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project glPixelStorei(GL_PACK_ALIGNMENT, 4); 42354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glEnableClientState(GL_VERTEX_ARRAY); 42454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glEnable(GL_SCISSOR_TEST); 42554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glShadeModel(GL_FLAT); 42654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_DITHER); 42754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_CULL_FACE); 42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint16_t g0 = pack565(0x0F,0x1F,0x0F); 43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint16_t g1 = pack565(0x17,0x2f,0x17); 43154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint16_t textureData[4] = { g0, g1, g1, g0 }; 43254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glGenTextures(1, &mWormholeTexName); 43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mWormholeTexName); 43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 43754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, 43954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project GL_RGB, GL_UNSIGNED_SHORT_5_6_5, textureData); 44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glViewport(0, 0, w, h); 44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glMatrixMode(GL_PROJECTION); 44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glLoadIdentity(); 44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glOrthof(0, w, h, 0, 0, 1); 44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerDim::initDimmer(this, w, h); 44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mReadyToRunBarrier.open(); 44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 45054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /* 45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * We're now ready to accept clients... 45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrientationAnimation = new OrientationAnimation(this); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // start CPU gauge display 45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDebugCpu) 45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCpuGauge = new CPUGauge(this, ms2ns(500)); 45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the boot animation! 46154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDebugNoBootAnimation == false) 46254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mBootAnimation = new BootAnimation(this); 46354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------- 46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0 46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark - 47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark Events Handler 47154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif 47254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::waitForEvent() 47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // wait for something to do 47654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(isFrozen())) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // wait 5 seconds 478c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project const nsecs_t freezeDisplayTimeout = ms2ns(5000); 479c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project const nsecs_t now = systemTime(); 480c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (mFreezeDisplayTime == 0) { 481c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mFreezeDisplayTime = now; 482c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 483c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project nsecs_t waitTime = freezeDisplayTimeout - (now - mFreezeDisplayTime); 484c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int err = (waitTime > 0) ? mSyncObject.wait(waitTime) : TIMED_OUT; 48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err != NO_ERROR) { 48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (isFrozen()) { 48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we timed out and are still frozen 48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGW("timeout expired mFreezeDisplay=%d, mFreezeCount=%d", 48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeDisplay, mFreezeCount); 49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeCount = 0; 491c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mFreezeDisplay = false; 49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 495c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mFreezeDisplayTime = 0; 49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSyncObject.wait(); 49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::signalEvent() { 50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSyncObject.open(); 50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::signal() const { 50554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSyncObject.open(); 50654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 50754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::signalDelayedEvent(nsecs_t delay) 50954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 51054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (android_atomic_or(1, &mDeplayedTransactionPending) == 0) { 51154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sp<DelayedTransaction> delayedEvent(new DelayedTransaction(this, delay)); 51254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delayedEvent->run("DelayedeEvent", PRIORITY_URGENT_DISPLAY); 51354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 51454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 51554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------- 51754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0 51854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark - 51954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark Main loop 52054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif 52154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 52254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool SurfaceFlinger::threadLoop() 52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 52454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project waitForEvent(); 52554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 52654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // check for transactions 52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(mConsoleSignals)) { 52854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project handleConsoleEvents(); 52954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 53154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (LIKELY(mTransactionCount == 0)) { 53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // if we're in a global transaction, don't do anything. 53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t mask = eTransactionNeeded | eTraversalNeeded; 53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t transactionFlags = getTransactionFlags(mask); 53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (LIKELY(transactionFlags)) { 53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project handleTransaction(transactionFlags); 53754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 54054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // post surfaces (if needed) 54154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project handlePageFlip(); 54254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 54354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 54454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (LIKELY(hw.canDraw())) { 54554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // repaint the framebuffer (if needed) 54654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project handleRepaint(); 54754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 54854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // release the clients before we flip ('cause flip might block) 54954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project unlockClients(); 55054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project executeScheduledBroadcasts(); 55154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // sample the cpu gauge 55354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(mDebugCpu)) { 55454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project handleDebugCpu(); 55554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 55654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 55754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project postFramebuffer(); 55854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 55954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // pretend we did the post 56054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project unlockClients(); 56154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project executeScheduledBroadcasts(); 56254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project usleep(16667); // 60 fps period 56354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 56454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 56554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 56654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 56754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::postFramebuffer() 56854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool skip = mOrientationAnimation->run(); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(skip)) { 57154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 57454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mInvalidRegion.isEmpty()) { 57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 57754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(mDebugFps)) { 57854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project debugShowFPS(); 57954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 58054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 58154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hw.flip(mInvalidRegion); 58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 58354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mInvalidRegion.clear(); 58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (Layer::deletedTextures.size()) { 58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDeleteTextures( 58754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Layer::deletedTextures.size(), 58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Layer::deletedTextures.array()); 58954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Layer::deletedTextures.clear(); 59054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 59154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 59254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 59354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 59454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleConsoleEvents() 59554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 59654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // something to do with the console 59754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw = graphicPlane(0).displayHardware(); 59854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 59954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int what = android_atomic_and(0, &mConsoleSignals); 60054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eConsoleAcquired) { 60154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hw.acquireScreen(); 60254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 60354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 60454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDeferReleaseConsole && hw.canDraw()) { 60554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // We got the release signal before the aquire signal 60654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDeferReleaseConsole = false; 60754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project revokeGPU(); 60854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hw.releaseScreen(); 60954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 61154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eConsoleReleased) { 61254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (hw.canDraw()) { 61354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project revokeGPU(); 61454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hw.releaseScreen(); 61554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 61654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDeferReleaseConsole = true; 61754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 62054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.set(hw.bounds()); 62154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 62254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 62354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleTransaction(uint32_t transactionFlags) 62454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 62554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 62654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 62754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 62854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = currentLayers.size(); 62954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 63054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /* 63154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Traversal of the children 63254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * (perform the transaction for each of them if needed) 63354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 63454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 63554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const bool layersNeedTransaction = transactionFlags & eTraversalNeeded; 63654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layersNeedTransaction) { 63754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 63854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const layer = currentLayers[i]; 63954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded); 64054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!trFlags) continue; 64154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 64254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t flags = layer->doTransaction(0); 64354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (flags & Layer::eVisibleRegion) 64454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mVisibleRegionsDirty = true; 64554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 64654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (flags & Layer::eRestartTransaction) { 64754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // restart the transaction, but back-off a little 64854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->setTransactionFlags(eTransactionNeeded); 64954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTraversalNeeded, ms2ns(8)); 65054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 65454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /* 65554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Perform our own transaction if needed 65654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 65754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 65854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (transactionFlags & eTransactionNeeded) { 65954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCurrentState.orientation != mDrawingState.orientation) { 66054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the orientation has changed, recompute all visible regions 66154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // and invalidate everything. 66254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 66354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int dpy = 0; 66454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int orientation = mCurrentState.orientation; 665c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian const uint32_t type = mCurrentState.orientationType; 66654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project GraphicPlane& plane(graphicPlane(dpy)); 66754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project plane.setOrientation(orientation); 66854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 66954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // update the shared control block 67054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(plane.displayHardware()); 67154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project volatile display_cblk_t* dcblk = mServerCblk->displays + dpy; 67254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->orientation = orientation; 67354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (orientation & eOrientationSwapMask) { 67454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // 90 or 270 degrees orientation 67554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->w = hw.getHeight(); 67654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->h = hw.getWidth(); 67754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 67854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->w = hw.getWidth(); 67954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dcblk->h = hw.getHeight(); 68054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 68154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 68254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mVisibleRegionsDirty = true; 68354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.set(hw.bounds()); 684c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian mFreezeDisplayTime = 0; 685c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian mOrientationAnimation->onOrientationChanged(type); 68654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 68754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 68854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCurrentState.freezeDisplay != mDrawingState.freezeDisplay) { 68954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // freezing or unfreezing the display -> trigger animation if needed 69054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeDisplay = mCurrentState.freezeDisplay; 69154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 69254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 69354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // some layers might have been removed, so 69454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we need to update the regions they're exposing. 69554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t c = mRemovedLayers.size(); 69654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (c) { 69754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mVisibleRegionsDirty = true; 69854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 69954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 70054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 70154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) { 70254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // layers have been added 70354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mVisibleRegionsDirty = true; 70454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 70554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 70654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // get rid of all resources we don't need anymore 70754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // (layers and clients) 70854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project free_resources_l(); 70954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project commitTransaction(); 71254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 71354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<FreezeLock> SurfaceFlinger::getFreezeLock() const 71554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 71654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return new FreezeLock(const_cast<SurfaceFlinger *>(this)); 71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::computeVisibleRegions( 72054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerVector& currentLayers, Region& dirtyRegion, Region& opaqueRegion) 72154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 72254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GraphicPlane& plane(graphicPlane(0)); 72354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Transform& planeTransform(plane.transform()); 72454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 72554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region aboveOpaqueLayers; 72654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region aboveCoveredLayers; 72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region dirty; 72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool secureFrameBuffer = false; 73054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 73154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t i = currentLayers.size(); 73254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (i--) { 73354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const layer = currentLayers[i]; 73454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->validateVisibility(planeTransform); 73554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 73654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // start with the whole surface at its current location 73754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Layer::State& s = layer->drawingState(); 73854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Rect bounds(layer->visibleBounds()); 73954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 74054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // handle hidden surfaces by setting the visible region to empty 74154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region opaqueRegion; 74254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region visibleRegion; 74354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region coveredRegion; 74454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY((s.flags & ISurfaceComposer::eLayerHidden) || !s.alpha)) { 74554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project visibleRegion.clear(); 74654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 74754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const bool translucent = layer->needsBlending(); 74854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project visibleRegion.set(bounds); 74954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project coveredRegion = visibleRegion; 75054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 75154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Remove the transparent area from the visible region 75254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (translucent) { 75354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project visibleRegion.subtractSelf(layer->transparentRegionScreen); 75454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 75554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 75654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // compute the opaque region 75754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (s.alpha==255 && !translucent && layer->getOrientation()>=0) { 75854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the opaque region is the visible region 75954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project opaqueRegion = visibleRegion; 76054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 76154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 76254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 76354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // subtract the opaque region covered by the layers above us 76454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project visibleRegion.subtractSelf(aboveOpaqueLayers); 76554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project coveredRegion.andSelf(aboveCoveredLayers); 76654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 76754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // compute this layer's dirty region 768b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project if (layer->contentDirty) { 76954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we need to invalidate the whole region 77054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dirty = visibleRegion; 77154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // as well, as the old visible region 77254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dirty.orSelf(layer->visibleRegionScreen); 773b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project layer->contentDirty = false; 77454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 77554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // compute the exposed region 77654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // dirty = what's visible now - what's wasn't covered before 77754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // = what's visible now & what's was covered before 77854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dirty = visibleRegion.intersect(layer->coveredRegionScreen); 77954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 78054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dirty.subtractSelf(aboveOpaqueLayers); 78154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 78254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // accumulate to the screen dirty region 78354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project dirtyRegion.orSelf(dirty); 78454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 78554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // updade aboveOpaqueLayers/aboveCoveredLayers for next (lower) layer 78654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project aboveOpaqueLayers.orSelf(opaqueRegion); 78754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project aboveCoveredLayers.orSelf(bounds); 78854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 78954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Store the visible region is screen space 79054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->setVisibleRegion(visibleRegion); 79154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->setCoveredRegion(coveredRegion); 79254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 79354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // If a secure layer is partially visible, lockdown the screen! 79454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->isSecure() && !visibleRegion.isEmpty()) { 79554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project secureFrameBuffer = true; 79654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 79754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 79854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 79954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSecureFrameBuffer = secureFrameBuffer; 80054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project opaqueRegion = aboveOpaqueLayers; 80154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 80254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 80354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 80454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::commitTransaction() 80554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 80654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDrawingState = mCurrentState; 80754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTransactionCV.signal(); 80854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 80954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 81054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handlePageFlip() 81154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 81254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool visibleRegions = mVisibleRegionsDirty; 81354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerVector& currentLayers = const_cast<LayerVector&>(mDrawingState.layersSortedByZ); 81454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project visibleRegions |= lockPageFlip(currentLayers); 81554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 81654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw = graphicPlane(0).displayHardware(); 81754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Region screenRegion(hw.bounds()); 81854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (visibleRegions) { 81954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region opaqueRegion; 82054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion); 82154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mWormholeRegion = screenRegion.subtract(opaqueRegion); 82254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mVisibleRegionsDirty = false; 82354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 82454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 82554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project unlockPageFlip(currentLayers); 82654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.andSelf(screenRegion); 82754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 82854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 82954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool SurfaceFlinger::lockPageFlip(const LayerVector& currentLayers) 83054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 83154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool recomputeVisibleRegions = false; 83254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t count = currentLayers.size(); 83354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const* layers = currentLayers.array(); 83454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 83554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const layer = layers[i]; 83654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->lockPageFlip(recomputeVisibleRegions); 83754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 83854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return recomputeVisibleRegions; 83954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 84054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 84154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::unlockPageFlip(const LayerVector& currentLayers) 84254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 84354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GraphicPlane& plane(graphicPlane(0)); 84454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Transform& planeTransform(plane.transform()); 84554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t count = currentLayers.size(); 84654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const* layers = currentLayers.array(); 84754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 84854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const layer = layers[i]; 84954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->unlockPageFlip(planeTransform, mDirtyRegion); 85054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 85154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 85254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 85354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleRepaint() 85454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 85554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // set the frame buffer 85654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 85754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glMatrixMode(GL_MODELVIEW); 85854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glLoadIdentity(); 85954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 86054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(mDebugRegion)) { 86154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project debugFlashRegions(); 86254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 86354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 86454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // compute the invalid region 86554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mInvalidRegion.orSelf(mDirtyRegion); 86654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 86754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t flags = hw.getFlags(); 86854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (flags & DisplayHardware::BUFFER_PRESERVED) { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // here we assume DisplayHardware::flip()'s implementation 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // performs the copy-back optimization. 87154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 87254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (flags & DisplayHardware::UPDATE_ON_DEMAND) { 87354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we need to fully redraw the part that will be updated 87454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.set(mInvalidRegion.bounds()); 87554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 87654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we need to redraw everything 87754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.set(hw.bounds()); 87854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mInvalidRegion = mDirtyRegion; 87954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 88054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 88154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 88254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // compose all surfaces 88354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project composeSurfaces(mDirtyRegion); 88454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 88554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // clear the dirty regions 88654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.clear(); 88754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 88854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 88954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::composeSurfaces(const Region& dirty) 89054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 89154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(!mWormholeRegion.isEmpty())) { 89254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // should never happen unless the window manager has a bug 89354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // draw something... 89454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project drawWormhole(); 89554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 89654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const SurfaceFlinger& flinger(*this); 89754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerVector& drawingLayers(mDrawingState.layersSortedByZ); 89854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = drawingLayers.size(); 89954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase const* const* const layers = drawingLayers.array(); 90054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; ++i) { 90154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase const * const layer = layers[i]; 90254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Region& visibleRegion(layer->visibleRegionScreen); 90354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!visibleRegion.isEmpty()) { 90454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Region clip(dirty.intersect(visibleRegion)); 90554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!clip.isEmpty()) { 90654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->draw(clip); 90754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 90854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 90954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 91054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 91154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 91254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::unlockClients() 91354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 91454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerVector& drawingLayers(mDrawingState.layersSortedByZ); 91554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = drawingLayers.size(); 91654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const* const layers = drawingLayers.array(); 91754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; ++i) { 91854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const layer = layers[i]; 91954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->finishPageFlip(); 92054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 92154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 92254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 92354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::scheduleBroadcast(Client* client) 92454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 92554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mLastScheduledBroadcast != client) { 92654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastScheduledBroadcast = client; 92754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mScheduledBroadcasts.add(client); 92854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 92954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 93054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 93154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::executeScheduledBroadcasts() 93254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 93354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project SortedVector<Client*>& list = mScheduledBroadcasts; 93454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t count = list.size(); 93554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (count--) { 93654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project per_client_cblk_t* const cblk = list[count]->ctrlblk; 93754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (cblk->lock.tryLock() == NO_ERROR) { 93854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project cblk->cv.broadcast(); 93954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project list.removeAt(count); 94054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project cblk->lock.unlock(); 94154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 94254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // schedule another round 94354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGW("executeScheduledBroadcasts() skipped, " 94454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "contention on the client. We'll try again later..."); 94554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalDelayedEvent(ms2ns(4)); 94654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 94754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 94854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastScheduledBroadcast = 0; 94954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 95054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 95154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleDebugCpu() 95254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 95354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mDebugLock); 95454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCpuGauge != 0) 95554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCpuGauge->sample(); 95654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 95754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 95854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::debugFlashRegions() 95954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 96054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(!mDirtyRegion.isRect())) { 96154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // TODO: do this only if we don't have preserving 96254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // swapBuffer. If we don't have update-on-demand, 96354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // redraw everything. 96454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project composeSurfaces(Region(mDirtyRegion.bounds())); 96554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 96654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 96754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_TEXTURE_2D); 96854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_BLEND); 96954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_DITHER); 97054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_SCISSOR_TEST); 97154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 97254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glColor4x(0x10000, 0, 0x10000, 0x10000); 97354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 97454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Rect r; 97554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region::iterator iterator(mDirtyRegion); 97654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (iterator.iterate(&r)) { 97754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project GLfloat vertices[][2] = { 97854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { r.left, r.top }, 97954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { r.left, r.bottom }, 98054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { r.right, r.bottom }, 98154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { r.right, r.top } 98254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project }; 98354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glVertexPointer(2, GL_FLOAT, 0, vertices); 98454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 98554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 98654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 98754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 98854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project hw.flip(mDirtyRegion.merge(mInvalidRegion)); 98954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mInvalidRegion.clear(); 99054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 99154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDebugRegion > 1) 99254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project usleep(mDebugRegion * 1000); 99354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 99454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glEnable(GL_SCISSOR_TEST); 99554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project //mDirtyRegion.dump("mDirtyRegion"); 99654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 99754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 99854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::drawWormhole() const 99954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 100054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Region region(mWormholeRegion.intersect(mDirtyRegion)); 100154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (region.isEmpty()) 100254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 100354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 100454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 100554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int32_t width = hw.getWidth(); 100654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int32_t height = hw.getHeight(); 100754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 100854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_BLEND); 100954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisable(GL_DITHER); 101054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 101154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (LIKELY(!mDebugBackground)) { 101254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glClearColorx(0,0,0,0); 101354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Rect r; 101454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region::iterator iterator(region); 101554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (iterator.iterate(&r)) { 101654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GLint sy = height - (r.top + r.height()); 101754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 101854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 101954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 102054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 102154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { width, 0 }, 102254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { width, height }, { 0, height } }; 102354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GLshort tcoords[][2] = { { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }; 102454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 102554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexCoordPointer(2, GL_SHORT, 0, tcoords); 102654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glEnableClientState(GL_TEXTURE_COORD_ARRAY); 102754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glEnable(GL_TEXTURE_2D); 102854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mWormholeTexName); 102954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 103054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glMatrixMode(GL_TEXTURE); 103154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glLoadIdentity(); 103254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glScalef(width*(1.0f/32.0f), height*(1.0f/32.0f), 1); 103354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Rect r; 103454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Region::iterator iterator(region); 103554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (iterator.iterate(&r)) { 103654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const GLint sy = height - (r.top + r.height()); 103754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 103854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 103954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 104054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project glDisableClientState(GL_TEXTURE_COORD_ARRAY); 104154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 104254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 104354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 104454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::debugShowFPS() const 104554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 104654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static int mFrameCount; 104754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static int mLastFrameCount = 0; 104854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static nsecs_t mLastFpsTime = 0; 104954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static float mFps = 0; 105054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFrameCount++; 105154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project nsecs_t now = systemTime(); 105254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project nsecs_t diff = now - mLastFpsTime; 105354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (diff > ms2ns(250)) { 105454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFps = ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff; 105554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastFpsTime = now; 105654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastFrameCount = mFrameCount; 105754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 105854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // XXX: mFPS has the value we want 105954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 106054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t SurfaceFlinger::addLayer(LayerBase* layer) 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mStateLock); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addLayer_l(layer); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTransactionFlags(eTransactionNeeded|eTraversalNeeded); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t SurfaceFlinger::removeLayer(LayerBase* layer) 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock _l(mStateLock); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeLayer_l(layer); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTransactionFlags(eTransactionNeeded); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t SurfaceFlinger::invalidateLayerVisibility(LayerBase* layer) 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project layer->forceVisibilityTransaction(); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTransactionFlags(eTraversalNeeded); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::addLayer_l(LayerBase* layer) 108554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 108654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t i = mCurrentState.layersSortedByZ.add( 108754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer, &LayerBase::compareCurrentStateZ); 108854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* lbc = LayerBase::dynamicCast<LayerBaseClient*>(layer); 108954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (lbc) { 109054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayerMap.add(lbc->serverIndex(), lbc); 109154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 109254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRemovedLayers.remove(layer); 109354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 109454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 109554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 109654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::removeLayer_l(LayerBase* layerBase) 109754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 109854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase); 109954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (index >= 0) { 110054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRemovedLayers.add(layerBase); 110154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* layer = LayerBase::dynamicCast<LayerBaseClient*>(layerBase); 110254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer) { 110354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayerMap.removeItem(layer->serverIndex()); 110454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 110554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 110654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 110754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // it's possible that we don't find a layer, because it might 110854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // have been destroyed already -- this is not technically an error 110954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // from the user because there is a race between destroySurface, 111054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // destroyclient and destroySurface-from-a-transaction. 111154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return (index == NAME_NOT_FOUND) ? status_t(NO_ERROR) : index; 111254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 111354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 111454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::free_resources_l() 111554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 111654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // Destroy layers that were removed 111754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project destroy_all_removed_layers_l(); 111854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 111954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // free resources associated with disconnected clients 112054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project SortedVector<Client*>& scheduledBroadcasts(mScheduledBroadcasts); 112154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Vector<Client*>& disconnectedClients(mDisconnectedClients); 112254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = disconnectedClients.size(); 112354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 112454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client = disconnectedClients[i]; 112554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // if this client is the scheduled broadcast list, 112654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // remove it from there (and we don't need to signal it 112754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // since it is dead). 112854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t index = scheduledBroadcasts.indexOf(client); 112954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (index >= 0) { 113054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project scheduledBroadcasts.removeItemsAt(index); 113154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 113254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTokens.release(client->cid); 113354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete client; 113454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 113554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project disconnectedClients.clear(); 113654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 113754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 113854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::destroy_all_removed_layers_l() 113954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 114054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t c = mRemovedLayers.size(); 114154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (c--) { 114254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase* const removed_layer = mRemovedLayers[c]; 114354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 114454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGE_IF(mCurrentState.layersSortedByZ.indexOf(removed_layer) >= 0, 114554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "layer %p removed but still in the current state list", 114654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project removed_layer); 114754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 114854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete removed_layer; 114954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 115054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRemovedLayers.clear(); 115154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 115254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 115354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 115454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectuint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) 115554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 115654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 115754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 115854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 115954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectuint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags, nsecs_t delay) 116054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 116154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t old = android_atomic_or(flags, &mTransactionFlags); 116254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if ((old & flags)==0) { // wake the server up 116354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (delay > 0) { 116454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalDelayedEvent(delay); 116554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 116654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalEvent(); 116754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 116854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 116954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return old; 117054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 117154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 117254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::openGlobalTransaction() 117354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 117454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project android_atomic_inc(&mTransactionCount); 117554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 117654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 117754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::closeGlobalTransaction() 117854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 117954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (android_atomic_dec(&mTransactionCount) == 1) { 118054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalEvent(); 118154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 118254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 118354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 118454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::freezeDisplay(DisplayID dpy, uint32_t flags) 118554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 118654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT)) 118754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return BAD_VALUE; 118854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 118954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 119054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCurrentState.freezeDisplay = 1; 119154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTransactionNeeded); 119254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 119354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // flags is intended to communicate some sort of animation behavior 119454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // (for instance fadding) 119554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 119654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 119754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 119854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::unfreezeDisplay(DisplayID dpy, uint32_t flags) 119954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 120054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT)) 120154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return BAD_VALUE; 120254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 120354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 120454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCurrentState.freezeDisplay = 0; 120554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTransactionNeeded); 120654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 120754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // flags is intended to communicate some sort of animation behavior 120854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // (for instance fadding) 120954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 121054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 121154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1212c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopianint SurfaceFlinger::setOrientation(DisplayID dpy, 1213c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian int orientation, uint32_t flags) 121454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 121554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT)) 121654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return BAD_VALUE; 121754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 121854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 121954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCurrentState.orientation != orientation) { 122054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (uint32_t(orientation)<=eOrientation270 || orientation==42) { 1221c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian mCurrentState.orientationType = flags; 122254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCurrentState.orientation = orientation; 122354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTransactionNeeded); 122454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTransactionCV.wait(mStateLock); 122554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 122654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project orientation = BAD_VALUE; 122754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 122854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 122954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return orientation; 123054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 123154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 123254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid, 123354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ISurfaceFlingerClient::surface_data_t* params, 123454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project DisplayID d, uint32_t w, uint32_t h, PixelFormat format, 123554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t flags) 123654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 123754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* layer = 0; 123854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sp<LayerBaseClient::Surface> surfaceHandle; 123954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 124054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* const c = mClientsMap.valueFor(clientId); 124154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(!c)) { 124254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGE("createSurface() failed, client not found (id=%d)", clientId); 124354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return surfaceHandle; 124454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 124554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 124654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project //LOGD("createSurface for pid %d (%d x %d)", pid, w, h); 124754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t id = c->generateId(pid); 124854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (uint32_t(id) >= NUM_LAYERS_MAX) { 124954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGE("createSurface() failed, generateId = %d", id); 125054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return surfaceHandle; 125154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 125254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 125354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (flags & eFXSurfaceMask) { 125454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case eFXSurfaceNormal: 125554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(flags & ePushBuffers)) { 125654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer = createPushBuffersSurfaceLocked(c, d, id, w, h, flags); 125754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 125854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags); 125954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 126054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 126154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case eFXSurfaceBlur: 126254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer = createBlurSurfaceLocked(c, d, id, w, h, flags); 126354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 126454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case eFXSurfaceDim: 126554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer = createDimSurfaceLocked(c, d, id, w, h, flags); 126654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 126754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 126854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 126954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer) { 127054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTransactionNeeded); 127154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project surfaceHandle = layer->getSurface(); 127254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (surfaceHandle != 0) 127354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project surfaceHandle->getSurfaceData(params); 127454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 127554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 127654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return surfaceHandle; 127754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 127854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 127954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createNormalSurfaceLocked( 128054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client, DisplayID display, 128154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t id, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) 128254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 128354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // initialize the surfaces 128454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (format) { // TODO: take h/w into account 128554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case PIXEL_FORMAT_TRANSPARENT: 128654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case PIXEL_FORMAT_TRANSLUCENT: 128754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project format = PIXEL_FORMAT_RGBA_8888; 128854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 128954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case PIXEL_FORMAT_OPAQUE: 129054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project format = PIXEL_FORMAT_RGB_565; 129154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 129254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 129354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 129454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Layer* layer = new Layer(this, display, client, id); 129554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project status_t err = layer->setBuffers(client, w, h, format, flags); 129654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (LIKELY(err == NO_ERROR)) { 129754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->initStates(w, h, flags); 129854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addLayer_l(layer); 129954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 130054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err)); 130154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete layer; 130254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 130354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 130454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return layer; 130554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 130654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 130754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createBlurSurfaceLocked( 130854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client, DisplayID display, 130954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t id, uint32_t w, uint32_t h, uint32_t flags) 131054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 131154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBlur* layer = new LayerBlur(this, display, client, id); 131254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->initStates(w, h, flags); 131354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addLayer_l(layer); 131454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return layer; 131554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 131654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 131754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createDimSurfaceLocked( 131854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client, DisplayID display, 131954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t id, uint32_t w, uint32_t h, uint32_t flags) 132054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 132154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerDim* layer = new LayerDim(this, display, client, id); 132254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->initStates(w, h, flags); 132354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addLayer_l(layer); 132454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return layer; 132554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 132654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 132754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createPushBuffersSurfaceLocked( 132854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client, DisplayID display, 132954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t id, uint32_t w, uint32_t h, uint32_t flags) 133054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 133154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBuffer* layer = new LayerBuffer(this, display, client, id); 133254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->initStates(w, h, flags); 133354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project addLayer_l(layer); 133454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return layer; 133554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 133654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 133754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::destroySurface(SurfaceID index) 133854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 133954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 134054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* const layer = getLayerUser_l(index); 134154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project status_t err = removeLayer_l(layer); 134254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err < 0) 134354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 134454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(eTransactionNeeded); 134554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 134654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 134754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 134854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::setClientState( 134954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ClientID cid, 135054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int32_t count, 135154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const layer_state_t* states) 135254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 135354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 135454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t flags = 0; 135554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project cid <<= 16; 135654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i=0 ; i<count ; i++) { 135754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const layer_state_t& s = states[i]; 135854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* layer = getLayerUser_l(s.surface | cid); 135954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer) { 136054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t what = s.what; 136154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // check if it has been destroyed first 136254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eDestroyed) { 136354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (removeLayer_l(layer) == NO_ERROR) { 136454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTransactionNeeded; 136554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we skip everything else... well, no, not really 136654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we skip ONLY that transaction. 136754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project continue; 136854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 136954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 137054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & ePositionChanged) { 137154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setPosition(s.x, s.y)) 137254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTraversalNeeded; 137354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 137454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eLayerChanged) { 137554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setLayer(s.z)) { 137654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCurrentState.layersSortedByZ.reorder( 137754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer, &Layer::compareCurrentStateZ); 137854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we need traversal (state changed) 137954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // AND transaction (list changed) 138054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTransactionNeeded|eTraversalNeeded; 138154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 138254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 138354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eSizeChanged) { 138454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setSize(s.w, s.h)) 138554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTraversalNeeded; 138654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 138754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eAlphaChanged) { 138854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f))) 138954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTraversalNeeded; 139054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 139154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eMatrixChanged) { 139254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setMatrix(s.matrix)) 139354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTraversalNeeded; 139454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 139554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eTransparentRegionChanged) { 139654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setTransparentRegionHint(s.transparentRegion)) 139754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTraversalNeeded; 139854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 139954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (what & eVisibilityChanged) { 140054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (layer->setFlags(s.flags, s.mask)) 140154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project flags |= eTraversalNeeded; 140254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (flags) { 140654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setTransactionFlags(flags); 140754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 140854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 140954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 141054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 141154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::getLayerUser_l(SurfaceID s) const 141254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 141354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mLayerMap.valueFor(s); 141454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 141554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 141654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::screenReleased(int dpy) 141754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 141854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // this may be called by a signal handler, we can't do too much in here 141954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project android_atomic_or(eConsoleReleased, &mConsoleSignals); 142054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalEvent(); 142154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 142254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 142354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::screenAcquired(int dpy) 142454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 142554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // this may be called by a signal handler, we can't do too much in here 142654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project android_atomic_or(eConsoleAcquired, &mConsoleSignals); 142754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalEvent(); 142854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 142954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 143054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::dump(int fd, const Vector<String16>& args) 143154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 143254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t SIZE = 1024; 143354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char buffer[SIZE]; 143454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String8 result; 143554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (checkCallingPermission( 143654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String16("android.permission.DUMP")) == false) 143754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { // not allowed 143854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project snprintf(buffer, SIZE, "Permission Denial: " 143954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "can't dump SurfaceFlinger from pid=%d, uid=%d\n", 144054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IPCThreadState::self()->getCallingPid(), 144154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IPCThreadState::self()->getCallingUid()); 144254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result.append(buffer); 144354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 144454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 144554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t s = mClientsMap.size(); 144654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char name[64]; 144754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<s ; i++) { 144854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Client* client = mClientsMap.valueAt(i); 144954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sprintf(name, " Client (id=0x%08x)", client->cid); 145054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project client->dump(name); 145154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 145254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerVector& currentLayers = mCurrentState.layersSortedByZ; 145354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t count = currentLayers.size(); 145454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0 ; i<count ; i++) { 145554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /*** LayerBase ***/ 145654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase const * const layer = currentLayers[i]; 145754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Layer::State& s = layer->drawingState(); 145854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project snprintf(buffer, SIZE, 145954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "+ %s %p\n" 146054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " " 146154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), " 146254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "needsBlending=%1d, invalidate=%1d, " 146354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 146454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->getTypeID(), layer, 146554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s.z, layer->tx(), layer->ty(), s.w, s.h, 1466b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project layer->needsBlending(), layer->contentDirty, 146754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s.alpha, s.flags, 146854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s.transform[0], s.transform[1], 146954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s.transform[2], s.transform[3]); 147054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result.append(buffer); 147154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project buffer[0] = 0; 147254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /*** LayerBaseClient ***/ 147354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBaseClient* const lbc = 147454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LayerBase::dynamicCast<LayerBaseClient*>((LayerBase*)layer); 147554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (lbc) { 147654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project snprintf(buffer, SIZE, 147754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " " 147854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "id=0x%08x, client=0x%08x, identity=%u\n", 147954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lbc->clientIndex(), lbc->client ? lbc->client->cid : 0, 148054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project lbc->getIdentity()); 148154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 148254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result.append(buffer); 148354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project buffer[0] = 0; 148454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /*** Layer ***/ 148554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Layer* const l = LayerBase::dynamicCast<Layer*>((LayerBase*)layer); 148654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (l) { 148754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerBitmap& buf0(l->getBuffer(0)); 148854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const LayerBitmap& buf1(l->getBuffer(1)); 148954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project snprintf(buffer, SIZE, 149054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " " 149154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "format=%2d, [%3ux%3u:%3u] [%3ux%3u:%3u], mTextureName=%d," 149254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " freezeLock=%p, swapState=0x%08x\n", 149354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project l->pixelFormat(), 149454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project buf0.width(), buf0.height(), buf0.stride(), 149554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project buf1.width(), buf1.height(), buf1.stride(), 149654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project l->getTextureName(), l->getFreezeLock().get(), 149754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project l->lcblk->swapState); 149854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 149954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result.append(buffer); 150054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project buffer[0] = 0; 150154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project s.transparentRegion.dump(result, "transparentRegion"); 150254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->transparentRegionScreen.dump(result, "transparentRegionScreen"); 150354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project layer->visibleRegionScreen.dump(result, "visibleRegionScreen"); 150454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 150554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mWormholeRegion.dump(result, "WormholeRegion"); 150654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 150754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project snprintf(buffer, SIZE, 150854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " display frozen: %s, freezeCount=%d, orientation=%d, canDraw=%d\n", 150954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeDisplay?"yes":"no", mFreezeCount, 151054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCurrentState.orientation, hw.canDraw()); 151154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result.append(buffer); 151254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 151354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sp<AllocatorInterface> allocator; 151454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mGPU != 0) { 151554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project snprintf(buffer, SIZE, " GPU owner: %d\n", mGPU->getOwner()); 151654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result.append(buffer); 151754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project allocator = mGPU->getAllocator(); 151854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (allocator != 0) { 151954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project allocator->dump(result, "GPU Allocator"); 152054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 152154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 152254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project allocator = mSurfaceHeapManager->getAllocator(NATIVE_MEMORY_TYPE_PMEM); 152354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (allocator != 0) { 152454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project allocator->dump(result, "PMEM Allocator"); 152554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 152654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 152754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project write(fd, result.string(), result.size()); 152854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 152954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 153054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 153154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::onTransact( 153254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 153354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 153454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (code) { 153554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case CREATE_CONNECTION: 153654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case OPEN_GLOBAL_TRANSACTION: 153754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case CLOSE_GLOBAL_TRANSACTION: 153854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case SET_ORIENTATION: 153954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case FREEZE_DISPLAY: 154054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case UNFREEZE_DISPLAY: 154154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case BOOT_FINISHED: 154254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case REVOKE_GPU: 154354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { 154454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // codes that require permission check 154554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 154654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int pid = ipc->getCallingPid(); 154754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int self_pid = getpid(); 154854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (UNLIKELY(pid != self_pid)) { 154954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // we're called from a different process, do the real check 155054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!checkCallingPermission( 155154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project String16("android.permission.ACCESS_SURFACE_FLINGER"))) 155254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project { 155354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int uid = ipc->getCallingUid(); 155454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project LOGE("Permission Denial: " 155554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 155654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return PERMISSION_DENIED; 155754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 155854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 155954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 156054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 156154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 156254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags); 156354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) { 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // HARDWARE_TEST stuff... 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(checkCallingPermission( 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16("android.permission.HARDWARE_TEST")) == false)) 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { // not allowed 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Permission Denial: pid=%d, uid=%d\n", 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->getCallingPid(), 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->getCallingUid()); 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PERMISSION_DENIED; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n; 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (code) { 157554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1000: // SHOW_CPU 157654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project n = data.readInt32(); 157754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugCpu = n ? 1 : 0; 157854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDebugCpu) { 157954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCpuGauge == 0) { 158054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCpuGauge = new CPUGauge(this, ms2ns(500)); 158154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 158254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 158354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCpuGauge != 0) { 158454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCpuGauge->requestExitAndWait(); 158554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mDebugLock); 158654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCpuGauge.clear(); 158754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 158854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 158954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 159054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1001: // SHOW_FPS 159154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project n = data.readInt32(); 159254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugFps = n ? 1 : 0; 159354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 159454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1002: // SHOW_UPDATES 159554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project n = data.readInt32(); 159654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugRegion = n ? n : (mDebugRegion ? 0 : 1); 159754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 159854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1003: // SHOW_BACKGROUND 159954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project n = data.readInt32(); 160054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDebugBackground = n ? 1 : 0; 160154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 160254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1004:{ // repaint everything 160354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 160454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 160554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDirtyRegion.set(hw.bounds()); // careful that's not thread-safe 160654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project signalEvent(); 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 160954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1005: // ask GPU revoke 16100c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian if (mGPU != 0) { 16110c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian mGPU->friendlyRevoke(); 16120c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian } 161354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 161454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1006: // revoke GPU 16150c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian if (mGPU != 0) { 16160c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian mGPU->unconditionalRevoke(); 16170c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian } 161854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 161954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1007: // set mFreezeCount 162054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFreezeCount = data.readInt32(); 162154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 162254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1010: // interrogate. 162354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reply->writeInt32(mDebugCpu); 162454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reply->writeInt32(0); 162554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reply->writeInt32(mDebugRegion); 162654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reply->writeInt32(mDebugBackground); 162754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1013: { 162954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Mutex::Autolock _l(mStateLock); 163054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 163154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reply->writeInt32(hw.getPageFlipCount()); 163254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 163354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 163454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 163554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 163654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 163754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 163854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 163954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 164054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0 164154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark - 164254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif 164354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 164454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectClient::Client(ClientID clientID, const sp<SurfaceFlinger>& flinger) 164554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project : ctrlblk(0), cid(clientID), mPid(0), mBitmap(0), mFlinger(flinger) 164654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 1647f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mSharedHeapAllocator = getSurfaceHeapManager()->createHeap(); 164854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int pgsize = getpagesize(); 164954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int cblksize=((sizeof(per_client_cblk_t)+(pgsize-1))&~(pgsize-1)); 165054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCblkHeap = new MemoryDealer(cblksize); 165154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCblkMemory = mCblkHeap->allocate(cblksize); 165254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCblkMemory != 0) { 165354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctrlblk = static_cast<per_client_cblk_t *>(mCblkMemory->pointer()); 165454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (ctrlblk) { // construct the shared structure in-place. 165554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project new(ctrlblk) per_client_cblk_t; 165654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 165754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 165854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 165954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 166054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectClient::~Client() { 166154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (ctrlblk) { 166254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const int pgsize = getpagesize(); 166354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ctrlblk->~per_client_cblk_t(); // destroy our shared-structure. 166454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 166554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 166654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 166754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst sp<SurfaceHeapManager>& Client::getSurfaceHeapManager() const { 166854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mFlinger->getSurfaceHeapManager(); 166954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 167054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 167154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint32_t Client::generateId(int pid) 167254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 167354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const uint32_t i = clz( ~mBitmap ); 167454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (i >= NUM_LAYERS_MAX) { 167554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_MEMORY; 167654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 167754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mPid = pid; 167854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mInUse.add(uint8_t(i)); 167954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mBitmap |= 1<<(31-i); 168054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return i; 168154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 168254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t Client::bindLayer(LayerBaseClient* layer, int32_t id) 168354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 168454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t idx = mInUse.indexOf(id); 168554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (idx < 0) 168654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NAME_NOT_FOUND; 168754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mLayers.insertAt(layer, idx); 168854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 168954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid Client::free(int32_t id) 169054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 169154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t idx = mInUse.remove(uint8_t(id)); 169254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (idx >= 0) { 169354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mBitmap &= ~(1<<(31-id)); 169454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayers.removeItemsAt(idx); 169554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 169654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 169754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1698f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Projectsp<MemoryDealer> Client::createAllocator(uint32_t flags) 169954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 170054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sp<MemoryDealer> allocator; 1701f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project allocator = getSurfaceHeapManager()->createHeap( 1702f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project flags, getClientPid(), mSharedHeapAllocator); 170354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return allocator; 170454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 170554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 170654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool Client::isValid(int32_t i) const { 170754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return (uint32_t(i)<NUM_LAYERS_MAX) && (mBitmap & (1<<(31-i))); 170854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 170954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst uint8_t* Client::inUseArray() const { 171054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mInUse.array(); 171154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 171254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsize_t Client::numActiveLayers() const { 171354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mInUse.size(); 171454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 171554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* Client::getLayerUser(int32_t i) const { 171654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ssize_t idx = mInUse.indexOf(uint8_t(i)); 171754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (idx<0) return 0; 171854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mLayers[idx]; 171954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 172054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 172154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid Client::dump(const char* what) 172254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 172354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 172454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 172554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 172654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0 172754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark - 172854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif 172954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 173054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectBClient::BClient(SurfaceFlinger *flinger, ClientID cid, const sp<IMemory>& cblk) 173154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project : mId(cid), mFlinger(flinger), mCblk(cblk) 173254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 173354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 173454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 173554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectBClient::~BClient() { 173654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // destroy all resources attached to this client 173754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFlinger->destroyConnection(mId); 173854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 173954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 174054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid BClient::getControlBlocks(sp<IMemory>* ctrl) const { 174154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *ctrl = mCblk; 174254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 174354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 174454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<ISurface> BClient::createSurface( 174554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ISurfaceFlingerClient::surface_data_t* params, int pid, 174654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project DisplayID display, uint32_t w, uint32_t h, PixelFormat format, 174754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project uint32_t flags) 174854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 174954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags); 175054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 175154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 175254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t BClient::destroySurface(SurfaceID sid) 175354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 175454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sid |= (mId << 16); // add the client-part to id 175554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mFlinger->destroySurface(sid); 175654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 175754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 175854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t BClient::setState(int32_t count, const layer_state_t* states) 175954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 176054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mFlinger->setClientState(mId, count, states); 176154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 176254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 176354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 176454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 176554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectGraphicPlane::GraphicPlane() 176654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project : mHw(0) 176754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 176854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 176954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 177054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectGraphicPlane::~GraphicPlane() { 177154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete mHw; 177254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 177354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 177454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool GraphicPlane::initialized() const { 177554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mHw ? true : false; 177654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 177754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 177854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid GraphicPlane::setDisplayHardware(DisplayHardware *hw) { 177954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHw = hw; 178054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 178154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 178254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid GraphicPlane::setTransform(const Transform& tr) { 178354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTransform = tr; 178454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mGlobalTransform = mOrientationTransform * mTransform; 178554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 178654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t GraphicPlane::orientationToTransfrom( 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int orientation, int w, int h, Transform* tr) 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 179054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float a, b, c, d, x, y; 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (orientation) { 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ISurfaceComposer::eOrientationDefault: 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a=1; b=0; c=0; d=1; x=0; y=0; 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ISurfaceComposer::eOrientation90: 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a=0; b=-1; c=1; d=0; x=w; y=0; 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ISurfaceComposer::eOrientation180: 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a=-1; b=0; c=0; d=-1; x=w; y=h; 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ISurfaceComposer::eOrientation270: 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a=0; b=1; c=-1; d=0; x=0; y=h; 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BAD_VALUE; 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tr->set(a, b, c, d); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tr->set(x, y); 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 181154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t GraphicPlane::setOrientation(int orientation) 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 181454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const DisplayHardware& hw(displayHardware()); 181554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const float w = hw.getWidth(); 181654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const float h = hw.getHeight(); 181754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 181854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (orientation == ISurfaceComposer::eOrientationDefault) { 181954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // make sure the default orientation is optimal 182054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mOrientationTransform.reset(); 1821d2f34e5fd6c20854b45c76f2a514fb8864277ea2Mathias Agopian mOrientation = orientation; 182254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mGlobalTransform = mTransform; 182354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 182454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 182554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 182654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // If the rotation can be handled in hardware, this is where 182754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the magic should happen. 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(orientation == 42)) { 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float a, b, c, d, x, y; 183054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const float r = (3.14159265f / 180.0f) * 42.0f; 183154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const float si = sinf(r); 183254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const float co = cosf(r); 183354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a=co; b=-si; c=si; d=co; 183454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project x = si*(h*0.5f) + (1-co)*(w*0.5f); 183554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project y =-si*(w*0.5f) + (1-co)*(h*0.5f); 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrientationTransform.set(a, b, c, d); 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrientationTransform.set(x, y); 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicPlane::orientationToTransfrom(orientation, w, h, 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &mOrientationTransform); 184154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 1842d2f34e5fd6c20854b45c76f2a514fb8864277ea2Mathias Agopian mOrientation = orientation; 184354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mGlobalTransform = mOrientationTransform * mTransform; 184454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return NO_ERROR; 184554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 184654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 184754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst DisplayHardware& GraphicPlane::displayHardware() const { 184854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return *mHw; 184954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 185054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 185154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst Transform& GraphicPlane::transform() const { 185254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mGlobalTransform; 185354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 185454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 185554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// --------------------------------------------------------------------------- 185654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 185754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}; // namespace android 1858