LayerBase.cpp revision d12965934712ed0b9c1a264a6934dc0dad839ffd
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 Projectconst uint32_t LayerBase::typeInfo = 1; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* const LayerBase::typeID = "LayerBase"; 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst uint32_t LayerBaseClient::typeInfo = LayerBase::typeInfo | 2; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* const LayerBaseClient::typeID = "LayerBaseClient"; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : dpy(display), contentDirty(false), 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger(flinger), 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformed(false), 53a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian mUseLinearFiltering(false), 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation(0), 55ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian mLeft(0), mTop(0), 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransactionFlags(0), 57d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mPremultipliedAlpha(true), mDebug(false), 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mInvalidate(0) 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware()); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlags = hw.getFlags(); 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase() 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) { 69d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mName = name; 70d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 71d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 72d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const { 73d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian return mName; 74d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian} 75d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy) 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mFlinger->graphicPlane(dpy); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t layerFlags = 0; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPremultipliedAlpha = false; 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.z = 0; 967e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.w = w; 977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.h = h; 987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 1007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.alpha = 0xFF; 1017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.flags = layerFlags; 1027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.sequence = 0; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(0, 0); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // drawing state & current state are identical 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() { 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDrawingState = mCurrentState; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() { 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((old & eTransactionNeeded) == 0); 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) { 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set(x, y); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.z == z) 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.z = z; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 1467e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if (mCurrentState.requested_w == w && mCurrentState.requested_h == h) 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 1487e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_w = w; 1497e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian mCurrentState.requested_h = h; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.alpha == alpha) 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.alpha = alpha; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check the matrix has changed 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transform.set( 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check the region has changed 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.transparentRegion = transparent; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mCurrentState.flags == newFlags) 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.sequence++; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCurrentState.flags = newFlags; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project requestTransaction(); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mTransformedBounds; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project visibleRegionScreen = visibleRegion; 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always called from main thread 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project coveredRegionScreen = coveredRegion; 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& front(drawingState()); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& temp(currentState()); 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2067e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian if ((front.requested_w != temp.requested_w) || 2077e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian (front.requested_h != temp.requested_h)) { 2087e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian // resize the layer, set the physical size to the requested size 2097e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian Layer::State& editTemp(currentState()); 2107e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.w = temp.requested_w; 2117e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian editTemp.h = temp.requested_h; 2127e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian } 2136656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian 2146656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian if ((front.w != temp.w) || (front.h != temp.h)) { 2156656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian // invalidate and recompute the visible regions if needed 2166656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian flags |= Layer::eVisibleRegion; 2176656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian this->contentDirty = true; 2186656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian } 2197e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (temp.sequence != front.sequence) { 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate and recompute the visible regions if needed 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= eVisibleRegion; 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->contentDirty = true; 224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian const bool linearFiltering = mUseLinearFiltering; 226a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian mUseLinearFiltering = false; 227a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (!(mFlags & DisplayHardware::SLOW_CONFIG)) { 228a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian // we may use linear filtering, if the matrix scales us 229a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian const uint8_t type = temp.transform.getType(); 230a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) { 231a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian mUseLinearFiltering = true; 232a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 233a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 234a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 235a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Commit the transaction 237ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian commitTransaction(); 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return flags; 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Layer::State& s(drawingState()); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform tr(planeTransform * s.transform); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const bool transformed = tr.transformed(); 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 247cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t w = s.w; 248cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian uint32_t h = s.h; 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[0], 0, 0); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[1], 0, h); 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[2], w, h); 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tr.transform(mVertices[3], w, 0); 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(transformed)) { 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // in the transparent region 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (tr.preserveRects()) { 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transform the transparent region 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // transformation too complex, can't do the transparent region 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // optimization. 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen.clear(); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transparentRegionScreen = s.transparentRegion; 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // cache a few things... 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mOrientation = tr.getOrientation(); 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformedBounds = tr.makeBounds(w, h); 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTransformed = transformed; 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLeft = tr.tx(); 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mTop = tr.ty(); 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip( 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Transform& planeTransform, Region& outDirtyRegion) 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_and(~1, &mInvalidate)&1) == 1) { 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outDirtyRegion.orSelf(visibleRegionScreen); 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::finishPageFlip() 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate() 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((android_atomic_or(1, &mInvalidate)&1) == 0) { 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFlinger->signalEvent(); 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = reg.begin(); 30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = reg.end(); 30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (it != end) { 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Rect r; 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbWidth = hw.getWidth(); 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t fbHeight = hw.getHeight(); 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 }, 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { fbWidth, fbHeight }, { 0, fbHeight } }; 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 31120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (it != end) { 31220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& r = *it++; 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLint sy = fbHeight - (r.top + r.height()); 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate the region we'll update 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region clip(inClip); // copy-on-write, so no-op most of the time 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Remove the transparent area from the clipping region 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s = drawingState(); 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (LIKELY(!s.transparentRegion.isEmpty())) { 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clip.subtract(transparentRegionScreen); 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (clip.isEmpty()) { 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // usually this won't happen because this should be taken care of 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // by SurfaceFlinger::computeVisibleRegions() 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // reset GL state 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_SCISSOR_TEST); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project onDraw(clip); 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_TEXTURE_2D); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glColor4x(0, 0x8000, 0, 0x10000); 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawRegion(transparentRegionScreen); 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLuint LayerBase::createTexture() const 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLuint textureName = -1; 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glGenTextures(1, &textureName); 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 359a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 360a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return textureName; 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampx red, 36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin GLclampx green, GLclampx blue, 36629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin GLclampx alpha) const 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 37029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin glColor4x(red,green,blue,alpha); 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_TEXTURE_2D); 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_DITHER); 37420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 37520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator it = clip.begin(); 37620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const end = clip.end(); 37795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glEnable(GL_SCISSOR_TEST); 37895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glVertexPointer(2, GL_FIXED, 0, mVertices); 37995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 38095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 38195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 38295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 38395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 38829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{ 38929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 39029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin} 39129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin 3921fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const State& s(drawingState()); 3970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // bind our texture 3991fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian validateTexture(texture.name); 4001fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t width = texture.width; 4011fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian uint32_t height = texture.height; 4021fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_TEXTURE_2D); 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(s.alpha < 0xFF)) { 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We have an alpha-modulation. We need to modulate all 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // texture components by alpha because we're always using 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // premultiplied alpha. 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If the texture doesn't have an alpha channel we can 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // use REPLACE and switch to non premultiplied alpha 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // blending (SRCA/ONE_MINUS_SRCA). 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum env, src; 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsBlending()) { 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project env = GL_MODULATE; 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project env = GL_REPLACE; 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project src = GL_SRC_ALPHA; 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GGLfixed alpha = (s.alpha << 16)/255; 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glColor4x(alpha, alpha, alpha, alpha); 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env); 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsBlending()) { 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glEnable(GL_BLEND); 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glDisable(GL_BLEND); 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian Region::const_iterator it = clip.begin(); 44095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian Region::const_iterator const end = clip.end(); 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (UNLIKELY(transformed() 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project || !(mFlags & DisplayHardware::DRAW_TEXTURE_EXTENSION) )) 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //StopWatch watch("GL transformed"); 44595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLfixed texCoords[4][2] = { 44695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian { 0, 0 }, 44795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian { 0, 0x10000 }, 44895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian { 0x10000, 0x10000 }, 44995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian { 0x10000, 0 } 45095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian }; 45195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian 45295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glMatrixMode(GL_TEXTURE); 45395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glLoadIdentity(); 45495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian 45595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian // the texture's source is rotated 4565994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang switch (texture.transform) { 4575994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang case HAL_TRANSFORM_ROT_90: 4585994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang glTranslatef(0, 1, 0); 4595994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang glRotatef(-90, 0, 0, 1); 4605994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang break; 4615994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang case HAL_TRANSFORM_ROT_180: 4625994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang glTranslatef(1, 1, 0); 4635994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang glRotatef(-180, 0, 0, 1); 4645994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang break; 4655994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang case HAL_TRANSFORM_ROT_270: 4665994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang glTranslatef(1, 0, 0); 4675994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang glRotatef(-270, 0, 0, 1); 4685994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang break; 46995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian } 4705994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang 4713330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture.NPOTAdjust) { 4723330b203039dea366d4981db1408a460134b2d2cMathias Agopian glScalef(texture.wScale, texture.hScale, 1.0f); 47395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian } 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 47695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glVertexPointer(2, GL_FIXED, 0, mVertices); 47795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glTexCoordPointer(2, GL_FIXED, 0, texCoords); 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 48095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 48195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 48295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 48395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 48595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 48795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian GLint crop[4] = { 0, height, width, -height }; 48895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 48995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian int x = tx(); 49095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian int y = ty(); 49195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian y = fbHeight - (y + height); 49295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian while (it != end) { 49395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const Rect& r = *it++; 49495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 49595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 49695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian glDrawTexiOES(x, y, 0, width, height); 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: reload the texture if needed 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this is currently done in loadTexture() below 506a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian if (mUseLinearFiltering) { 507a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 508a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 509a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } else { 510a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 511a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 512a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian } 513401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian 514401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian if (needsDithering()) { 515401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian glEnable(GL_DITHER); 516401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian } else { 517401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian glDisable(GL_DITHER); 518401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian } 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52154ed4f6282bdea251455f39b978626026affdbefMathias Agopianbool LayerBase::isSupportedYuvFormat(int format) const 52254ed4f6282bdea251455f39b978626026affdbefMathias Agopian{ 52354ed4f6282bdea251455f39b978626026affdbefMathias Agopian switch (format) { 52454ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 52554ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 52654ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_P: 52754ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_P: 52854ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_I: 52954ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_I: 53054ed4f6282bdea251455f39b978626026affdbefMathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP: 53154ed4f6282bdea251455f39b978626026affdbefMathias Agopian return true; 53254ed4f6282bdea251455f39b978626026affdbefMathias Agopian } 53354ed4f6282bdea251455f39b978626026affdbefMathias Agopian return false; 53454ed4f6282bdea251455f39b978626026affdbefMathias Agopian} 53554ed4f6282bdea251455f39b978626026affdbefMathias Agopian 5363330b203039dea366d4981db1408a460134b2d2cMathias Agopianvoid LayerBase::loadTexture(Texture* texture, 5371fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian const Region& dirty, const GGLSurface& t) const 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 5393330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->name == -1U) { 5403330b203039dea366d4981db1408a460134b2d2cMathias Agopian // uh? 5413330b203039dea366d4981db1408a460134b2d2cMathias Agopian return; 5423330b203039dea366d4981db1408a460134b2d2cMathias Agopian } 54357720c384af81327d327ef8b88078f11a750fd05Mathias Agopian 5443330b203039dea366d4981db1408a460134b2d2cMathias Agopian glBindTexture(GL_TEXTURE_2D, texture->name); 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In OpenGL ES we can't specify a stride with glTexImage2D (however, 548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * GL_UNPACK_ALIGNMENT is a limited form of stride). 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * So if the stride here isn't representable with GL_UNPACK_ALIGNMENT, we 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * need to do something reasonable (here creating a bigger texture). 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * extra pixels = (((stride - width) * pixelsize) / GL_UNPACK_ALIGNMENT); 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This situation doesn't happen often, but some h/w have a limitation 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * for their framebuffer (eg: must be multiple of 8 pixels), and 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * we need to take that into account when using these buffers as 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * textures. 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This should never be a problem with POT textures 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int unpack = __builtin_ctz(t.stride * bytesPerPixel(t.format)); 563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian unpack = 1 << ((unpack > 3) ? 3 : unpack); 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glPixelStorei(GL_UNPACK_ALIGNMENT, unpack); 565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * round to POT if needed 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 5693330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (!(mFlags & DisplayHardware::NPOT_EXTENSION)) { 5703330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->NPOTAdjust = true; 5713330b203039dea366d4981db1408a460134b2d2cMathias Agopian } 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5733330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->NPOTAdjust) { 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // find the smallest power-of-two that will accommodate our surface 5753330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potWidth = 1 << (31 - clz(t.width)); 5763330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potHeight = 1 << (31 - clz(t.height)); 5773330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->potWidth < t.width) texture->potWidth <<= 1; 5783330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->potHeight < t.height) texture->potHeight <<= 1; 5793330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->wScale = float(t.width) / texture->potWidth; 5803330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->hScale = float(t.height) / texture->potHeight; 5813330b203039dea366d4981db1408a460134b2d2cMathias Agopian } else { 5823330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potWidth = t.width; 5833330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->potHeight = t.height; 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5853330b203039dea366d4981db1408a460134b2d2cMathias Agopian 586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Rect bounds(dirty.bounds()); 587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLvoid* data = 0; 5883330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (texture->width != t.width || texture->height != t.height) { 5893330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->width = t.width; 5903330b203039dea366d4981db1408a460134b2d2cMathias Agopian texture->height = t.height; 591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5923330b203039dea366d4981db1408a460134b2d2cMathias Agopian // texture size changed, we need to create a new one 5933330b203039dea366d4981db1408a460134b2d2cMathias Agopian bounds.set(Rect(t.width, t.height)); 5943330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (t.width == texture->potWidth && 5953330b203039dea366d4981db1408a460134b2d2cMathias Agopian t.height == texture->potHeight) { 5963330b203039dea366d4981db1408a460134b2d2cMathias Agopian // we can do it one pass 5973330b203039dea366d4981db1408a460134b2d2cMathias Agopian data = t.data; 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5993330b203039dea366d4981db1408a460134b2d2cMathias Agopian 60054ed4f6282bdea251455f39b978626026affdbefMathias Agopian if (t.format == HAL_PIXEL_FORMAT_RGB_565) { 601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 6023330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_RGB, texture->potWidth, texture->potHeight, 0, 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); 60454ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { 605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 6063330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_RGBA, texture->potWidth, texture->potHeight, 0, 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data); 60854ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || 60954ed4f6282bdea251455f39b978626026affdbefMathias Agopian t.format == HAL_PIXEL_FORMAT_RGBX_8888) { 610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 6113330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_RGBA, texture->potWidth, texture->potHeight, 0, 612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_BYTE, data); 61354ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (isSupportedYuvFormat(t.format)) { 614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // just show the Y plane of YUV buffers 615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 6163330b203039dea366d4981db1408a460134b2d2cMathias Agopian GL_LUMINANCE, texture->potWidth, texture->potHeight, 0, 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_LUMINANCE, GL_UNSIGNED_BYTE, data); 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else { 619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // oops, we don't handle this format! 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LOGE("layer %p, texture=%d, using format %d, which is not " 6213330b203039dea366d4981db1408a460134b2d2cMathias Agopian "supported by the GL", this, texture->name, t.format); 622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 6243330b203039dea366d4981db1408a460134b2d2cMathias Agopian if (!data) { 62554ed4f6282bdea251455f39b978626026affdbefMathias Agopian if (t.format == HAL_PIXEL_FORMAT_RGB_565) { 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride*2); 63054ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride*2); 63554ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || 63654ed4f6282bdea251455f39b978626026affdbefMathias Agopian t.format == HAL_PIXEL_FORMAT_RGBX_8888) { 637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_RGBA, GL_UNSIGNED_BYTE, 640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride*4); 64154ed4f6282bdea251455f39b978626026affdbefMathias Agopian } else if (isSupportedYuvFormat(t.format)) { 642076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // just show the Y plane of YUV buffers 643076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 0, bounds.top, t.width, bounds.height(), 645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GL_LUMINANCE, GL_UNSIGNED_BYTE, 646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian t.data + bounds.top*t.stride); 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopianstatus_t LayerBase::initializeEglImage( 65254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian const sp<GraphicBuffer>& buffer, Texture* texture) 65354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian{ 65454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian status_t err = NO_ERROR; 65554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 65654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // we need to recreate the texture 65754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); 65854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 65954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // free the previous image 66054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian if (texture->image != EGL_NO_IMAGE_KHR) { 66154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian eglDestroyImageKHR(dpy, texture->image); 66254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->image = EGL_NO_IMAGE_KHR; 66354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } 66454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 66554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // construct an EGL_NATIVE_BUFFER_ANDROID 66654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); 66754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 66854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // create the new EGLImageKHR 66954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian const EGLint attrs[] = { 67054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, 67154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian EGL_NONE, EGL_NONE 67254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian }; 67354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->image = eglCreateImageKHR( 67454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, 67554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian (EGLClientBuffer)clientBuf, attrs); 67654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 67754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian if (texture->image != EGL_NO_IMAGE_KHR) { 67854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian glBindTexture(GL_TEXTURE_2D, texture->name); 67954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, 68054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian (GLeglImageOES)texture->image); 68154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian GLint error = glGetError(); 68254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian if (UNLIKELY(error != GL_NO_ERROR)) { 68354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " 68454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian "failed err=0x%04x", 68554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian this, texture->image, error); 68654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian err = INVALID_OPERATION; 68754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } else { 68854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian // Everything went okay! 68954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->NPOTAdjust = false; 69054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->dirty = false; 69154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->width = clientBuf->width; 69254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian texture->height = clientBuf->height; 69354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } 69454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } else { 695fcfeb4b5970c8f361634429934a2518d7e8328ddMathias Agopian LOGE("layer=%p, eglCreateImageKHR() failed. err=0x%4x", 696fcfeb4b5970c8f361634429934a2518d7e8328ddMathias Agopian this, eglGetError()); 69754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian err = INVALID_OPERATION; 69854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian } 69954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian return err; 70054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian} 70154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 70254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7052e123245811a1f31c080a29728fcc1655045f011Mathias Agopianint32_t LayerBaseClient::sIdentity = 0; 7062e123245811a1f31c080a29728fcc1655045f011Mathias Agopian 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 708f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian const sp<Client>& client, int32_t i) 709d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian : LayerBase(flinger, display), lcblk(NULL), client(client), mIndex(i), 710948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 71248d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian lcblk = new SharedBufferServer( 71348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian client->ctrlblk, i, NUM_BUFFERS, 71448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian mIdentity); 715076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 717076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::onFirstRef() 718076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 719f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 720f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 721076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian client->bindLayer(this, mIndex); 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 727f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 728f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project client->free(mIndex); 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 73148d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian delete lcblk; 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 734f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopianint32_t LayerBaseClient::serverIndex() const 735f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian{ 736f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian sp<Client> client(this->client.promote()); 737f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian if (client != 0) { 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (client->cid<<16)|mIndex; 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0xFFFF0000 | mIndex; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 743076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface() 744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 745076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<Surface> s; 746076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(mLock); 747076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian s = mClientSurface.promote(); 748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (s == 0) { 749076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian s = createSurface(); 750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mClientSurface = s; 751076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 752076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return s; 753076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 755076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const 756076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 7579a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian return new Surface(mFlinger, clientIndex(), mIdentity, 758076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const_cast<LayerBaseClient *>(this)); 759076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 760076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 7610b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian// called with SurfaceFlinger::mStateLock as soon as the layer is entered 7620b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian// in the purgatory list 7630b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopianvoid LayerBaseClient::onRemoved() 7640b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian{ 7650b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian // wake up the condition 7660b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian lcblk->setStatus(NO_INIT); 7670b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian} 7680b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian 769076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 770076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 7719a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface( 7729a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian const sp<SurfaceFlinger>& flinger, 7739a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian SurfaceID id, int identity, 774076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const sp<LayerBaseClient>& owner) 7759a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian : mFlinger(flinger), mToken(id), mIdentity(identity), mOwner(owner) 7769a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 777076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 778076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 7799a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface() 7809a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{ 7819a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian /* 7829a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * This is a good place to clean-up all client resources 7839a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian */ 7849a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian 7859a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian // destroy client resources 7869a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian sp<LayerBaseClient> layer = getOwner(); 7879a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian if (layer != 0) { 7889a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian mFlinger->destroySurface(layer); 7899a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian } 790076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 791076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 792076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const { 793076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian sp<LayerBaseClient> owner(mOwner.promote()); 794076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return owner; 795076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 796076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 797076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact( 798375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 799076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 800076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (code) { 801076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case REGISTER_BUFFERS: 802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case UNREGISTER_BUFFERS: 803076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case CREATE_OVERLAY: 804076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { 805375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) { 806375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian IPCThreadState* ipc = IPCThreadState::self(); 807375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int pid = ipc->getCallingPid(); 808375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian const int uid = ipc->getCallingUid(); 809375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian LOGE("Permission Denial: " 810375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 811375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian return PERMISSION_DENIED; 812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 815076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return BnSurface::onTransact(code, data, reply, flags); 816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 8183330b203039dea366d4981db1408a460134b2d2cMathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int index, int usage) 819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 823076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers( 824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const ISurface::BufferHeap& buffers) 825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return INVALID_OPERATION; 827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset) 830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers() 834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay( 83852e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) 839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return NULL; 841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}; 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 846