LayerBase.cpp revision c492e67810814bf86301abffe1d31598b775cf45
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), 46f9abeb956fb95682d77005ea0dc506a805f52a04Mathias Agopian mNeedsFiltering(false), mInOverlay(false), 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation(0), 488d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis mPlaneOrientation(0), 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 50245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian mPremultipliedAlpha(true), mName("unnamed"), mDebug(false), 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mInvalidate(0) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware()); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = hw.getFlags(); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 887e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.z = 0; 897e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.w = w; 907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.h = h; 917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.alpha = 0xFF; 947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.flags = layerFlags; 957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.sequence = 0; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(0, 0); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // drawing state & current state are identical 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12241b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 1397e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if (mCurrentState.requested_w == w && mCurrentState.requested_h == h) 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 1427e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set( 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mTransformedBounds; 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegionScreen = visibleRegion; 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project coveredRegionScreen = coveredRegion; 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if ((front.requested_w != temp.requested_w) || 1987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian (front.requested_h != temp.requested_h)) { 1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian // resize the layer, set the physical size to the requested size 2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.w = temp.requested_w; 2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.h = temp.requested_h; 2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 2046656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian 2056656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian if ((front.w != temp.w) || (front.h != temp.h)) { 2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2097e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 214a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 215733189d408e13b54fd70971b265244367efd0f51Mathias Agopian // we may use linear filtering, if the matrix scales us 216733189d408e13b54fd70971b265244367efd0f51Mathias Agopian const uint8_t type = temp.transform.getType(); 217733189d408e13b54fd70971b265244367efd0f51Mathias Agopian mNeedsFiltering = (!temp.transform.preserveRects() || 218733189d408e13b54fd70971b265244367efd0f51Mathias Agopian (type >= Transform::SCALE)); 219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 222ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 231ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian const DisplayHardware& hw(graphicPlane(0).displayHardware()); 232ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian const uint32_t hw_h = hw.getHeight(); 233ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian 234cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t w = s.w; 235cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t h = s.h; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[0], 0, 0); 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[1], 0, h); 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[2], w, h); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[3], w, 0); 240ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian for (size_t i=0 ; i<4 ; i++) 241ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian mVertices[i][1] = hw_h - mVertices[i][1]; 242ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(transformed)) { 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the transparent region 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (tr.preserveRects()) { 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transform the transparent region 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transformation too complex, can't do the transparent region 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // optimization. 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen.clear(); 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = s.transparentRegion; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cache a few things... 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation = tr.getOrientation(); 2608d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis mPlaneOrientation = planeTransform.getOrientation(); 261d992db3827016388e8069f5793b031153d423501Mathias Agopian mTransform = tr; 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformedBounds = tr.makeBounds(w, h); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip( 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform& planeTransform, Region& outDirtyRegion) 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_and(~1, &mInvalidate)&1) == 1) { 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outDirtyRegion.orSelf(visibleRegionScreen); 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate() 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_or(1, &mInvalidate)&1) == 0) { 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger->signalEvent(); 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 28620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = reg.begin(); 28720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = reg.end(); 28820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (it != end) { 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect r; 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbWidth = hw.getWidth(); 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbHeight = hw.getHeight(); 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 }, 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { fbWidth, fbHeight }, { 0, fbHeight } }; 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 29620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (it != end) { 29720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& r = *it++; 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLint sy = fbHeight - (r.top + r.height()); 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 305a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopianvoid LayerBase::setGeometry(hwc_layer_t* hwcl) 306a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{ 307a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->compositionType = HWC_FRAMEBUFFER; 308a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->hints = 0; 309a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->flags = HWC_SKIP_LAYER; 310a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->transform = 0; 311a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->blending = HWC_BLENDING_NONE; 312a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 313a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // this gives us only the "orientation" component of the transform 314a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian const State& s(drawingState()); 315a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian const uint32_t finalTransform = s.transform.getOrientation(); 316a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // we can only handle simple transformation 317a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian if (finalTransform & Transform::ROT_INVALID) { 318a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->flags = HWC_SKIP_LAYER; 319a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } else { 320a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->transform = finalTransform; 321a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } 322a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 323a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian if (!isOpaque()) { 324a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->blending = mPremultipliedAlpha ? 325a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE; 326a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } 327a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 328a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian // scaling is already applied in mTransformedBounds 329a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.left = mTransformedBounds.left; 330a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.top = mTransformedBounds.top; 331a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.right = mTransformedBounds.right; 332a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->displayFrame.bottom = mTransformedBounds.bottom; 333a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->visibleRegionScreen.rects = 334a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian reinterpret_cast<hwc_rect_t const *>( 335a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian visibleRegionScreen.getArray( 336a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian &hwcl->visibleRegionScreen.numRects)); 337a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 338a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.left = 0; 339a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.top = 0; 340a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.right = mTransformedBounds.width(); 341a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian hwcl->sourceCrop.bottom = mTransformedBounds.height(); 342a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 343a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 344c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianvoid LayerBase::setPerFrameData(hwc_layer_t* hwcl) { 345c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian hwcl->compositionType = HWC_FRAMEBUFFER; 346c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian hwcl->handle = NULL; 347c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian} 348c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian 349f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopianvoid LayerBase::setOverlay(bool inOverlay) { 350f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian mInOverlay = inOverlay; 351f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian} 352f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian 353f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopianbool LayerBase::isOverlay() const { 354f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian return mInOverlay; 355f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian} 356f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian 357a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering) 358a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 359a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFiltering = filtering; 360a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 361a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 362a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const 363a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 364a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return mFiltering; 365a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 366a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 367bc7e31a84b936a5a9ac295db56f0836c50c1ac7fMathias Agopianvoid LayerBase::draw(const Region& clip) const 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // reset GL state 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_SCISSOR_TEST); 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project onDraw(clip); 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 375a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawForSreenShot() 37674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{ 37774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian const DisplayHardware& hw(graphicPlane(0).displayHardware()); 378a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian setFiltering(true); 37974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian onDraw( Region(hw.bounds()) ); 380a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian setFiltering(false); 38174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 38274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 383010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red, 384010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf green, GLclampf blue, 385010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf alpha) const 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 389010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian glColor4f(red,green,blue,alpha); 3900a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 391c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_TEXTURE_EXTERNAL_OES); 392a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian glDisable(GL_TEXTURE_2D); 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 39420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 39520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = clip.begin(); 39620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = clip.end(); 39795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glEnable(GL_SCISSOR_TEST); 39878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 39995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 40095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 40195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 40295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 40395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 40829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 40929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 41029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 41129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 412a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip) const 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(s.alpha < 0xFF)) { 42049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian const GLfloat alpha = s.alpha * (1.0f/255.0f); 42149753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian if (mPremultipliedAlpha) { 42249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(alpha, alpha, alpha, alpha); 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 42449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(1, 1, 1, alpha); 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 42849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(1, 1, 1, 1); 43149753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 432a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (!isOpaque()) { 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 440b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian struct TexCoords { 441b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat u; 442b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat v; 44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 445b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian TexCoords texCoords[4]; 446a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[0].u = 0; 447a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[0].v = 1; 448a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[1].u = 0; 449a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[1].v = 0; 450a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[2].u = 1; 451a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[2].v = 0; 452a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[3].u = 1; 453a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian texCoords[3].v = 1; 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 45678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 45778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 459b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian Region::const_iterator it = clip.begin(); 460b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian Region::const_iterator const end = clip.end(); 46178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian while (it != end) { 46278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const Rect& r = *it++; 46378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 46478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glScissor(r.left, sy, r.width(), r.height()); 46578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 46778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 468c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian glDisable(GL_BLEND); 469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 4721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 4731b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 4741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 47522da60c3e64cd57535cbba063c07127814a2b52fMathias Agopian "+ %s %p (%s)\n" 4761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 47741b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian "z=%9d, pos=(%g,%g), size=(%4d,%4d), " 478a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, " 4791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 48022da60c3e64cd57535cbba063c07127814a2b52fMathias Agopian getTypeId(), this, getName().string(), 48122da60c3e64cd57535cbba063c07127814a2b52fMathias Agopian s.z, s.transform.tx(), s.transform.ty(), s.w, s.h, 482a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian isOpaque(), needsDithering(), contentDirty, 4831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 4841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 4851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 4861b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 4871b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 48854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 48948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const 49048b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 49148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBase::dump(result, scratch, size); 49248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 49348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 49448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 497631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1; 4982e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 50096f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<Client>& client) 501a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian : LayerBase(flinger, display), 502a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface(false), 503a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientRef(client), 504948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 506076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 510b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> c(mClientRef.promote()); 51196f0819f81293076e652792794a961543e6750d7Mathias Agopian if (c != 0) { 512b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian c->detachLayer(this); 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 516a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface() 517a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{ 518a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian class BSurface : public BnSurface, public LayerCleaner { 519a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; } 520a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian public: 521a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian BSurface(const sp<SurfaceFlinger>& flinger, 522a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 523a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : LayerCleaner(flinger, layer) { } 524a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian }; 525a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> sur(new BSurface(mFlinger, this)); 526a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return sur; 527a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 528a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 529a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface() 530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 531a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> s; 532076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 533a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 534a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 535a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian "LayerBaseClient::getSurface() has already been called"); 536a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 537a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface = true; 538a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian s = createSurface(); 539a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientSurfaceBinder = s->asBinder(); 540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5430d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const { 5440d1561275e80073807ac04728951782d943f8882Mathias Agopian return mClientSurfaceBinder; 5450d1561275e80073807ac04728951782d943f8882Mathias Agopian} 5460d1561275e80073807ac04728951782d943f8882Mathias Agopian 547582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const { 548582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis return 0; 549582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 550582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 5511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 5521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 5541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 555b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> client(mClientRef.promote()); 5561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 55796f0819f81293076e652792794a961543e6750d7Mathias Agopian " client=%p, identity=%u\n", 55896f0819f81293076e652792794a961543e6750d7Mathias Agopian client.get(), getIdentity()); 5591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 5621b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 56348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 56448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const 56548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 56648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBaseClient::dump(result, scratch, size); 56748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 56848b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 571a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 572a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer) 573a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian : mFlinger(flinger), mLayer(layer) { 574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 576a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() { 5779a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 578a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFlinger->destroySurface(mLayer); 579b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 580b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 584