LayerBase.cpp revision a8026d21f3f2f09e3416cbd33c277fbd15d8cf4e
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" 34921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian#include "Layer.h" 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 360f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopian#include "DisplayDevice.h" 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1; 43f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian 443ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias AgopianLayerBase::LayerBase(SurfaceFlinger* flinger) 453ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian : contentDirty(false), 46f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 47a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFlinger(flinger), mFiltering(false), 48a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian mNeedsFiltering(false), 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 5099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mPremultipliedAlpha(true), mName("unnamed"), mDebug(false) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 59d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 693165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian if (flags & ISurfaceComposerClient::eHidden) 703165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layerFlags = layer_state_t::eLayerHidden; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 723165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian if (flags & ISurfaceComposerClient::eNonPremultiplied) 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.w = w; 7693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.h = h; 7793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.crop.makeInvalid(); 7893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.z = 0; 7993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.alpha = 0xFF; 808785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian mCurrentState.layerStack = 0; 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 90eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopianbool LayerBase::needsFiltering(const sp<const DisplayDevice>& hw) const { 91eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian return mNeedsFiltering || hw->needsFiltering(); 92eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian} 93eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian 94ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11441b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 13193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 13393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested.w = w; 13493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested.h = h; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set( 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 168f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisbool LayerBase::setCrop(const Rect& crop) { 169b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (mCurrentState.requested.crop == crop) 170f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return false; 171f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis mCurrentState.sequence++; 172b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian mCurrentState.requested.crop = crop; 173f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis requestTransaction(); 174f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return true; 175f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1778785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianbool LayerBase::setLayerStack(uint32_t layerStack) { 1788785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian if (mCurrentState.layerStack == layerStack) 1798785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return false; 1808785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian mCurrentState.sequence++; 1818785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian mCurrentState.layerStack = layerStack; 1828785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian requestTransaction(); 1838785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return true; 1848785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 1858785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 1884fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian this->visibleRegion = visibleRegion; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 1934fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian this->coveredRegion = coveredRegion; 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 196a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hallvoid LayerBase::setVisibleNonTransparentRegion(const Region& 197a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall setVisibleNonTransparentRegion) { 198a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall // always called from main thread 199a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 200a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall} 201a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20705cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian // always set active to requested, unless we're asked not to 20805cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian // this is used by Layer, which special cases resizes. 20905cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian if (flags & eDontUpdateGeometryState) { 21005cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian } else { 2117e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 212b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian editTemp.active = temp.requested; 2137e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 21405cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian 215b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (front.active != temp.active) { 2166656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2176656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2186656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2197e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 225733189d408e13b54fd70971b265244367efd0f51Mathias Agopian // we may use linear filtering, if the matrix scales us 226733189d408e13b54fd70971b265244367efd0f51Mathias Agopian const uint8_t type = temp.transform.getType(); 227733189d408e13b54fd70971b265244367efd0f51Mathias Agopian mNeedsFiltering = (!temp.transform.preserveRects() || 228733189d408e13b54fd70971b265244367efd0f51Mathias Agopian (type >= Transform::SCALE)); 229a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 230a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 232ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2364297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::computeGeometry(const sp<const DisplayDevice>& hw, LayerMesh* mesh) const 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 2394297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const Transform tr(hw->getTransform() * s.transform); 2404297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t hw_h = hw->getHeight(); 24193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Rect win(s.active.w, s.active.h); 242a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian if (!s.active.crop.isEmpty()) { 243a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian win.intersect(s.active.crop, &win); 244f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 2454fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian if (mesh) { 2464fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian tr.transform(mesh->mVertices[0], win.left, win.top); 2474fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian tr.transform(mesh->mVertices[1], win.left, win.bottom); 2484fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian tr.transform(mesh->mVertices[2], win.right, win.bottom); 2494fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian tr.transform(mesh->mVertices[3], win.right, win.top); 2504fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian for (size_t i=0 ; i<4 ; i++) { 2514fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mesh->mVertices[i][1] = hw_h - mesh->mVertices[i][1]; 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2564fec873a98f7b4380720cd1ad006f74c8cdc73daMathias AgopianRect LayerBase::computeBounds() const { 2574fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian const Layer::State& s(drawingState()); 2584fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Rect win(s.active.w, s.active.h); 259a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian if (!s.active.crop.isEmpty()) { 260a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian win.intersect(s.active.crop, &win); 2614fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 2624fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return s.transform.transform(win); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2654fec873a98f7b4380720cd1ad006f74c8cdc73daMathias AgopianRegion LayerBase::latchBuffer(bool& recomputeVisibleRegions) { 2664fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region result; 2674fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return result; 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2704fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid LayerBase::setGeometry( 2714297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const sp<const DisplayDevice>& hw, 2724fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 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 2924297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const Transform& tr = hw->getTransform(); 2934fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Rect transformedBounds(computeBounds()); 2944fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian transformedBounds = tr.transform(transformedBounds); 2954fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 2964fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // scaling is already applied in transformedBounds 2974fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian layer.setFrame(transformedBounds); 2984fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian layer.setCrop(transformedBounds.getBounds()); 2993e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian} 3003e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian 3014297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::setPerFrameData(const sp<const DisplayDevice>& hw, 302d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer) { 303c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian // we have to set the visible region on every frame because 304c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian // we currently free it during onLayerDisplayed(), which is called 305c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian // after HWComposer::commit() -- every frame. 306c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian const Transform& tr = hw->getTransform(); 307c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian layer.setVisibleRegionScreen(tr.transform(visibleRegion)); 308c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian} 309c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian 3104297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::setAcquireFence(const sp<const DisplayDevice>& hw, 311d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer) { 312c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall layer.setAcquireFenceFd(-1); 313c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall} 314c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall 315c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopianvoid LayerBase::onLayerDisplayed(const sp<const DisplayDevice>& hw, 316c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian HWComposer::HWCLayerInterface* layer) { 317c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian if (layer) { 318c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian layer->onDisplayed(); 319c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian } 320c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian} 321c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian 322a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering) 323a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 324a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFiltering = filtering; 325a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 326a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 327a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const 328a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 329a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return mFiltering; 330a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 331a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 332da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool LayerBase::isVisible() const { 333da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian const Layer::State& s(mDrawingState); 334da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian return !(s.flags & layer_state_t::eLayerHidden) && s.alpha; 335da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 336da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 3374297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::draw(const sp<const DisplayDevice>& hw, const Region& clip) const 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3391b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian onDraw(hw, clip); 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3424297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::draw(const sp<const DisplayDevice>& hw) 34374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{ 3444297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian onDraw( hw, Region(hw->bounds()) ); 34574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 34674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 3474297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip, 3481b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) const 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3504297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t fbHeight = hw->getHeight(); 351010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian glColor4f(red,green,blue,alpha); 3520a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 353c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 354a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian glDisable(GL_TEXTURE_2D); 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 35620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 3574fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian LayerMesh mesh; 3584fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian computeGeometry(hw, &mesh); 3594fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 3604fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mesh.getVertices()); 3614fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, mesh.getVertexCount()); 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3644297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const 36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 3661b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian clearWithOpenGL(hw, clip, 0,0,0,0); 36729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 36829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 3694297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid LayerBase::drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3714297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const uint32_t fbHeight = hw->getHeight(); 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 37599ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_UNLIKELY(s.alpha < 0xFF)) { 37649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian const GLfloat alpha = s.alpha * (1.0f/255.0f); 37749753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian if (mPremultipliedAlpha) { 37849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(alpha, alpha, alpha, alpha); 379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 38049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(1, 1, 1, alpha); 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 38449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 38678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(1, 1, 1, 1); 38749753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 388a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (!isOpaque()) { 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3964fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian LayerMesh mesh; 3974fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian computeGeometry(hw, &mesh); 3984fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 3994fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // TODO: we probably want to generate the texture coords with the mesh 4004fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // here we assume that we only have 4 vertices 4014fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 402b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian struct TexCoords { 403b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat u; 404b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat v; 40578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 40678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 407a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian Rect win(s.active.w, s.active.h); 40893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian if (!s.active.crop.isEmpty()) { 409a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian win.intersect(s.active.crop, &win); 410f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 411a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian 412a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian GLfloat left = GLfloat(win.left) / GLfloat(s.active.w); 413a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian GLfloat top = GLfloat(win.top) / GLfloat(s.active.h); 414a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian GLfloat right = GLfloat(win.right) / GLfloat(s.active.w); 415a046dd9772cd8da4ead9edc7a89d9992ff0d38cfMathias Agopian GLfloat bottom = GLfloat(win.bottom) / GLfloat(s.active.h); 416f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 417b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian TexCoords texCoords[4]; 418f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[0].u = left; 419f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[0].v = top; 420f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[1].u = left; 421f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[1].v = bottom; 422f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[2].u = right; 423f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[2].v = bottom; 424f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[3].u = right; 425f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[3].v = top; 426f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis for (int i = 0; i < 4; i++) { 427f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[i].v = 1.0f - texCoords[i].v; 428f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 43178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 4324fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mesh.getVertices()); 4334fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, mesh.getVertexCount()); 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 436c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_BLEND); 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4391b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 4401b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 4411b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 442c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 443c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian snprintf(buffer, SIZE, 444c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian "+ %s %p (%s)\n", 445c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian getTypeId(), this, getName().string()); 446c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian result.append(buffer); 447c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 44882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian s.transparentRegion.dump(result, "transparentRegion"); 4494fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian visibleRegion.dump(result, "visibleRegion"); 450c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 4511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 4521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 4535f20e2d4462da3471f59152b32cd8640fa4a21daMathias Agopian "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), " 454a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, " 4551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 456791da60dd322f596b29320edb97c5366070c9ddcMathias Agopian s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h, 45793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.active.crop.left, s.active.crop.top, 45893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.active.crop.right, s.active.crop.bottom, 459a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian isOpaque(), needsDithering(), contentDirty, 4601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 4611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 4621b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 4631b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 4641b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 46554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 46625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const { 46748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBase::dump(result, scratch, size); 46848b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 46948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 47025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const { 47125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 47225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 47325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::clearStats() { 47482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 47548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 476921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopiansp<LayerBaseClient> LayerBase::getLayerBaseClient() const { 477921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian return 0; 478921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian} 479921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 480921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopiansp<Layer> LayerBase::getLayer() const { 481921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian return 0; 482921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian} 483921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 486631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1; 4872e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 4883ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias AgopianLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, 48996f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<Client>& client) 4903ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian : LayerBase(flinger), 491a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface(false), 492a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientRef(client), 493948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 499b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> c(mClientRef.promote()); 50096f0819f81293076e652792794a961543e6750d7Mathias Agopian if (c != 0) { 501b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian c->detachLayer(this); 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 505a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface() 506a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 507a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian class BSurface : public BnSurface, public LayerCleaner { 508a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; } 509a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian public: 510a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian BSurface(const sp<SurfaceFlinger>& flinger, 511a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 512a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : LayerCleaner(flinger, layer) { } 513a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian }; 514a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> sur(new BSurface(mFlinger, this)); 515a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return sur; 516a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 517a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 518a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface() 519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 520a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> s; 521076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 522a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 523a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 524a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian "LayerBaseClient::getSurface() has already been called"); 525a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 526a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface = true; 527a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian s = createSurface(); 528a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientSurfaceBinder = s->asBinder(); 529076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5320d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const { 5330d1561275e80073807ac04728951782d943f8882Mathias Agopian return mClientSurfaceBinder; 5340d1561275e80073807ac04728951782d943f8882Mathias Agopian} 5350d1561275e80073807ac04728951782d943f8882Mathias Agopian 536582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const { 537582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis return 0; 538582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 539582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 5401b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 5411b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5421b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 5431b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 544b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> client(mClientRef.promote()); 5451b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 54696f0819f81293076e652792794a961543e6750d7Mathias Agopian " client=%p, identity=%u\n", 54796f0819f81293076e652792794a961543e6750d7Mathias Agopian client.get(), getIdentity()); 5481b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5491b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 5511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 55248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 55348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const 55448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 55548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBaseClient::dump(result, scratch, size); 55648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 55748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 560a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 561a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 562a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : mFlinger(flinger), mLayer(layer) { 563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 565a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() { 5669a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 567921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mFlinger->onLayerDestroyed(mLayer); 568b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 569b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 573