LayerBase.cpp revision 1b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 23310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IPCThreadState.h> 24310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IServiceManager.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/hardware.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h" 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h" 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : dpy(display), contentDirty(false), 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger(flinger), 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformed(false), 45a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian mUseLinearFiltering(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 216a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian const bool linearFiltering = mUseLinearFiltering; 217a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian mUseLinearFiltering = false; 218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (!(mFlags & DisplayHardware::SLOW_CONFIG)) { 219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian // we may use linear filtering, if the matrix scales us 220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian const uint8_t type = temp.transform.getType(); 221a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) { 222a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian mUseLinearFiltering = true; 223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 226a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 228ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 238cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t w = s.w; 239cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t h = s.h; 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[0], 0, 0); 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[1], 0, h); 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[2], w, h); 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[3], w, 0); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(transformed)) { 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the transparent region 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (tr.preserveRects()) { 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transform the transparent region 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transformation too complex, can't do the transparent region 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // optimization. 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen.clear(); 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = s.transparentRegion; 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cache a few things... 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation = tr.getOrientation(); 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformedBounds = tr.makeBounds(w, h); 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformed = transformed; 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLeft = tr.tx(); 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTop = tr.ty(); 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip( 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform& planeTransform, Region& outDirtyRegion) 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_and(~1, &mInvalidate)&1) == 1) { 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outDirtyRegion.orSelf(visibleRegionScreen); 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::finishPageFlip() 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate() 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_or(1, &mInvalidate)&1) == 0) { 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger->signalEvent(); 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = reg.begin(); 29320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = reg.end(); 29420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (it != end) { 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect r; 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbWidth = hw.getWidth(); 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbHeight = hw.getHeight(); 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 }, 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { fbWidth, fbHeight }, { 0, fbHeight } }; 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (it != end) { 30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& r = *it++; 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLint sy = fbHeight - (r.top + r.height()); 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate the region we'll update 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region clip(inClip); // copy-on-write, so no-op most of the time 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Remove the transparent area from the clipping region 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s = drawingState(); 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (LIKELY(!s.transparentRegion.isEmpty())) { 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clip.subtract(transparentRegionScreen); 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (clip.isEmpty()) { 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // usually this won't happen because this should be taken care of 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // by SurfaceFlinger::computeVisibleRegions() 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // reset GL state 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_SCISSOR_TEST); 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project onDraw(clip); 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_TEXTURE_2D); 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glColor4x(0, 0x8000, 0, 0x10000); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawRegion(transparentRegionScreen); 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLuint LayerBase::createTexture() const 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLuint textureName = -1; 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glGenTextures(1, &textureName); 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 350a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 351a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return textureName; 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampx red, 35629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin GLclampx green, GLclampx blue, 35729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin GLclampx alpha) const 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 36129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin glColor4x(red,green,blue,alpha); 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_TEXTURE_2D); 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 36520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 36620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = clip.begin(); 36720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = clip.end(); 36895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glEnable(GL_SCISSOR_TEST); 36978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 37095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 37195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 37295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 37395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 37495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 37929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 38029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 38129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 38229aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 3831fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 3880926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // bind our texture 3901fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian validateTexture(texture.name); 3911fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t width = texture.width; 3921fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t height = texture.height; 3931fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_TEXTURE_2D); 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(s.alpha < 0xFF)) { 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We have an alpha-modulation. We need to modulate all 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // texture components by alpha because we're always using 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // premultiplied alpha. 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If the texture doesn't have an alpha channel we can 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // use REPLACE and switch to non premultiplied alpha 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // blending (SRCA/ONE_MINUS_SRCA). 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum env, src; 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsBlending()) { 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project env = GL_MODULATE; 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project env = GL_REPLACE; 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project src = GL_SRC_ALPHA; 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 41378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLfloat alpha = s.alpha * (1.0f/255.0f); 41478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(alpha, alpha, alpha, alpha); 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env); 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 42078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glColor4f(1, 1, 1, 1); 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsBlending()) { 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian Region::const_iterator it = clip.begin(); 43195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian Region::const_iterator const end = clip.end(); 43278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLfloat texCoords[4][2] = { 43378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 0, 0 }, 43478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 0, 1 }, 43578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 1, 1 }, 43678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian { 1, 0 } 43778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian }; 43878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 43978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glMatrixMode(GL_TEXTURE); 44078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glLoadIdentity(); 44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian 44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian // the texture's source is rotated 44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian switch (texture.transform) { 44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian case HAL_TRANSFORM_ROT_90: 44578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTranslatef(0, 1, 0); 44678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glRotatef(-90, 0, 0, 1); 44778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian break; 44878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian case HAL_TRANSFORM_ROT_180: 44978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTranslatef(1, 1, 0); 45078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glRotatef(-180, 0, 0, 1); 45178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian break; 45278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian case HAL_TRANSFORM_ROT_270: 45378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTranslatef(1, 0, 0); 45478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glRotatef(-270, 0, 0, 1); 45578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian break; 45678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian } 4575994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang 45878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian if (texture.NPOTAdjust) { 45978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glScalef(texture.wScale, texture.hScale, 1.0f); 46078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian } 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 46378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glVertexPointer(2, GL_FLOAT, 0, mVertices); 46478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian while (it != end) { 46778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const Rect& r = *it++; 46878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 46978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glScissor(r.left, sy, r.width(), r.height()); 47078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 47278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: reload the texture if needed 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this is currently done in loadTexture() below 480a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (mUseLinearFiltering) { 481a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 482a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 483a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } else { 484a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 485a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 486a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 487401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian 488401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian if (needsDithering()) { 489401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian glEnable(GL_DITHER); 490401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian } else { 491401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian glDisable(GL_DITHER); 492401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian } 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49554ed4f6282bdea251455f39b978626026affdbefMathias Agopianbool LayerBase::isSupportedYuvFormat(int format) const 49654ed4f6282bdea251455f39b978626026affdbefMathias Agopian{ 49754ed4f6282bdea251455f39b978626026affdbefMathias Agopian switch (format) { 49854ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 49954ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 50054ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_P: 50154ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_P: 50254ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_I: 50354ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_I: 50454ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP: 50554ed4f6282bdea251455f39b978626026affdbefMathias Agopian return true; 50654ed4f6282bdea251455f39b978626026affdbefMathias Agopian } 50754ed4f6282bdea251455f39b978626026affdbefMathias Agopian return false; 50854ed4f6282bdea251455f39b978626026affdbefMathias Agopian} 50954ed4f6282bdea251455f39b978626026affdbefMathias Agopian 5103330b203039dea366d4981db1408a460134b2d2cMathias Agopianvoid LayerBase::loadTexture(Texture* texture, 5111fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian const Region& dirty, const GGLSurface& t) const 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 5133330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->name == -1U) { 5143330b203039dea366d4981db1408a460134b2d2cMathias Agopian // uh? 5153330b203039dea366d4981db1408a460134b2d2cMathias Agopian return; 5163330b203039dea366d4981db1408a460134b2d2cMathias Agopian } 51757720c384af81327d327ef8b88078f11a750fd05Mathias Agopian 5183330b203039dea366d4981db1408a460134b2d2cMathias Agopian glBindTexture(GL_TEXTURE_2D, texture->name); 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In OpenGL ES we can't specify a stride with glTexImage2D (however, 522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * GL_UNPACK_ALIGNMENT is a limited form of stride). 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * So if the stride here isn't representable with GL_UNPACK_ALIGNMENT, we 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * need to do something reasonable (here creating a bigger texture). 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * extra pixels = (((stride - width) * pixelsize) / GL_UNPACK_ALIGNMENT); 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This situation doesn't happen often, but some h/w have a limitation 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * for their framebuffer (eg: must be multiple of 8 pixels), and 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * we need to take that into account when using these buffers as 531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * textures. 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This should never be a problem with POT textures 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int unpack = __builtin_ctz(t.stride * bytesPerPixel(t.format)); 537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian unpack = 1 << ((unpack > 3) ? 3 : unpack); 538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glPixelStorei(GL_UNPACK_ALIGNMENT, unpack); 539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * round to POT if needed 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 5433330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (!(mFlags & DisplayHardware::NPOT_EXTENSION)) { 5443330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->NPOTAdjust = true; 5453330b203039dea366d4981db1408a460134b2d2cMathias Agopian } 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5473330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->NPOTAdjust) { 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // find the smallest power-of-two that will accommodate our surface 5493330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potWidth = 1 << (31 - clz(t.width)); 5503330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potHeight = 1 << (31 - clz(t.height)); 5513330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->potWidth < t.width) texture->potWidth <<= 1; 5523330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->potHeight < t.height) texture->potHeight <<= 1; 5533330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->wScale = float(t.width) / texture->potWidth; 5543330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->hScale = float(t.height) / texture->potHeight; 5553330b203039dea366d4981db1408a460134b2d2cMathias Agopian } else { 5563330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potWidth = t.width; 5573330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potHeight = t.height; 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5593330b203039dea366d4981db1408a460134b2d2cMathias Agopian 560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Rect bounds(dirty.bounds()); 561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLvoid* data = 0; 5623330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->width != t.width || texture->height != t.height) { 5633330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->width = t.width; 5643330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->height = t.height; 565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5663330b203039dea366d4981db1408a460134b2d2cMathias Agopian // texture size changed, we need to create a new one 5673330b203039dea366d4981db1408a460134b2d2cMathias Agopian bounds.set(Rect(t.width, t.height)); 5683330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (t.width == texture->potWidth && 5693330b203039dea366d4981db1408a460134b2d2cMathias Agopian t.height == texture->potHeight) { 5703330b203039dea366d4981db1408a460134b2d2cMathias Agopian // we can do it one pass 5713330b203039dea366d4981db1408a460134b2d2cMathias Agopian data = t.data; 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5733330b203039dea366d4981db1408a460134b2d2cMathias Agopian 57454ed4f6282bdea251455f39b978626026affdbefMathias Agopian if (t.format == HAL_PIXEL_FORMAT_RGB_565) { 575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5763330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_RGB, texture->potWidth, texture->potHeight, 0, 577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); 57854ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { 579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5803330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_RGBA, texture->potWidth, texture->potHeight, 0, 581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data); 58254ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || 58354ed4f6282bdea251455f39b978626026affdbefMathias Agopian t.format == HAL_PIXEL_FORMAT_RGBX_8888) { 584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5853330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_RGBA, texture->potWidth, texture->potHeight, 0, 586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_BYTE, data); 58754ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (isSupportedYuvFormat(t.format)) { 588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // just show the Y plane of YUV buffers 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5903330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_LUMINANCE, texture->potWidth, texture->potHeight, 0, 591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_LUMINANCE, GL_UNSIGNED_BYTE, data); 592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else { 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // oops, we don't handle this format! 594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LOGE("layer %p, texture=%d, using format %d, which is not " 5953330b203039dea366d4981db1408a460134b2d2cMathias Agopian "supported by the GL", this, texture->name, t.format); 596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 5983330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (!data) { 59954ed4f6282bdea251455f39b978626026affdbefMathias Agopian if (t.format == HAL_PIXEL_FORMAT_RGB_565) { 600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride*2); 60454ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { 605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride*2); 60954ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || 61054ed4f6282bdea251455f39b978626026affdbefMathias Agopian t.format == HAL_PIXEL_FORMAT_RGBX_8888) { 611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_BYTE, 614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride*4); 61554ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (isSupportedYuvFormat(t.format)) { 616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // just show the Y plane of YUV buffers 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_LUMINANCE, GL_UNSIGNED_BYTE, 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride); 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopianstatus_t LayerBase::initializeEglImage( 62654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian const sp<GraphicBuffer>& buffer, Texture* texture) 62754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian{ 62854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian status_t err = NO_ERROR; 62954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 63054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // we need to recreate the texture 63154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); 63254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 63354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // free the previous image 63454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian if (texture->image != EGL_NO_IMAGE_KHR) { 63554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian eglDestroyImageKHR(dpy, texture->image); 63654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->image = EGL_NO_IMAGE_KHR; 63754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } 63854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 63954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // construct an EGL_NATIVE_BUFFER_ANDROID 64054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); 64154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 64254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // create the new EGLImageKHR 64354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian const EGLint attrs[] = { 64454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, 64554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian EGL_NONE, EGL_NONE 64654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian }; 64754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->image = eglCreateImageKHR( 64854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, 64954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian (EGLClientBuffer)clientBuf, attrs); 65054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 65154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian if (texture->image != EGL_NO_IMAGE_KHR) { 65254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian glBindTexture(GL_TEXTURE_2D, texture->name); 65354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, 65454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian (GLeglImageOES)texture->image); 65554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian GLint error = glGetError(); 65654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian if (UNLIKELY(error != GL_NO_ERROR)) { 65754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " 65854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian "failed err=0x%04x", 65954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian this, texture->image, error); 66054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian err = INVALID_OPERATION; 66154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } else { 66254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // Everything went okay! 66354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->NPOTAdjust = false; 66454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->dirty = false; 66554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->width = clientBuf->width; 66654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->height = clientBuf->height; 66754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } 66854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } else { 669fcfeb4b5970c8f361634429934a2518d7e8328ddMathias Agopian LOGE("layer=%p, eglCreateImageKHR() failed. err=0x%4x", 670fcfeb4b5970c8f361634429934a2518d7e8328ddMathias Agopian this, eglGetError()); 67154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian err = INVALID_OPERATION; 67254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } 67354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian return err; 67454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian} 67554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 6761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const 6771b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 6781b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian const Layer::State& s(drawingState()); 6791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 6801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "+ %s %p\n" 6811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 6821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), " 6831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, " 6841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n", 6851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getTypeId(), this, s.z, tx(), ty(), s.w, s.h, 6861b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian needsBlending(), needsDithering(), contentDirty, 6871b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.alpha, s.flags, 6881b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[0][0], s.transform[0][1], 6891b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s.transform[1][0], s.transform[1][1]); 6901b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 6911b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 69254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6952e123245811a1f31c080a29728fcc1655045f011Mathias Agopianint32_t LayerBaseClient::sIdentity = 0; 6962e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 698f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian const sp<Client>& client, int32_t i) 699d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian : LayerBase(flinger, display), lcblk(NULL), client(client), mIndex(i), 700948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 70248d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian lcblk = new SharedBufferServer( 70348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian client->ctrlblk, i, NUM_BUFFERS, 70448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian mIdentity); 705076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 707076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::onFirstRef() 708076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 709f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 710f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 711076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian client->bindLayer(this, mIndex); 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 717f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 718f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project client->free(mIndex); 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 72148d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian delete lcblk; 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7241b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianssize_t LayerBaseClient::serverIndex() const 725f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian{ 726f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 727f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (client->cid<<16)|mIndex; 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 7301b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian return ssize_t(0xFFFF0000 | mIndex); 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 733076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface() 734076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 735076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<Surface> s; 736076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 737076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian s = mClientSurface.promote(); 738076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (s == 0) { 739076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian s = createSurface(); 740076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mClientSurface = s; 741076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 742076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 743076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 745076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const 746076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 7479a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian return new Surface(mFlinger, clientIndex(), mIdentity, 748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const_cast<LayerBaseClient *>(this)); 749076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 7510b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian// called with SurfaceFlinger::mStateLock as soon as the layer is entered 7520b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian// in the purgatory list 7530b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopianvoid LayerBaseClient::onRemoved() 7540b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian{ 7550b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian // wake up the condition 7560b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian lcblk->setStatus(NO_INIT); 7570b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian} 7580b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian 7591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const 7601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 7611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian LayerBase::dump(result, buffer, SIZE); 7621b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 7631b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian sp<Client> client(this->client.promote()); 7641b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian snprintf(buffer, SIZE, 7651b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " name=%s\n" 7661b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " id=0x%08x, client=0x%08x, identity=%u\n", 7671b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getName().string(), 7681b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian clientIndex(), client.get() ? client->cid : 0, 7691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian getIdentity()); 7701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 7711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian result.append(buffer); 7721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian} 7731b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 774076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 775076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 7769a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface( 7779a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian const sp<SurfaceFlinger>& flinger, 7789a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian SurfaceID id, int identity, 779076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const sp<LayerBaseClient>& owner) 7809a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian : mFlinger(flinger), mToken(id), mIdentity(identity), mOwner(owner) 7819a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 782076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 783076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 7849a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface() 7859a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 7869a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian /* 7879a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * This is a good place to clean-up all client resources 7889a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian */ 7899a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 7909a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 7919a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian sp<LayerBaseClient> layer = getOwner(); 7929a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian if (layer != 0) { 7939a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian mFlinger->destroySurface(layer); 7949a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian } 795076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 796076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 797076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const { 798076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<LayerBaseClient> owner(mOwner.promote()); 799076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return owner; 800076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 801076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact( 803375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 804076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 805076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (code) { 806076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case REGISTER_BUFFERS: 807076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case UNREGISTER_BUFFERS: 808076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case CREATE_OVERLAY: 809076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { 810375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) { 811375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian IPCThreadState* ipc = IPCThreadState::self(); 812375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int pid = ipc->getCallingPid(); 813375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int uid = ipc->getCallingUid(); 814375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian LOGE("Permission Denial: " 815375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 816375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian return PERMISSION_DENIED; 817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return BnSurface::onTransact(code, data, reply, flags); 821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 8233330b203039dea366d4981db1408a460134b2d2cMathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int index, int usage) 824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers( 829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const ISurface::BufferHeap& buffers) 830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return INVALID_OPERATION; 832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset) 835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers() 839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 842076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay( 84352e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) 844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}; 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 851