LayerBase.cpp revision c5c5a14c06de249d8e0445fd24699e1d9aa04549
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 23310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IPCThreadState.h> 24310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IServiceManager.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/hardware.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 32db403e8ff0d7727015e1a5009bab20eb7ec205bcMathias Agopian#include "Client.h" 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h" 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware.h" 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1; 42f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : dpy(display), contentDirty(false), 45f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 46a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFlinger(flinger), mFiltering(false), 47a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian mNeedsFiltering(false), 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation(0), 498d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis mPlaneOrientation(0), 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 5199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mPremultipliedAlpha(true), mName("unnamed"), mDebug(false) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.w = w; 7793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.h = h; 7893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.crop.makeInvalid(); 7993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.z = 0; 8093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.alpha = 0xFF; 8193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.flags = layerFlags; 8293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.sequence = 0; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(0, 0); 8493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested = mCurrentState.active; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // drawing state & current state are identical 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11041b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) { 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 12793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 12993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested.w = w; 13093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested.h = h; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set( 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 164f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisbool LayerBase::setCrop(const Rect& crop) { 165b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (mCurrentState.requested.crop == crop) 166f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return false; 167f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis mCurrentState.sequence++; 168b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian mCurrentState.requested.crop = crop; 169f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis requestTransaction(); 170f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return true; 171f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mTransformedBounds; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegionScreen = visibleRegion; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project coveredRegionScreen = coveredRegion; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19305cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian // always set active to requested, unless we're asked not to 19405cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian // this is used by Layer, which special cases resizes. 19505cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian if (flags & eDontUpdateGeometryState) { 19605cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian } else { 1977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 198b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian editTemp.active = temp.requested; 1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 20005cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian 201b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (front.active != temp.active) { 2026656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2036656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2046656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2057e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 210a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 211733189d408e13b54fd70971b265244367efd0f51Mathias Agopian // we may use linear filtering, if the matrix scales us 212733189d408e13b54fd70971b265244367efd0f51Mathias Agopian const uint8_t type = temp.transform.getType(); 213733189d408e13b54fd70971b265244367efd0f51Mathias Agopian mNeedsFiltering = (!temp.transform.preserveRects() || 214733189d408e13b54fd70971b265244367efd0f51Mathias Agopian (type >= Transform::SCALE)); 215a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 216a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 218ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::validateVisibility(const Transform& planeTransform, const DisplayHardware& hw) 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 227ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian const uint32_t hw_h = hw.getHeight(); 22893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian const Rect& crop(s.active.crop); 229ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian 23093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Rect win(s.active.w, s.active.h); 231f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!crop.isEmpty()) { 232f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis win.intersect(crop, &win); 233f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 234f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian 235f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian mNumVertices = 4; 236f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[0], win.left, win.top); 237f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[1], win.left, win.bottom); 238f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[2], win.right, win.bottom); 239f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[3], win.right, win.top); 240ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian for (size_t i=0 ; i<4 ; i++) 241ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian mVertices[i][1] = hw_h - mVertices[i][1]; 242ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian 24399ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_UNLIKELY(transformed)) { 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the transparent region 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (tr.preserveRects()) { 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transform the transparent region 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transformation too complex, can't do the transparent region 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // optimization. 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen.clear(); 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = s.transparentRegion; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cache a few things... 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation = tr.getOrientation(); 2608d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis mPlaneOrientation = planeTransform.getOrientation(); 261d992db3827016388e8069f5793b031153d423501Mathias Agopian mTransform = tr; 262f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis mTransformedBounds = tr.transform(win); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) { 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip( 26999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian const Transform& planeTransform, Region& outDirtyRegion) { 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2723e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopianvoid LayerBase::setGeometry(HWComposer::HWCLayerInterface& layer) 273a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{ 2743e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setDefaultState(); 275a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 276a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // this gives us only the "orientation" component of the transform 277a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian const State& s(drawingState()); 278a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian const uint32_t finalTransform = s.transform.getOrientation(); 279a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // we can only handle simple transformation 280a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian if (finalTransform & Transform::ROT_INVALID) { 2813e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setTransform(0); 282a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } else { 2833e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setTransform(finalTransform); 284a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } 285a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 286a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian if (!isOpaque()) { 2873e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setBlending(mPremultipliedAlpha ? 2883e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian HWC_BLENDING_PREMULT : 2893e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian HWC_BLENDING_COVERAGE); 290a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } 291a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 292a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // scaling is already applied in mTransformedBounds 2933e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setFrame(mTransformedBounds); 2943e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setVisibleRegionScreen(visibleRegionScreen); 2953e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setCrop(mTransformedBounds.getBounds()); 2963e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian} 2973e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian 2983e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopianvoid LayerBase::setPerFrameData(HWComposer::HWCLayerInterface& layer) { 2993e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setBuffer(0); 300c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian} 301c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian 302c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hallvoid LayerBase::setAcquireFence(HWComposer::HWCLayerInterface& layer) { 303c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall layer.setAcquireFenceFd(-1); 304c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall} 305c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall 306a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering) 307a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 308a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFiltering = filtering; 309a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 310a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 311a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const 312a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 313a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return mFiltering; 314a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 315a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 3161b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::draw(const DisplayHardware& hw, const Region& clip) const 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3181b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian onDraw(hw, clip); 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3211b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::drawForSreenShot(const DisplayHardware& hw) 32274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{ 323a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian setFiltering(true); 3241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian onDraw( hw, Region(hw.bounds()) ); 325a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian setFiltering(false); 32674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 32774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 3281b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::clearWithOpenGL(const DisplayHardware& hw, const Region& clip, 3291b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) const 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 332010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian glColor4f(red,green,blue,alpha); 3330a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 334c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 335a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian glDisable(GL_TEXTURE_2D); 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 33720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 33878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 339f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices); 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3421b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::clearWithOpenGL(const DisplayHardware& hw, const Region& clip) const 34329aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 3441b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian clearWithOpenGL(hw, clip, 0,0,0,0); 34529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 34629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 3471b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::drawWithOpenGL(const DisplayHardware& hw, const Region& clip) const 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 35399ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_UNLIKELY(s.alpha < 0xFF)) { 35449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian const GLfloat alpha = s.alpha * (1.0f/255.0f); 35549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian if (mPremultipliedAlpha) { 35649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(alpha, alpha, alpha, alpha); 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 35849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(1, 1, 1, alpha); 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 36249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 36478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(1, 1, 1, 1); 36549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 366a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (!isOpaque()) { 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 374b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian struct TexCoords { 375b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat u; 376b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat v; 37778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 37878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 37993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Rect crop(s.active.w, s.active.h); 38093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian if (!s.active.crop.isEmpty()) { 38193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian crop = s.active.crop; 382f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 38393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat left = GLfloat(crop.left) / GLfloat(s.active.w); 38493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat top = GLfloat(crop.top) / GLfloat(s.active.h); 38593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat right = GLfloat(crop.right) / GLfloat(s.active.w); 38693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat bottom = GLfloat(crop.bottom) / GLfloat(s.active.h); 387f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 388b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian TexCoords texCoords[4]; 389f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[0].u = left; 390f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[0].v = top; 391f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[1].u = left; 392f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[1].v = bottom; 393f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[2].u = right; 394f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[2].v = bottom; 395f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[3].u = right; 396f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[3].v = top; 397f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis for (int i = 0; i < 4; i++) { 398f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[i].v = 1.0f - texCoords[i].v; 399f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 40278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 40378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 404f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices); 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 407c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_BLEND); 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4101b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 4111b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 4121b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 413c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 414c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian snprintf(buffer, SIZE, 415c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian "+ %s %p (%s)\n", 416c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian getTypeId(), this, getName().string()); 417c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian result.append(buffer); 418c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 41982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian s.transparentRegion.dump(result, "transparentRegion"); 42082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian transparentRegionScreen.dump(result, "transparentRegionScreen"); 42182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian visibleRegionScreen.dump(result, "visibleRegionScreen"); 422c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 4231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 4241b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 42593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian "z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), " 426a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, " 4271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 42893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h, 42993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.active.crop.left, s.active.crop.top, 43093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.active.crop.right, s.active.crop.bottom, 431a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian isOpaque(), needsDithering(), contentDirty, 4321b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 4331b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 4341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 4351b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 4361b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 43754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 43825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const { 43948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBase::dump(result, scratch, size); 44048b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 44148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 44225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const { 44325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 44425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 44525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::clearStats() { 44682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 44748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 450631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1; 4512e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 45396f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<Client>& client) 454a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian : LayerBase(flinger, display), 455a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface(false), 456a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientRef(client), 457948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 459076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 463b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> c(mClientRef.promote()); 46496f0819f81293076e652792794a961543e6750d7Mathias Agopian if (c != 0) { 465b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian c->detachLayer(this); 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 469a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface() 470a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 471a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian class BSurface : public BnSurface, public LayerCleaner { 472a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; } 473a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian public: 474a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian BSurface(const sp<SurfaceFlinger>& flinger, 475a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 476a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : LayerCleaner(flinger, layer) { } 477a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian }; 478a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> sur(new BSurface(mFlinger, this)); 479a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return sur; 480a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 481a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 482a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface() 483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 484a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> s; 485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 486a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 487a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 488a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian "LayerBaseClient::getSurface() has already been called"); 489a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 490a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface = true; 491a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian s = createSurface(); 492a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientSurfaceBinder = s->asBinder(); 493076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 494076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4960d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const { 4970d1561275e80073807ac04728951782d943f8882Mathias Agopian return mClientSurfaceBinder; 4980d1561275e80073807ac04728951782d943f8882Mathias Agopian} 4990d1561275e80073807ac04728951782d943f8882Mathias Agopian 500582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const { 501582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis return 0; 502582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 503582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 5041b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 5051b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5061b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 5071b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 508b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> client(mClientRef.promote()); 5091b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 51096f0819f81293076e652792794a961543e6750d7Mathias Agopian " client=%p, identity=%u\n", 51196f0819f81293076e652792794a961543e6750d7Mathias Agopian client.get(), getIdentity()); 5121b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5131b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5141b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 5151b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 51648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 51748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const 51848b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 51948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBaseClient::dump(result, scratch, size); 52048b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 52148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 523076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 524a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 525a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 526a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : mFlinger(flinger), mLayer(layer) { 527076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 528076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 529a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() { 5309a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 531a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFlinger->destroySurface(mLayer); 532b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 533b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 537