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