LayerBase.cpp revision a1f47b90ab53af978be45b8bda16c5d084ae66e6
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" 35d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian#include "TextureManager.h" 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1; 43f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : dpy(display), contentDirty(false), 46f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger(flinger), 48a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian mNeedsFiltering(false), 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation(0), 50ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian mLeft(0), mTop(0), 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 52245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian mPremultipliedAlpha(true), mName("unnamed"), mDebug(false), 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mInvalidate(0) 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware()); 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = hw.getFlags(); 57b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian mBufferCrop.makeInvalid(); 58b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian mBufferTransform = 0; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 69d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 70d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 71d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 72d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const 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 ProjectGraphicPlane& LayerBase::graphicPlane(int dpy) 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.z = 0; 937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.w = w; 947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.h = h; 957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 967e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.alpha = 0xFF; 987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.flags = layerFlags; 997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.sequence = 0; 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(0, 0); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // drawing state & current state are identical 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) { 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 1437e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if (mCurrentState.requested_w == w && mCurrentState.requested_h == h) 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 1457e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 1467e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set( 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mTransformedBounds; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegionScreen = visibleRegion; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project coveredRegionScreen = coveredRegion; 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if ((front.requested_w != temp.requested_w) || 2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian (front.requested_h != temp.requested_h)) { 2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian // resize the layer, set the physical size to the requested size 2047e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 2057e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.w = temp.requested_w; 2067e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.h = temp.requested_h; 2077e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian 2096656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian if ((front.w != temp.w) || (front.h != temp.h)) { 2106656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2116656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2126656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2137e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 219733189d408e13b54fd70971b265244367efd0f51Mathias Agopian // we may use linear filtering, if the matrix scales us 220733189d408e13b54fd70971b265244367efd0f51Mathias Agopian const uint8_t type = temp.transform.getType(); 221733189d408e13b54fd70971b265244367efd0f51Mathias Agopian mNeedsFiltering = (!temp.transform.preserveRects() || 222733189d408e13b54fd70971b265244367efd0f51Mathias Agopian (type >= Transform::SCALE)); 223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 226ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 236cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t w = s.w; 237cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t h = s.h; 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[0], 0, 0); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[1], 0, h); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[2], w, h); 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[3], w, 0); 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(transformed)) { 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the transparent region 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (tr.preserveRects()) { 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transform the transparent region 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transformation too complex, can't do the transparent region 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // optimization. 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen.clear(); 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = s.transparentRegion; 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cache a few things... 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation = tr.getOrientation(); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformedBounds = tr.makeBounds(w, h); 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLeft = tr.tx(); 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTop = tr.ty(); 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip( 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform& planeTransform, Region& outDirtyRegion) 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_and(~1, &mInvalidate)&1) == 1) { 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outDirtyRegion.orSelf(visibleRegionScreen); 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate() 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_or(1, &mInvalidate)&1) == 0) { 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger->signalEvent(); 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 28520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = reg.begin(); 28620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = reg.end(); 28720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (it != end) { 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect r; 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbWidth = hw.getWidth(); 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbHeight = hw.getHeight(); 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 }, 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { fbWidth, fbHeight }, { 0, fbHeight } }; 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 29520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (it != end) { 29620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& r = *it++; 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLint sy = fbHeight - (r.top + r.height()); 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 304a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopianvoid LayerBase::setGeometry(hwc_layer_t* hwcl) { 305a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian hwcl->flags |= HWC_SKIP_LAYER; 306a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 307a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 308a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopianvoid LayerBase::setPerFrameData(hwc_layer_t* hwcl) { 309a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian hwcl->compositionType = HWC_FRAMEBUFFER; 310a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian hwcl->handle = NULL; 311a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 312a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 313bc7e31a84b936a5a9ac295db56f0836c50c1ac7fMathias Agopianvoid LayerBase::draw(const Region& clip) const 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // reset GL state 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_SCISSOR_TEST); 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project onDraw(clip); 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid LayerBase::drawForSreenShot() const 32274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{ 32374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian const DisplayHardware& hw(graphicPlane(0).displayHardware()); 32474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian onDraw( Region(hw.bounds()) ); 32574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 32674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 327010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red, 328010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf green, GLclampf blue, 329010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf alpha) const 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 333010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian glColor4f(red,green,blue,alpha); 3340a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 3350a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian TextureManager::deactivateTextures(); 3360a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 33920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 34020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = clip.begin(); 34120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = clip.end(); 34295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glEnable(GL_SCISSOR_TEST); 34378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 34495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 34595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 34695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 34795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 34895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35229aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 35329aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 35429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 35529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 35629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 357b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopiantemplate <typename T> 358b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopianstatic inline 359b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopianvoid swap(T& a, T& b) { 360b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian T t(a); 361b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian a = b; 362b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian b = t; 363b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian} 364b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 3651fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const 366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 3700926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // bind our texture 3720a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian TextureManager::activateTexture(texture, needsFiltering()); 3731fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t width = texture.width; 3741fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t height = texture.height; 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (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); 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsBlending()) { 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 /* 399b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian * compute texture coordinates 400b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian * here, we handle NPOT, cropping and buffer transformations 401b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian */ 402b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 403b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat cl, ct, cr, cb; 404b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian if (!mBufferCrop.isEmpty()) { 405b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian // source is cropped 406b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian const GLfloat us = (texture.NPOTAdjust ? texture.wScale : 1.0f) / width; 407b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian const GLfloat vs = (texture.NPOTAdjust ? texture.hScale : 1.0f) / height; 408b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian cl = mBufferCrop.left * us; 409b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian ct = mBufferCrop.top * vs; 410b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian cr = mBufferCrop.right * us; 411b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian cb = mBufferCrop.bottom * vs; 412b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian } else { 413b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian cl = 0; 414b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian ct = 0; 415b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian cr = (texture.NPOTAdjust ? texture.wScale : 1.0f); 416b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian cb = (texture.NPOTAdjust ? texture.hScale : 1.0f); 417b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian } 418b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 419883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian /* 420883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * For the buffer transformation, we apply the rotation last. 421883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * Since we're transforming the texture-coordinates, we need 422883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * to apply the inverse of the buffer transformation: 423883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * inverse( FLIP_V -> FLIP_H -> ROT_90 ) 424883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * <=> inverse( ROT_90 * FLIP_H * FLIP_V ) 425883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * = inverse(FLIP_V) * inverse(FLIP_H) * inverse(ROT_90) 426883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * = FLIP_V * FLIP_H * ROT_270 427883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * <=> ROT_270 -> FLIP_H -> FLIP_V 428883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * 429883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * The rotation is performed first, in the texture coordinate space. 430883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian * 431883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian */ 432883dffaa0095ac9ac2be70915f620af9f429dc4bMathias Agopian 433b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian struct TexCoords { 434b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat u; 435b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian GLfloat v; 43678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 43778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 438b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian enum { 439b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian // name of the corners in the texture map 440b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian LB = 0, // left-bottom 441b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian LT = 1, // left-top 442b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian RT = 2, // right-top 443b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian RB = 3 // right-bottom 444b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian }; 445b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 446b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian // vertices in screen space 447b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian int vLT = LB; 448b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian int vLB = LT; 449b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian int vRB = RT; 450b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian int vRT = RB; 45178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 45278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian // the texture's source is rotated 453b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian uint32_t transform = mBufferTransform; 454b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian if (transform & HAL_TRANSFORM_ROT_90) { 455b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian vLT = RB; 456b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian vLB = LB; 457b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian vRB = LT; 458b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian vRT = RT; 45978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian } 460b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian if (transform & HAL_TRANSFORM_FLIP_V) { 461b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian swap(vLT, vLB); 4623c2c54c270d8ecefccc9a57b0f5b1d691588a258Mathias Agopian swap(vRT, vRB); 46378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian } 464b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian if (transform & HAL_TRANSFORM_FLIP_H) { 4653c2c54c270d8ecefccc9a57b0f5b1d691588a258Mathias Agopian swap(vLT, vRT); 4663c2c54c270d8ecefccc9a57b0f5b1d691588a258Mathias Agopian swap(vLB, vRB); 467b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian } 468b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 469b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian TexCoords texCoords[4]; 470b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vLT].u = cl; 471b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vLT].v = ct; 472b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vLB].u = cl; 473b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vLB].v = cb; 474b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vRB].u = cr; 475b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vRB].v = cb; 476b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vRT].u = cr; 477b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian texCoords[vRT].v = ct; 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4790a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian if (needsDithering()) { 4800a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian glEnable(GL_DITHER); 4810a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian } else { 4820a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian glDisable(GL_DITHER); 4830a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian } 4840a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian 48578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 48678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 48778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 489b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian Region::const_iterator it = clip.begin(); 490b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian Region::const_iterator const end = clip.end(); 49178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian while (it != end) { 49278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const Rect& r = *it++; 49378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 49478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glScissor(r.left, sy, r.width(), r.height()); 49578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 49778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 500b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopianvoid LayerBase::setBufferCrop(const Rect& crop) { 50168f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis if (mBufferCrop != crop) { 50268f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis mBufferCrop = crop; 50368f9127e88ca6fd849d0f28bcd8776e04aab22e6Jamie Gennis mFlinger->invalidateHwcGeometry(); 504b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian } 505b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian} 506b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 507b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopianvoid LayerBase::setBufferTransform(uint32_t transform) { 508ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian if (mBufferTransform != transform) { 509ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian mBufferTransform = transform; 510ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian mFlinger->invalidateHwcGeometry(); 511ad456f9878ff7c176499e7b992f9ff1cb3e9cdeeMathias Agopian } 512b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian} 513b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 5141b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 5151b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5161b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 5171b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 5181b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "+ %s %p\n" 5191b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 5201b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), " 5211b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, " 5221b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 5231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getTypeId(), this, s.z, tx(), ty(), s.w, s.h, 5241b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian needsBlending(), needsDithering(), contentDirty, 5251b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 5261b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 5271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 5281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 53054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 53148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const 53248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 53348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBase::dump(result, scratch, size); 53448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 53548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 53648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 539631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1; 5402e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 54296f0819f81293076e652792794a961543e6750d7Mathias Agopian const sp<Client>& client) 543a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian : LayerBase(flinger, display), 544a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface(false), 545a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientRef(client), 546948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 552b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> c(mClientRef.promote()); 55396f0819f81293076e652792794a961543e6750d7Mathias Agopian if (c != 0) { 554b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian c->detachLayer(this); 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface() 559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<Surface> s; 561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 562a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 563a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 564a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian "LayerBaseClient::getSurface() has already been called"); 565a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian 566a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mHasSurface = true; 567a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian s = createSurface(); 568a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mClientSurfaceBinder = s->asBinder(); 569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5720d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const { 5730d1561275e80073807ac04728951782d943f8882Mathias Agopian return mClientSurfaceBinder; 5740d1561275e80073807ac04728951782d943f8882Mathias Agopian} 5750d1561275e80073807ac04728951782d943f8882Mathias Agopian 576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const 577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 57896f0819f81293076e652792794a961543e6750d7Mathias Agopian return new Surface(mFlinger, mIdentity, 579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const_cast<LayerBaseClient *>(this)); 580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 5831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 5851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 586b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian sp<Client> client(mClientRef.promote()); 5871b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 5881b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " name=%s\n" 58996f0819f81293076e652792794a961543e6750d7Mathias Agopian " client=%p, identity=%u\n", 5901b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getName().string(), 59196f0819f81293076e652792794a961543e6750d7Mathias Agopian client.get(), getIdentity()); 5921b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5931b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5941b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 5951b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 59648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 59748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const 59848b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{ 59948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian LayerBaseClient::dump(result, scratch, size); 60048b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian} 60148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian 602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 6049a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface( 6059a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian const sp<SurfaceFlinger>& flinger, 60696f0819f81293076e652792794a961543e6750d7Mathias Agopian int identity, 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const sp<LayerBaseClient>& owner) 60896f0819f81293076e652792794a961543e6750d7Mathias Agopian : mFlinger(flinger), mIdentity(identity), mOwner(owner) 6099a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 6129a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface() 6139a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 6149a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian /* 6159a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * This is a good place to clean-up all client resources 6169a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian */ 6179a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 6189a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 6199a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian sp<LayerBaseClient> layer = getOwner(); 6209a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian if (layer != 0) { 6219a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian mFlinger->destroySurface(layer); 6229a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian } 623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const { 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<LayerBaseClient> owner(mOwner.promote()); 627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return owner; 628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact( 631375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return BnSurface::onTransact(code, data, reply, flags); 634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 636a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int bufferIdx, 637a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian uint32_t w, uint32_t h, uint32_t format, uint32_t usage) 638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 642b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopianstatus_t LayerBaseClient::Surface::setBufferCount(int bufferCount) 643b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{ 644b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian return INVALID_OPERATION; 645b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 646b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 650