LayerBase.cpp revision 49753266d2219d2fbf5c33dc4626f299dffcdd76
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 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : dpy(display), contentDirty(false), 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger(flinger), 45a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian mNeedsFiltering(false), 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation(0), 47ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian mLeft(0), mTop(0), 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 49245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian mPremultipliedAlpha(true), mName("unnamed"), mDebug(false), 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mInvalidate(0) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware()); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = hw.getFlags(); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy) 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 877e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.z = 0; 887e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.w = w; 897e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.h = h; 907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.alpha = 0xFF; 937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.flags = layerFlags; 947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.sequence = 0; 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(0, 0); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // drawing state & current state are identical 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) { 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 1387e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if (mCurrentState.requested_w == w && mCurrentState.requested_h == h) 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 1407e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check the matrix has changed 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 // TODO: check the region has changed 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mTransformedBounds; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegionScreen = visibleRegion; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project coveredRegionScreen = coveredRegion; 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if ((front.requested_w != temp.requested_w) || 1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian (front.requested_h != temp.requested_h)) { 2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian // resize the layer, set the physical size to the requested size 2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.w = temp.requested_w; 2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.h = temp.requested_h; 2047e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 2056656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian 2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian if ((front.w != temp.w) || (front.h != temp.h)) { 2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2096656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2107e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 215a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 216a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian mNeedsFiltering = false; 217a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (!(mFlags & DisplayHardware::SLOW_CONFIG)) { 218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian // we may use linear filtering, if the matrix scales us 219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian const uint8_t type = temp.transform.getType(); 220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) { 221a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian mNeedsFiltering = true; 222a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 227ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 237cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t w = s.w; 238cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t h = s.h; 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[0], 0, 0); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[1], 0, h); 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[2], w, h); 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[3], w, 0); 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(); 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformedBounds = tr.makeBounds(w, h); 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLeft = tr.tx(); 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTop = tr.ty(); 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::finishPageFlip() 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate() 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_or(1, &mInvalidate)&1) == 0) { 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger->signalEvent(); 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 29020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = reg.begin(); 29120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = reg.end(); 29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (it != end) { 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect r; 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbWidth = hw.getWidth(); 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbHeight = hw.getHeight(); 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 }, 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { fbWidth, fbHeight }, { 0, fbHeight } }; 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 30020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (it != end) { 30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& r = *it++; 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLint sy = fbHeight - (r.top + r.height()); 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate the region we'll update 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region clip(inClip); // copy-on-write, so no-op most of the time 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Remove the transparent area from the clipping region 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s = drawingState(); 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (LIKELY(!s.transparentRegion.isEmpty())) { 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clip.subtract(transparentRegionScreen); 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (clip.isEmpty()) { 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // usually this won't happen because this should be taken care of 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // by SurfaceFlinger::computeVisibleRegions() 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // reset GL state 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_SCISSOR_TEST); 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project onDraw(clip); 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_TEXTURE_2D); 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glColor4x(0, 0x8000, 0, 0x10000); 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawRegion(transparentRegionScreen); 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 341010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red, 342010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf green, GLclampf blue, 343010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian GLclampf alpha) const 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 347010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian glColor4f(red,green,blue,alpha); 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_TEXTURE_2D); 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 35120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 35220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = clip.begin(); 35320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = clip.end(); 35495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glEnable(GL_SCISSOR_TEST); 35578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 35695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 35795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 35895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 35995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 36095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 36629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 36729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 36829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 3691fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 3740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // bind our texture 3761fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian validateTexture(texture.name); 3771fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t width = texture.width; 3781fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t height = texture.height; 3791fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_TEXTURE_2D); 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(s.alpha < 0xFF)) { 38449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian const GLfloat alpha = s.alpha * (1.0f/255.0f); 38549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian if (mPremultipliedAlpha) { 38649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(alpha, alpha, alpha, alpha); 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 38849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glColor4f(1, 1, 1, alpha); 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 39249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 39478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(1, 1, 1, 1); 39549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsBlending()) { 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian Region::const_iterator it = clip.begin(); 40595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian Region::const_iterator const end = clip.end(); 40678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLfloat texCoords[4][2] = { 40778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 0, 0 }, 40878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 0, 1 }, 40978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 1, 1 }, 41078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 1, 0 } 41178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 41278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 41378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glMatrixMode(GL_TEXTURE); 41478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glLoadIdentity(); 41578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 41678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian // the texture's source is rotated 41778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian switch (texture.transform) { 41878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian case HAL_TRANSFORM_ROT_90: 41978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTranslatef(0, 1, 0); 42078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glRotatef(-90, 0, 0, 1); 42178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian break; 42278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian case HAL_TRANSFORM_ROT_180: 42378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTranslatef(1, 1, 0); 42478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glRotatef(-180, 0, 0, 1); 42578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian break; 42678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian case HAL_TRANSFORM_ROT_270: 42778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTranslatef(1, 0, 0); 42878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glRotatef(-270, 0, 0, 1); 42978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian break; 43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian } 4315994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang 43278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian if (texture.NPOTAdjust) { 43378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glScalef(texture.wScale, texture.hScale, 1.0f); 43478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian } 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 43778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 43878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian while (it != end) { 44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const Rect& r = *it++; 44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glScissor(r.left, sy, r.width(), r.height()); 44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 44678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: reload the texture if needed 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this is currently done in loadTexture() below 454a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian if (needsFiltering()) { 455a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 456a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 457a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } else { 458a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 459a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 460a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 461401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian 462401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian if (needsDithering()) { 463401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian glEnable(GL_DITHER); 464401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian } else { 465401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian glDisable(GL_DITHER); 466401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian } 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 4701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 4711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 4721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 4731b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "+ %s %p\n" 4741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 4751b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), " 4761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, " 4771b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 4781b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getTypeId(), this, s.z, tx(), ty(), s.w, s.h, 4791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian needsBlending(), needsDithering(), contentDirty, 4801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 4811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 4821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 4831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 4841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 48554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 488631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1; 4892e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 491f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian const sp<Client>& client, int32_t i) 492d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian : LayerBase(flinger, display), client(client), mIndex(i), 493948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 497076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::onFirstRef() 498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 499f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 500f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 501076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian client->bindLayer(this, mIndex); 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 507f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 508f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project client->free(mIndex); 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5131b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianssize_t LayerBaseClient::serverIndex() const 514f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian{ 515f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 516f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (client->cid<<16)|mIndex; 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5191b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian return ssize_t(0xFFFF0000 | mIndex); 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface() 523076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 524076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<Surface> s; 525076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 526076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian s = mClientSurface.promote(); 527076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (s == 0) { 528076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian s = createSurface(); 529076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mClientSurface = s; 530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 532076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 533076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 534076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const 535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 5369a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian return new Surface(mFlinger, clientIndex(), mIdentity, 537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const_cast<LayerBaseClient *>(this)); 538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5401b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 5411b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 5421b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 5431b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5441b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian sp<Client> client(this->client.promote()); 5451b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 5461b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " name=%s\n" 5471b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " id=0x%08x, client=0x%08x, identity=%u\n", 5481b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getName().string(), 5491b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian clientIndex(), client.get() ? client->cid : 0, 5501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getIdentity()); 5511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 5521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 5531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 5541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 555076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 556076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5579a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface( 5589a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian const sp<SurfaceFlinger>& flinger, 5599a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian SurfaceID id, int identity, 560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const sp<LayerBaseClient>& owner) 5619a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian : mFlinger(flinger), mToken(id), mIdentity(identity), mOwner(owner) 5629a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5659a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface() 5669a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 5679a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian /* 5689a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * This is a good place to clean-up all client resources 5699a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian */ 5709a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 5719a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 5729a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian sp<LayerBaseClient> layer = getOwner(); 5739a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian if (layer != 0) { 5749a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian mFlinger->destroySurface(layer); 5759a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian } 576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const { 579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<LayerBaseClient> owner(mOwner.promote()); 580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return owner; 581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact( 584375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (code) { 587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case REGISTER_BUFFERS: 588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case UNREGISTER_BUFFERS: 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case CREATE_OVERLAY: 590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { 591375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) { 592375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian IPCThreadState* ipc = IPCThreadState::self(); 593375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int pid = ipc->getCallingPid(); 594375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int uid = ipc->getCallingUid(); 595375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian LOGE("Permission Denial: " 596375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 597375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian return PERMISSION_DENIED; 598076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return BnSurface::onTransact(code, data, reply, flags); 602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 604a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int bufferIdx, 605a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian uint32_t w, uint32_t h, uint32_t format, uint32_t usage) 606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 610b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopianstatus_t LayerBaseClient::Surface::setBufferCount(int bufferCount) 611b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{ 612b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian return INVALID_OPERATION; 613b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 614b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers( 616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const ISurface::BufferHeap& buffers) 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return INVALID_OPERATION; 619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset) 622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers() 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay( 63052e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}; 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 638