LayerBase.cpp revision b30c415539813b96a831b75d07f3d12aef1aeab7
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" 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h" 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1; 41f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : dpy(display), contentDirty(false), 44f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 45a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFlinger(flinger), mFiltering(false), 46a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian mNeedsFiltering(false), 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation(0), 488d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis mPlaneOrientation(0), 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 const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware()); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = hw.getFlags(); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy) 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 8793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.w = w; 8893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.h = h; 8993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.active.crop.makeInvalid(); 9093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.z = 0; 9193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.alpha = 0xFF; 9293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.flags = layerFlags; 9393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.sequence = 0; 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(0, 0); 9593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested = mCurrentState.active; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // drawing state & current state are identical 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12141b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) { 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 13893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 14093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested.w = w; 14193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian mCurrentState.requested.h = h; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set( 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 175f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisbool LayerBase::setCrop(const Rect& crop) { 176b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (mCurrentState.requested.crop == crop) 177f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return false; 178f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis mCurrentState.sequence++; 179b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian mCurrentState.requested.crop = crop; 180f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis requestTransaction(); 181f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return true; 182f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mTransformedBounds; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegionScreen = visibleRegion; 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project coveredRegionScreen = coveredRegion; 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (front.requested != temp.requested) { 205b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian // geometry of the layer has changed, set the active geometry 206b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian // to the requested geometry. 2077e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 208b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian editTemp.active = temp.requested; 2097e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 210b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian if (front.active != temp.active) { 2116656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2126656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2136656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2147e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 220733189d408e13b54fd70971b265244367efd0f51Mathias Agopian // we may use linear filtering, if the matrix scales us 221733189d408e13b54fd70971b265244367efd0f51Mathias Agopian const uint8_t type = temp.transform.getType(); 222733189d408e13b54fd70971b265244367efd0f51Mathias Agopian mNeedsFiltering = (!temp.transform.preserveRects() || 223733189d408e13b54fd70971b265244367efd0f51Mathias Agopian (type >= Transform::SCALE)); 224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 227ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 236ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian const DisplayHardware& hw(graphicPlane(0).displayHardware()); 237ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian const uint32_t hw_h = hw.getHeight(); 23893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian const Rect& crop(s.active.crop); 239ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian 24093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Rect win(s.active.w, s.active.h); 241f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!crop.isEmpty()) { 242f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis win.intersect(crop, &win); 243f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 244f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian 245f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian mNumVertices = 4; 246f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[0], win.left, win.top); 247f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[1], win.left, win.bottom); 248f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[2], win.right, win.bottom); 249f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis tr.transform(mVertices[3], win.right, win.top); 250ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian for (size_t i=0 ; i<4 ; i++) 251ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian mVertices[i][1] = hw_h - mVertices[i][1]; 252ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian 25399ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_UNLIKELY(transformed)) { 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the transparent region 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (tr.preserveRects()) { 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transform the transparent region 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transformation too complex, can't do the transparent region 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // optimization. 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen.clear(); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = s.transparentRegion; 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cache a few things... 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation = tr.getOrientation(); 2708d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis mPlaneOrientation = planeTransform.getOrientation(); 271d992db3827016388e8069f5793b031153d423501Mathias Agopian mTransform = tr; 272f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis mTransformedBounds = tr.transform(win); 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) { 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip( 27999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian const Transform& planeTransform, Region& outDirtyRegion) { 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 282a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopianvoid LayerBase::setGeometry(hwc_layer_t* hwcl) 283a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{ 284a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->compositionType = HWC_FRAMEBUFFER; 285a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->hints = 0; 286a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->flags = HWC_SKIP_LAYER; 287a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->transform = 0; 288a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->blending = HWC_BLENDING_NONE; 289a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 290a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // this gives us only the "orientation" component of the transform 291a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian const State& s(drawingState()); 292a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian const uint32_t finalTransform = s.transform.getOrientation(); 293a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // we can only handle simple transformation 294a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian if (finalTransform & Transform::ROT_INVALID) { 295a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->flags = HWC_SKIP_LAYER; 296a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } else { 297a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->transform = finalTransform; 298a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } 299a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 300a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian if (!isOpaque()) { 301a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->blending = mPremultipliedAlpha ? 302a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE; 303a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } 304a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 305a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // scaling is already applied in mTransformedBounds 306a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.left = mTransformedBounds.left; 307a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.top = mTransformedBounds.top; 308a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.right = mTransformedBounds.right; 309a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.bottom = mTransformedBounds.bottom; 310a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->visibleRegionScreen.rects = 311a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian reinterpret_cast<hwc_rect_t const *>( 312a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian visibleRegionScreen.getArray( 313a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian &hwcl->visibleRegionScreen.numRects)); 314a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 315a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.left = 0; 316a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.top = 0; 317a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.right = mTransformedBounds.width(); 318a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.bottom = mTransformedBounds.height(); 319a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 320a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 321c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianvoid LayerBase::setPerFrameData(hwc_layer_t* hwcl) { 322c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian hwcl->compositionType = HWC_FRAMEBUFFER; 323c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian hwcl->handle = NULL; 324c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian} 325c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian 326a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering) 327a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 328a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFiltering = filtering; 329a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 330a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 331a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const 332a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 333a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return mFiltering; 334a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 335a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 336bc7e31a84b936a5a9ac295db56f0836c50c1ac7fMathias Agopianvoid LayerBase::draw(const Region& clip) const 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project onDraw(clip); 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 341a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawForSreenShot() 34274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{ 34374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian const DisplayHardware& hw(graphicPlane(0).displayHardware()); 344a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian setFiltering(true); 34574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian onDraw( Region(hw.bounds()) ); 346a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian setFiltering(false); 34774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 34874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 349010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red, 350010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf green, GLclampf blue, 351010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf alpha) const 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 355010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian glColor4f(red,green,blue,alpha); 3560a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 357c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 358a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian glDisable(GL_TEXTURE_2D); 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 36020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 36178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 362f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices); 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 36629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 36729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 36829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 36929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 370a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip) const 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 37799ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten if (CC_UNLIKELY(s.alpha < 0xFF)) { 37849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian const GLfloat alpha = s.alpha * (1.0f/255.0f); 37949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian if (mPremultipliedAlpha) { 38049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(alpha, alpha, alpha, alpha); 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 38249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(1, 1, 1, alpha); 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 38649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 38878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(1, 1, 1, 1); 38949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 390a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (!isOpaque()) { 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 398b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian struct TexCoords { 399b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat u; 400b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat v; 40178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 40278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 40393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Rect crop(s.active.w, s.active.h); 40493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian if (!s.active.crop.isEmpty()) { 40593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian crop = s.active.crop; 406f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 40793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat left = GLfloat(crop.left) / GLfloat(s.active.w); 40893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat top = GLfloat(crop.top) / GLfloat(s.active.h); 40993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat right = GLfloat(crop.right) / GLfloat(s.active.w); 41093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian GLfloat bottom = GLfloat(crop.bottom) / GLfloat(s.active.h); 411f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 412b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian TexCoords texCoords[4]; 413f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[0].u = left; 414f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[0].v = top; 415f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[1].u = left; 416f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[1].v = bottom; 417f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[2].u = right; 418f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[2].v = bottom; 419f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[3].u = right; 420f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[3].v = top; 421f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis for (int i = 0; i < 4; i++) { 422f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis texCoords[i].v = 1.0f - texCoords[i].v; 423f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 42678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 42778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 428f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices); 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 431c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_BLEND); 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 4351b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 4361b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 437c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 438c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian snprintf(buffer, SIZE, 439c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian "+ %s %p (%s)\n", 440c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian getTypeId(), this, getName().string()); 441c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian result.append(buffer); 442c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 44382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian s.transparentRegion.dump(result, "transparentRegion"); 44482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian transparentRegionScreen.dump(result, "transparentRegionScreen"); 44582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian visibleRegionScreen.dump(result, "visibleRegionScreen"); 446c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian 4471b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 4481b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 44993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian "z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), " 450a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, " 4511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 45293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h, 45393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.active.crop.left, s.active.crop.top, 45493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian s.active.crop.right, s.active.crop.bottom, 455a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian isOpaque(), needsDithering(), contentDirty, 4561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 4571b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 4581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 4591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 4601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 46154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 46225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const { 46348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBase::dump(result, scratch, size); 46448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 46548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 46625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const { 46725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 46825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 46925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::clearStats() { 47082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 47148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 474631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1; 4752e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 47796f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<Client>& client) 478a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian : LayerBase(flinger, display), 479a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface(false), 480a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientRef(client), 481948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 487b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> c(mClientRef.promote()); 48896f0819f81293076e652792794a961543e6750d7Mathias Agopian if (c != 0) { 489b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian c->detachLayer(this); 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 493a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface() 494a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 495a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian class BSurface : public BnSurface, public LayerCleaner { 496a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; } 497a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian public: 498a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian BSurface(const sp<SurfaceFlinger>& flinger, 499a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 500a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : LayerCleaner(flinger, layer) { } 501a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian }; 502a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> sur(new BSurface(mFlinger, this)); 503a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return sur; 504a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 505a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 506a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface() 507076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 508a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> s; 509076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 510a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 511a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 512a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian "LayerBaseClient::getSurface() has already been called"); 513a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 514a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface = true; 515a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian s = createSurface(); 516a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientSurfaceBinder = s->asBinder(); 517076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 518076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5200d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const { 5210d1561275e80073807ac04728951782d943f8882Mathias Agopian return mClientSurfaceBinder; 5220d1561275e80073807ac04728951782d943f8882Mathias Agopian} 5230d1561275e80073807ac04728951782d943f8882Mathias Agopian 524582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const { 525582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis return 0; 526582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 527582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 5281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 5291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5301b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 5311b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 532b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> client(mClientRef.promote()); 5331b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 53496f0819f81293076e652792794a961543e6750d7Mathias Agopian " client=%p, identity=%u\n", 53596f0819f81293076e652792794a961543e6750d7Mathias Agopian client.get(), getIdentity()); 5361b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5371b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5381b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 5391b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 54048b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 54148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const 54248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 54348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBaseClient::dump(result, scratch, size); 54448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 54548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 546076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 547076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 548a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 549a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 550a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : mFlinger(flinger), mLayer(layer) { 551076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 553a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() { 5549a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 555a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFlinger->destroySurface(mLayer); 556b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 557b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 561