19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 23947f4f4d384ea26eb2145cc070a3eed42c59534aMathias Agopian#include <binder/IPCThreadState.h> 24947f4f4d384ea26eb2145cc070a3eed42c59534aMathias Agopian#include <binder/IServiceManager.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/glext.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware/hardware.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clz.h" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerBase.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SurfaceFlinger.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "DisplayHardware/DisplayHardware.h" 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst uint32_t LayerBase::typeInfo = 1; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const LayerBase::typeID = "LayerBase"; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst uint32_t LayerBaseClient::typeInfo = LayerBase::typeInfo | 2; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const LayerBaseClient::typeID = "LayerBaseClient"; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : dpy(display), contentDirty(false), 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlinger(flinger), 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformed(false), 5344cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian mUseLinearFiltering(false), 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrientation(0), 55ed2ab7f1062e002053e5a9d8c73672b74268dcbbMathias Agopian mLeft(0), mTop(0), 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransactionFlags(0), 57015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian mPremultipliedAlpha(true), mDebug(false), 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInvalidate(0) 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware()); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags = hw.getFlags(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBase::~LayerBase() 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopianvoid LayerBase::setName(const String8& name) { 69015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian mName = name; 70015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian} 71015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian 72015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias AgopianString8 LayerBase::getName() const { 73015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian return mName; 74015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian} 75015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFlinger->graphicPlane(dpy); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy) 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFlinger->graphicPlane(dpy); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t layerFlags = 0; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flags & ISurfaceComposer::eHidden) 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project layerFlags = ISurfaceComposer::eLayerHidden; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flags & ISurfaceComposer::eNonPremultiplied) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPremultipliedAlpha = false; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.z = 0; 96e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.w = w; 97e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.h = h; 98e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.requested_w = w; 99e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.requested_h = h; 100e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.alpha = 0xFF; 101e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.flags = layerFlags; 102e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.sequence = 0; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.transform.set(0, 0); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // drawing state & current state are identical 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawingState = mCurrentState; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1098851617aea7d2cd61fd8a8585bd4414a14d71653Mathias Agopianvoid LayerBase::commitTransaction() { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawingState = mCurrentState; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this can be called without SurfaceFlinger.mStateLock, but if we 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can atomically increment the sequence number, it doesn't matter. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&mCurrentState.sequence); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::requestTransaction() { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t old = setTransactionFlags(eTransactionNeeded); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((old & eTransactionNeeded) == 0); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_atomic_and(~flags, &mTransactionFlags) & flags; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android_atomic_or(flags, &mTransactionFlags); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.sequence++; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.transform.set(x, y); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentState.z == z) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.sequence++; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.z = z; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) { 146e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian if (mCurrentState.requested_w == w && mCurrentState.requested_h == h) 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 148e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.requested_w = w; 149e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian mCurrentState.requested_h = h; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentState.alpha == alpha) 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.sequence++; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.alpha = alpha; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: check the matrix has changed 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.sequence++; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.transform.set( 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: check the region has changed 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.sequence++; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.transparentRegion = transparent; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentState.flags == newFlags) 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.sequence++; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentState.flags = newFlags; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestTransaction(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectRect LayerBase::visibleBounds() const 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTransformedBounds; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // always called from main thread 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visibleRegionScreen = visibleRegion; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // always called from main thread 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coveredRegionScreen = coveredRegion; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags) 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& front(drawingState()); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& temp(currentState()); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 206e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian if ((front.requested_w != temp.requested_w) || 207e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian (front.requested_h != temp.requested_h)) { 208e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian // resize the layer, set the physical size to the requested size 209e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian Layer::State& editTemp(currentState()); 210e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian editTemp.w = temp.requested_w; 211e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian editTemp.h = temp.requested_h; 212e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian } 21370cab91229c3c2ca4bb75ab63b552ac7d1a6a8bbMathias Agopian 21470cab91229c3c2ca4bb75ab63b552ac7d1a6a8bbMathias Agopian if ((front.w != temp.w) || (front.h != temp.h)) { 21570cab91229c3c2ca4bb75ab63b552ac7d1a6a8bbMathias Agopian // invalidate and recompute the visible regions if needed 21670cab91229c3c2ca4bb75ab63b552ac7d1a6a8bbMathias Agopian flags |= Layer::eVisibleRegion; 21770cab91229c3c2ca4bb75ab63b552ac7d1a6a8bbMathias Agopian } 218e1b6f24423d61b7892e4a59f5a65b04231526712Mathias Agopian 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp.sequence != front.sequence) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // invalidate and recompute the visible regions if needed 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags |= eVisibleRegion; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this->contentDirty = true; 22344cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian 22444cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian const bool linearFiltering = mUseLinearFiltering; 22544cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian mUseLinearFiltering = false; 22644cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian if (!(mFlags & DisplayHardware::SLOW_CONFIG)) { 22744cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian // we may use linear filtering, if the matrix scales us 22844cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian const uint8_t type = temp.transform.getType(); 22944cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) { 23044cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian mUseLinearFiltering = true; 23144cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian } 23244cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian } 23344cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian } 23444cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Commit the transaction 2368851617aea7d2cd61fd8a8585bd4414a14d71653Mathias Agopian commitTransaction(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return flags; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform) 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Layer::State& s(drawingState()); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform tr(planeTransform * s.transform); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const bool transformed = tr.transformed(); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian uint32_t w = s.w; 2479779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian uint32_t h = s.h; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tr.transform(mVertices[0], 0, 0); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tr.transform(mVertices[1], 0, h); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tr.transform(mVertices[2], w, h); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tr.transform(mVertices[3], w, 0); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(transformed)) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // NOTE: here we could also punt if we have too many rectangles 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the transparent region 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tr.preserveRects()) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transform the transparent region 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transparentRegionScreen = tr.transform(s.transparentRegion); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transformation too complex, can't do the transparent region 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // optimization. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transparentRegionScreen.clear(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transparentRegionScreen = s.transparentRegion; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cache a few things... 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrientation = tr.getOrientation(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformedBounds = tr.makeBounds(w, h); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformed = transformed; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLeft = tr.tx(); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTop = tr.ty(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::unlockPageFlip( 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Transform& planeTransform, Region& outDirtyRegion) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((android_atomic_and(~1, &mInvalidate)&1) == 1) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDirtyRegion.orSelf(visibleRegionScreen); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::finishPageFlip() 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::invalidate() 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((android_atomic_or(1, &mInvalidate)&1) == 0) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlinger->signalEvent(); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3006158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian Region::const_iterator it = reg.begin(); 3016158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian Region::const_iterator const end = reg.end(); 3026158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian if (it != end) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect r; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int32_t fbWidth = hw.getWidth(); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int32_t fbHeight = hw.getHeight(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 }, 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { fbWidth, fbHeight }, { 0, fbHeight } }; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glVertexPointer(2, GL_SHORT, 0, vertices); 3106158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian while (it != end) { 3116158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian const Rect& r = *it++; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GLint sy = fbHeight - (r.top + r.height()); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glScissor(r.left, sy, r.width(), r.height()); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // invalidate the region we'll update 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Region clip(inClip); // copy-on-write, so no-op most of the time 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove the transparent area from the clipping region 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const State& s = drawingState(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LIKELY(!s.transparentRegion.isEmpty())) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clip.subtract(transparentRegionScreen); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clip.isEmpty()) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // usually this won't happen because this should be taken care of 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by SurfaceFlinger::computeVisibleRegions() 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset GL state 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_SCISSOR_TEST); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onDraw(clip); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_TEXTURE_2D); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_DITHER); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_BLEND); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4x(0, 0x8000, 0, 0x10000); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawRegion(transparentRegionScreen); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_BLEND); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectGLuint LayerBase::createTexture() const 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLuint textureName = -1; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glGenTextures(1, &textureName); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 35844cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 35944cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return textureName; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 363c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampx red, 364c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin GLclampx green, GLclampx blue, 365c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin GLclampx alpha) const 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 369c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin glColor4x(red,green,blue,alpha); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_TEXTURE_2D); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_BLEND); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_DITHER); 3736158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian 3746158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian Region::const_iterator it = clip.begin(); 3756158b1bf0364da1582468a98ec09d004ba99deecMathias Agopian Region::const_iterator const end = clip.end(); 376f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian glEnable(GL_SCISSOR_TEST); 377f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian glVertexPointer(2, GL_FIXED, 0, mVertices); 378f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian while (it != end) { 379f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian const Rect& r = *it++; 380f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 381f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian glScissor(r.left, sy, r.width(), r.height()); 382f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 386c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const 387c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin{ 388c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin clearWithOpenGL(clip,0,0,0,0); 389c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin} 390c8546781ff6fa26b3a7f2d1483db363f299a3898Rebecca Schultz Zavin 391999543ba26d10ff9879144965d0c0abcb400636aMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const DisplayHardware& hw(graphicPlane(0).displayHardware()); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t fbHeight = hw.getHeight(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const State& s(drawingState()); 396dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bind our texture 398999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian validateTexture(texture.name); 399999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian uint32_t width = texture.width; 400999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian uint32_t height = texture.height; 401999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_TEXTURE_2D); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UNLIKELY(s.alpha < 0xFF)) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We have an alpha-modulation. We need to modulate all 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // texture components by alpha because we're always using 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // premultiplied alpha. 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the texture doesn't have an alpha channel we can 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // use REPLACE and switch to non premultiplied alpha 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // blending (SRCA/ONE_MINUS_SRCA). 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLenum env, src; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needsBlending()) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env = GL_MODULATE; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env = GL_REPLACE; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src = GL_SRC_ALPHA; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GGLfixed alpha = (s.alpha << 16)/255; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4x(alpha, alpha, alpha, alpha); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_BLEND); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needsBlending()) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_BLEND); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_BLEND); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 438f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian Region::const_iterator it = clip.begin(); 439f2d28b74850ea0869aef2ce0727a6abb7b166a5cMathias Agopian Region::const_iterator const end = clip.end(); 440ac127dc31bd071ed522f5cd48a910065756c8dedChih-Chung Chang 44183512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian //StopWatch watch("GL transformed"); 44283512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian const GLfixed texCoords[4][2] = { 44383512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian { 0, 0 }, 44483512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian { 0, 0x10000 }, 44583512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian { 0x10000, 0x10000 }, 44683512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian { 0x10000, 0 } 44783512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian }; 44883512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian 44983512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glMatrixMode(GL_TEXTURE); 45083512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glLoadIdentity(); 45183512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian 45283512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian // the texture's source is rotated 45383512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian switch (texture.transform) { 45483512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian case HAL_TRANSFORM_ROT_90: 45583512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glTranslatef(0, 1, 0); 45683512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glRotatef(-90, 0, 0, 1); 45783512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian break; 45883512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian case HAL_TRANSFORM_ROT_180: 45983512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glTranslatef(1, 1, 0); 46083512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glRotatef(-180, 0, 0, 1); 46183512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian break; 46283512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian case HAL_TRANSFORM_ROT_270: 46383512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glTranslatef(1, 0, 0); 46483512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glRotatef(-270, 0, 0, 1); 46583512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian break; 46683512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46883512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian if (texture.NPOTAdjust) { 46983512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glScalef(texture.wScale, texture.hScale, 1.0f); 47083512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47283512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glEnableClientState(GL_TEXTURE_COORD_ARRAY); 47383512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glVertexPointer(2, GL_FIXED, 0, mVertices); 47483512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glTexCoordPointer(2, GL_FIXED, 0, texCoords); 47583512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian 47683512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian while (it != end) { 47783512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian const Rect& r = *it++; 47883512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian const GLint sy = fbHeight - (r.top + r.height()); 47983512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glScissor(r.left, sy, r.width(), r.height()); 48083512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48283512d4dfc06137bc2d9db0cb62644c54f41a771Mathias Agopian glDisableClientState(GL_TEXTURE_COORD_ARRAY); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, textureName); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: reload the texture if needed 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is currently done in loadTexture() below 49044cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian if (mUseLinearFiltering) { 49144cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 49244cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 49344cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian } else { 49444cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 49544cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 49644cac134655d5c3b2eeab2e42792c70a7aa8b92fMathias Agopian } 497cc934763c3fc789f53edb64de16fc36d43c3705dMathias Agopian 498cc934763c3fc789f53edb64de16fc36d43c3705dMathias Agopian if (needsDithering()) { 499cc934763c3fc789f53edb64de16fc36d43c3705dMathias Agopian glEnable(GL_DITHER); 500cc934763c3fc789f53edb64de16fc36d43c3705dMathias Agopian } else { 501cc934763c3fc789f53edb64de16fc36d43c3705dMathias Agopian glDisable(GL_DITHER); 502cc934763c3fc789f53edb64de16fc36d43c3705dMathias Agopian } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5058f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopianbool LayerBase::isSupportedYuvFormat(int format) const 5068f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian{ 5078f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian switch (format) { 5088f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 5098f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 5108f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_P: 5118f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_P: 5128f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_I: 5138f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_I: 5148f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP: 5158f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian return true; 5168f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } 5178f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian return false; 5188f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian} 5198f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian 5206950e428feaccc8164b989ef64e771a99948797aMathias Agopianvoid LayerBase::loadTexture(Texture* texture, 521999543ba26d10ff9879144965d0c0abcb400636aMathias Agopian const Region& dirty, const GGLSurface& t) const 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5236950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (texture->name == -1U) { 5246950e428feaccc8164b989ef64e771a99948797aMathias Agopian // uh? 5256950e428feaccc8164b989ef64e771a99948797aMathias Agopian return; 5266950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 527382e17d46fc54396a303593f2db3abe1fb911411Mathias Agopian 5286950e428feaccc8164b989ef64e771a99948797aMathias Agopian glBindTexture(GL_TEXTURE_2D, texture->name); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In OpenGL ES we can't specify a stride with glTexImage2D (however, 5321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian * GL_UNPACK_ALIGNMENT is a limited form of stride). 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * So if the stride here isn't representable with GL_UNPACK_ALIGNMENT, we 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to do something reasonable (here creating a bigger texture). 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extra pixels = (((stride - width) * pixelsize) / GL_UNPACK_ALIGNMENT); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This situation doesn't happen often, but some h/w have a limitation 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for their framebuffer (eg: must be multiple of 8 pixels), and 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we need to take that into account when using these buffers as 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * textures. 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This should never be a problem with POT textures 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 5461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian int unpack = __builtin_ctz(t.stride * bytesPerPixel(t.format)); 5471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian unpack = 1 << ((unpack > 3) ? 3 : unpack); 5481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glPixelStorei(GL_UNPACK_ALIGNMENT, unpack); 5491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * round to POT if needed 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5536950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (!(mFlags & DisplayHardware::NPOT_EXTENSION)) { 5546950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->NPOTAdjust = true; 5556950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5576950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (texture->NPOTAdjust) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // find the smallest power-of-two that will accommodate our surface 5596950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->potWidth = 1 << (31 - clz(t.width)); 5606950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->potHeight = 1 << (31 - clz(t.height)); 5616950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (texture->potWidth < t.width) texture->potWidth <<= 1; 5626950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (texture->potHeight < t.height) texture->potHeight <<= 1; 5636950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->wScale = float(t.width) / texture->potWidth; 5646950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->hScale = float(t.height) / texture->potHeight; 5656950e428feaccc8164b989ef64e771a99948797aMathias Agopian } else { 5666950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->potWidth = t.width; 5676950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->potHeight = t.height; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5696950e428feaccc8164b989ef64e771a99948797aMathias Agopian 5701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian Rect bounds(dirty.bounds()); 5711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GLvoid* data = 0; 5726950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (texture->width != t.width || texture->height != t.height) { 5736950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->width = t.width; 5746950e428feaccc8164b989ef64e771a99948797aMathias Agopian texture->height = t.height; 5751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 5766950e428feaccc8164b989ef64e771a99948797aMathias Agopian // texture size changed, we need to create a new one 5776950e428feaccc8164b989ef64e771a99948797aMathias Agopian bounds.set(Rect(t.width, t.height)); 5786950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (t.width == texture->potWidth && 5796950e428feaccc8164b989ef64e771a99948797aMathias Agopian t.height == texture->potHeight) { 5806950e428feaccc8164b989ef64e771a99948797aMathias Agopian // we can do it one pass 5816950e428feaccc8164b989ef64e771a99948797aMathias Agopian data = t.data; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5836950e428feaccc8164b989ef64e771a99948797aMathias Agopian 5848f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian if (t.format == HAL_PIXEL_FORMAT_RGB_565) { 5851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5866950e428feaccc8164b989ef64e771a99948797aMathias Agopian GL_RGB, texture->potWidth, texture->potHeight, 0, 5871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); 5888f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { 5891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5906950e428feaccc8164b989ef64e771a99948797aMathias Agopian GL_RGBA, texture->potWidth, texture->potHeight, 0, 5911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data); 5928f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || 5938f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian t.format == HAL_PIXEL_FORMAT_RGBX_8888) { 5941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 5956950e428feaccc8164b989ef64e771a99948797aMathias Agopian GL_RGBA, texture->potWidth, texture->potHeight, 0, 5961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_RGBA, GL_UNSIGNED_BYTE, data); 5978f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } else if (isSupportedYuvFormat(t.format)) { 5981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian // just show the Y plane of YUV buffers 5991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexImage2D(GL_TEXTURE_2D, 0, 6006950e428feaccc8164b989ef64e771a99948797aMathias Agopian GL_LUMINANCE, texture->potWidth, texture->potHeight, 0, 6011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_LUMINANCE, GL_UNSIGNED_BYTE, data); 6021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } else { 6031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian // oops, we don't handle this format! 6041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian LOGE("layer %p, texture=%d, using format %d, which is not " 6056950e428feaccc8164b989ef64e771a99948797aMathias Agopian "supported by the GL", this, texture->name, t.format); 6061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 6071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 6086950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (!data) { 6098f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian if (t.format == HAL_PIXEL_FORMAT_RGB_565) { 6101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 6111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 0, bounds.top, t.width, bounds.height(), 6121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 6131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian t.data + bounds.top*t.stride*2); 6148f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { 6151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 6161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 0, bounds.top, t.width, bounds.height(), 6171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 6181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian t.data + bounds.top*t.stride*2); 6198f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || 6208f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian t.format == HAL_PIXEL_FORMAT_RGBX_8888) { 6211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 6221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 0, bounds.top, t.width, bounds.height(), 6231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_RGBA, GL_UNSIGNED_BYTE, 6241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian t.data + bounds.top*t.stride*4); 6258f2423e8f394ae0666f1b61f83df4c0c7a4782d9Mathias Agopian } else if (isSupportedYuvFormat(t.format)) { 6261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian // just show the Y plane of YUV buffers 6271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian glTexSubImage2D(GL_TEXTURE_2D, 0, 6281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 0, bounds.top, t.width, bounds.height(), 6291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian GL_LUMINANCE, GL_UNSIGNED_BYTE, 6301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian t.data + bounds.top*t.stride); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopianstatus_t LayerBase::initializeEglImage( 6369042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian const sp<GraphicBuffer>& buffer, Texture* texture) 6379042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian{ 6389042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian status_t err = NO_ERROR; 6399042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6409042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // we need to recreate the texture 6419042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay()); 6429042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6439042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // free the previous image 6449042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (texture->image != EGL_NO_IMAGE_KHR) { 6459042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian eglDestroyImageKHR(dpy, texture->image); 6469042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian texture->image = EGL_NO_IMAGE_KHR; 6479042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 6489042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6499042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // construct an EGL_NATIVE_BUFFER_ANDROID 6509042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian android_native_buffer_t* clientBuf = buffer->getNativeBuffer(); 6519042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6529042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // create the new EGLImageKHR 6539042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian const EGLint attrs[] = { 6549042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, 6559042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian EGL_NONE, EGL_NONE 6569042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian }; 6579042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian texture->image = eglCreateImageKHR( 6589042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, 6599042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian (EGLClientBuffer)clientBuf, attrs); 6609042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6619042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (texture->image != EGL_NO_IMAGE_KHR) { 6629042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian glBindTexture(GL_TEXTURE_2D, texture->name); 6639042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, 6649042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian (GLeglImageOES)texture->image); 6659042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian GLint error = glGetError(); 6669042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (UNLIKELY(error != GL_NO_ERROR)) { 6679042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) " 6689042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian "failed err=0x%04x", 6699042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian this, texture->image, error); 6709042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = INVALID_OPERATION; 6719042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } else { 6729042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian // Everything went okay! 6739042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian texture->NPOTAdjust = false; 6749042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian texture->dirty = false; 6759042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian texture->width = clientBuf->width; 6769042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian texture->height = clientBuf->height; 6779042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 6789042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } else { 6791d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian LOGE("layer=%p, eglCreateImageKHR() failed. err=0x%4x", 6801d211f8ee0b422a3a741c3f88246c7c72ce483b0Mathias Agopian this, eglGetError()); 6819042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian err = INVALID_OPERATION; 6829042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian } 6839042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian return err; 6849042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian} 6859042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6869042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689c6603951d45fc9b0d1776fec9444b6f31af92840Mathias Agopianint32_t LayerBaseClient::sIdentity = 0; 690c6603951d45fc9b0d1776fec9444b6f31af92840Mathias Agopian 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display, 6926edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian const sp<Client>& client, int32_t i) 693015b59756eecdbec46f9aeda620ad0de1c8c9a23Mathias Agopian : LayerBase(flinger, display), lcblk(NULL), client(client), mIndex(i), 69485b8d12207c12531d736c7ec836f10d1e6f448e4Mathias Agopian mIdentity(uint32_t(android_atomic_inc(&sIdentity))) 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 696248b5bd51e325107f8119b564db6a06ac51c232aMathias Agopian lcblk = new SharedBufferServer( 697248b5bd51e325107f8119b564db6a06ac51c232aMathias Agopian client->ctrlblk, i, NUM_BUFFERS, 698248b5bd51e325107f8119b564db6a06ac51c232aMathias Agopian mIdentity); 6991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianvoid LayerBaseClient::onFirstRef() 7021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 7036edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian sp<Client> client(this->client.promote()); 7046edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian if (client != 0) { 7051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian client->bindLayer(this, mIndex); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLayerBaseClient::~LayerBaseClient() 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7116edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian sp<Client> client(this->client.promote()); 7126edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian if (client != 0) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project client->free(mIndex); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 715248b5bd51e325107f8119b564db6a06ac51c232aMathias Agopian delete lcblk; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7186edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopianint32_t LayerBaseClient::serverIndex() const 7196edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian{ 7206edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian sp<Client> client(this->client.promote()); 7216edf5af578c1ab1fcd44b7c08ca371456e4b7430Mathias Agopian if (client != 0) { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (client->cid<<16)|mIndex; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0xFFFF0000 | mIndex; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface() 7281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 7291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<Surface> s; 7301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian Mutex::Autolock _l(mLock); 7311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian s = mClientSurface.promote(); 7321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian if (s == 0) { 7331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian s = createSurface(); 7341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian mClientSurface = s; 7351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 7361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return s; 7371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 7381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 7391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const 7401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 7416cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian return new Surface(mFlinger, clientIndex(), mIdentity, 7421473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const_cast<LayerBaseClient *>(this)); 7431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 7441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 7450c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian// called with SurfaceFlinger::mStateLock as soon as the layer is entered 7460c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian// in the purgatory list 7470c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopianvoid LayerBaseClient::onRemoved() 7480c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian{ 7490c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian // wake up the condition 7500c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian lcblk->setStatus(NO_INIT); 7510c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian} 7520c4cec7e4df87181486d280c98fba9c0f4774c37Mathias Agopian 7531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// --------------------------------------------------------------------------- 7541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 7556cf0db228ca275dfcda57d79c55e5fa306809632Mathias AgopianLayerBaseClient::Surface::Surface( 7566cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian const sp<SurfaceFlinger>& flinger, 7576cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian SurfaceID id, int identity, 7581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const sp<LayerBaseClient>& owner) 7596cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian : mFlinger(flinger), mToken(id), mIdentity(identity), mOwner(owner) 7606cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 7611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 7621473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 7636cf0db228ca275dfcda57d79c55e5fa306809632Mathias AgopianLayerBaseClient::Surface::~Surface() 7646cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian{ 7656cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian /* 7666cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian * This is a good place to clean-up all client resources 7676cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian */ 7686cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian 7696cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian // destroy client resources 7706cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian sp<LayerBaseClient> layer = getOwner(); 7716cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian if (layer != 0) { 7726cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian mFlinger->destroySurface(layer); 7736cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian } 7741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 7751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 7761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const { 7771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian sp<LayerBaseClient> owner(mOwner.promote()); 7781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return owner; 7791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 7801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 7811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact( 782151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 7831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 7841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian switch (code) { 7851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian case REGISTER_BUFFERS: 7861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian case UNREGISTER_BUFFERS: 7871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian case CREATE_OVERLAY: 7881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian { 789151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) { 790151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian IPCThreadState* ipc = IPCThreadState::self(); 791151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian const int pid = ipc->getCallingPid(); 792151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian const int uid = ipc->getCallingUid(); 793151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian LOGE("Permission Denial: " 794151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); 795151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian return PERMISSION_DENIED; 7961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 7971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 7981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 7991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return BnSurface::onTransact(code, data, reply, flags); 8001473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 8011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 8026950e428feaccc8164b989ef64e771a99948797aMathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int index, int usage) 8031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 8041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return NULL; 8051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 8061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 8071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers( 8081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian const ISurface::BufferHeap& buffers) 8091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 8101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return INVALID_OPERATION; 8111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 8121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 8131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset) 8141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 8151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 8161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 8171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers() 8181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 8191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian} 8201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 8211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay( 822e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) 8231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{ 8241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return NULL; 8251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 830