Surface.cpp revision e5d6eb81e29e0fb914ce8fdaae17190b0dbae1a1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "Surface"
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/stat.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian#include <utils/CallStack.h>
25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/Errors.h>
269cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h>
27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h>
289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
29a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IPCThreadState.h>
30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
31a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <gui/SurfaceTextureClient.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h>
343330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Rect.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurface.h>
389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h>
39a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <surfaceflinger/Surface.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/SurfaceComposerClient.h>
41076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian// ============================================================================
4562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian//  SurfaceControl
4662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian// ============================================================================
4762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
4801b766839e06c32540cef100e3a7710d12cf1eefMathias AgopianSurfaceControl::SurfaceControl(
4901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        const sp<SurfaceComposerClient>& client,
5062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian        const sp<ISurface>& surface,
51c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian        const ISurfaceComposerClient::surface_data_t& data)
5262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    : mClient(client), mSurface(surface),
53c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian      mToken(data.token), mIdentity(data.identity)
5462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
5562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
5618d8446fe1596cd50561777e1d1a8c7b39c689f6Mathias Agopian
5762185b7335e85211dc4d0e2003354eb3ea2e66efMathias AgopianSurfaceControl::~SurfaceControl()
5862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
5962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    destroy();
6062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
6162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianvoid SurfaceControl::destroy()
6362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
6418d8446fe1596cd50561777e1d1a8c7b39c689f6Mathias Agopian    if (isValid()) {
6562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian        mClient->destroySurface(mToken);
6662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    }
6762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // clear all references and trigger an IPC now, to make sure things
6962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // happen without delay, since these resources are quite heavy.
7062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    mClient.clear();
7162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    mSurface.clear();
7262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    IPCThreadState::self()->flushCommands();
7362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
7462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
7562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianvoid SurfaceControl::clear()
7662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
7762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // here, the window manager tells us explicitly that we should destroy
7862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // the surface's resource. Soon after this call, it will also release
7962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // its last reference (which will call the dtor); however, it is possible
8062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // that a client living in the same process still holds references which
8162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // would delay the call to the dtor -- that is why we need this explicit
8262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // "clear()" call.
8362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    destroy();
8462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
8562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
8601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopianbool SurfaceControl::isSameSurface(
8701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs)
8801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{
8901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    if (lhs == 0 || rhs == 0)
9001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return false;
9101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    return lhs->mSurface->asBinder() == rhs->mSurface->asBinder();
9201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian}
9301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
9462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setLayer(int32_t layer) {
95963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
9662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
97631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
9862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setLayer(mToken, layer);
9962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
10062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setPosition(int32_t x, int32_t y) {
101963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
10262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
103631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
10462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setPosition(mToken, x, y);
10562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
10662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setSize(uint32_t w, uint32_t h) {
107963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
10862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
109631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
11062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setSize(mToken, w, h);
11162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
11262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::hide() {
113963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
11462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
115631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
11662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->hide(mToken);
11762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
11862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::show(int32_t layer) {
119963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
12062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
121631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
12262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->show(mToken, layer);
12362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
12462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::freeze() {
125963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
12662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
127631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
12862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->freeze(mToken);
12962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
13062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::unfreeze() {
131963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
13262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
133631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
13462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->unfreeze(mToken);
13562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
13662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setFlags(uint32_t flags, uint32_t mask) {
137963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
13862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
139631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
14062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setFlags(mToken, flags, mask);
14162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
14262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setTransparentRegionHint(const Region& transparent) {
143963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
14462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
145631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
14662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setTransparentRegionHint(mToken, transparent);
14762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
14862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setAlpha(float alpha) {
149963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
15062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
151631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
15262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setAlpha(mToken, alpha);
15362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
15462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
155963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
15662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
157631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
15862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setMatrix(mToken, dsdx, dtdx, dsdy, dtdy);
15962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
16062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianstatus_t SurfaceControl::setFreezeTint(uint32_t tint) {
161963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t err = validate();
16262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (err < 0) return err;
163631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    const sp<SurfaceComposerClient>& client(mClient);
16462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return client->setFreezeTint(mToken, tint);
16562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
16662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
167963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopianstatus_t SurfaceControl::validate() const
16862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
16962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    if (mToken<0 || mClient==0) {
17062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian        LOGE("invalid token (%d, identity=%u) or client (%p)",
17162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian                mToken, mIdentity, mClient.get());
17262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian        return NO_INIT;
17362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    }
17462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    return NO_ERROR;
17562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}
17662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
17701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopianstatus_t SurfaceControl::writeSurfaceToParcel(
17801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        const sp<SurfaceControl>& control, Parcel* parcel)
17901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{
180579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    sp<ISurface> sur;
18101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    uint32_t identity = 0;
18201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    if (SurfaceControl::isValid(control)) {
18301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        sur      = control->mSurface;
184579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        identity = control->mIdentity;
18501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    }
186b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    parcel->writeStrongBinder(sur!=0 ? sur->asBinder() : NULL);
187bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    parcel->writeStrongBinder(NULL);  // NULL ISurfaceTexture in this case.
18801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    parcel->writeInt32(identity);
18901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    return NO_ERROR;
19001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian}
19101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
19201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<Surface> SurfaceControl::getSurface() const
19301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{
19401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    Mutex::Autolock _l(mLock);
19501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    if (mSurfaceData == 0) {
196bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        sp<SurfaceControl> surface_control(const_cast<SurfaceControl*>(this));
197bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        mSurfaceData = new Surface(surface_control);
19801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    }
19901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    return mSurfaceData;
20001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian}
20101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ============================================================================
203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian//  Surface
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ============================================================================
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
206b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian// ---------------------------------------------------------------------------
207b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
20801b766839e06c32540cef100e3a7710d12cf1eefMathias AgopianSurface::Surface(const sp<SurfaceControl>& surface)
2098f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    : SurfaceTextureClient(),
210b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian      mSurface(surface->mSurface),
211c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian      mIdentity(surface->mIdentity)
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
213bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    sp<ISurfaceTexture> st;
214bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    if (mSurface != NULL) {
215bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        st = mSurface->getSurfaceTexture();
216bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    }
217bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    init(st);
21801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian}
21962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
220a0c30e924193da57723fd53b710ce6be24fb26f5Mathias AgopianSurface::Surface(const Parcel& parcel, const sp<IBinder>& ref)
221c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian    : SurfaceTextureClient()
22201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{
223bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    mSurface = interface_cast<ISurface>(ref);
224bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    sp<IBinder> st_binder(parcel.readStrongBinder());
225bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    sp<ISurfaceTexture> st;
226bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    if (st_binder != NULL) {
227bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        st = interface_cast<ISurfaceTexture>(st_binder);
228bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    } else if (mSurface != NULL) {
229bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        st = mSurface->getSurfaceTexture();
230bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    }
231bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg
23201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    mIdentity   = parcel.readInt32();
233bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    init(st);
234bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg}
235bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg
236bd050ab2af1421d527d1a80ce59dd8d9940a838cTed BonkenburgSurface::Surface(const sp<ISurfaceTexture>& st)
237bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    : SurfaceTextureClient(),
238bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg      mSurface(NULL),
239bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg      mIdentity(0)
240bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg{
241bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    init(st);
24201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian}
24301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
244579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopianstatus_t Surface::writeToParcel(
245579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        const sp<Surface>& surface, Parcel* parcel)
246579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian{
247579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    sp<ISurface> sur;
248bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    sp<ISurfaceTexture> st;
249579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    uint32_t identity = 0;
250579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    if (Surface::isValid(surface)) {
251579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        sur      = surface->mSurface;
252bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        st       = surface->getISurfaceTexture();
253579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        identity = surface->mIdentity;
254bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    } else if (surface != 0 &&
255bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg            (surface->mSurface != NULL ||
256bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg             surface->getISurfaceTexture() != NULL)) {
257bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        LOGE("Parceling invalid surface with non-NULL ISurface/ISurfaceTexture as NULL: "
258bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg             "mSurface = %p, surfaceTexture = %p, mIdentity = %d, ",
259bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg             surface->mSurface.get(), surface->getISurfaceTexture().get(),
260bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg             surface->mIdentity);
261579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    }
262bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg
263bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    parcel->writeStrongBinder(sur != NULL ? sur->asBinder() : NULL);
264bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    parcel->writeStrongBinder(st != NULL ? st->asBinder() : NULL);
265579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    parcel->writeInt32(identity);
266579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    return NO_ERROR;
267579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
268579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian}
269579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
270aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie GennisMutex Surface::sCachedSurfacesLock;
271455d18d4c26a823bff62ca14771986cca52d3462Mathias AgopianDefaultKeyedVector<wp<IBinder>, wp<Surface> > Surface::sCachedSurfaces;
272aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis
273aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennissp<Surface> Surface::readFromParcel(const Parcel& data) {
274aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    Mutex::Autolock _l(sCachedSurfacesLock);
275a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian    sp<IBinder> binder(data.readStrongBinder());
276aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    sp<Surface> surface = sCachedSurfaces.valueFor(binder).promote();
277aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    if (surface == 0) {
278aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis       surface = new Surface(data, binder);
279aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis       sCachedSurfaces.add(binder, surface);
280e5d6eb81e29e0fb914ce8fdaae17190b0dbae1a1Ted Bonkenburg    } else {
281e5d6eb81e29e0fb914ce8fdaae17190b0dbae1a1Ted Bonkenburg        // The Surface was found in the cache, but we still should clear any
282e5d6eb81e29e0fb914ce8fdaae17190b0dbae1a1Ted Bonkenburg        // remaining data from the parcel.
283e5d6eb81e29e0fb914ce8fdaae17190b0dbae1a1Ted Bonkenburg        data.readStrongBinder();  // ISurfaceTexture
284e5d6eb81e29e0fb914ce8fdaae17190b0dbae1a1Ted Bonkenburg        data.readInt32();         // identity
285aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    }
286bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    if (surface->mSurface == NULL && surface->getISurfaceTexture() == NULL) {
287bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg        surface = 0;
288aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    }
289455d18d4c26a823bff62ca14771986cca52d3462Mathias Agopian    cleanCachedSurfacesLocked();
290aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    return surface;
291aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis}
292aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis
293aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis// Remove the stale entries from the surface cache.  This should only be called
294aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis// with sCachedSurfacesLock held.
295455d18d4c26a823bff62ca14771986cca52d3462Mathias Agopianvoid Surface::cleanCachedSurfacesLocked() {
296aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    for (int i = sCachedSurfaces.size()-1; i >= 0; --i) {
297aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis        wp<Surface> s(sCachedSurfaces.valueAt(i));
298aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis        if (s == 0 || s.promote() == 0) {
299aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis            sCachedSurfaces.removeItemsAt(i);
300aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis        }
301a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian    }
302a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian}
303a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian
304bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburgvoid Surface::init(const sp<ISurfaceTexture>& surfaceTexture)
30501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{
306bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    if (mSurface != NULL || surfaceTexture != NULL) {
307a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        LOGE_IF(surfaceTexture==0, "got a NULL ISurfaceTexture from ISurface");
308a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (surfaceTexture != NULL) {
3098f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian            setISurfaceTexture(surfaceTexture);
3108f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian            setUsage(GraphicBuffer::USAGE_HW_RENDER);
311a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        }
312a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
313a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        DisplayInfo dinfo;
314a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        SurfaceComposerClient::getDisplayInfo(0, &dinfo);
315a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const_cast<float&>(ANativeWindow::xdpi) = dinfo.xdpi;
316a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const_cast<float&>(ANativeWindow::ydpi) = dinfo.ydpi;
317a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const_cast<uint32_t&>(ANativeWindow::flags) = 0;
318631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian    }
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32140b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias AgopianSurface::~Surface()
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
32340b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    // clear all references and trigger an IPC now, to make sure things
32440b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    // happen without delay, since these resources are quite heavy.
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurface.clear();
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    IPCThreadState::self()->flushCommands();
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
329ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopianbool Surface::isValid() {
330c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian    return getISurfaceTexture() != NULL;
331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
3331e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbosp<ISurfaceTexture> Surface::getSurfaceTexture() {
334c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian    return getISurfaceTexture();
3351e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo}
3361e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo
33747d8730a2463f38a695ab95b533b0d9728f266a3Mathias Agopiansp<IBinder> Surface::asBinder() const {
33847d8730a2463f38a695ab95b533b0d9728f266a3Mathias Agopian    return mSurface!=0 ? mSurface->asBinder() : 0;
339631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian}
340631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian
341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ----------------------------------------------------------------------------
342076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
343a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianint Surface::query(int what, int* value) const {
344cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    switch (what) {
345a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
346a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        *value = 1;
347cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        return NO_ERROR;
348391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    case NATIVE_WINDOW_CONCRETE_TYPE:
349391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        *value = NATIVE_WINDOW_SURFACE;
350391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis        return NO_ERROR;
351391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    }
3528f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    return SurfaceTextureClient::query(what, value);
3531d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala}
3541d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala
355a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian// ----------------------------------------------------------------------------
356a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
3578f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopianstatus_t Surface::lock(SurfaceInfo* other, Region* dirtyIn) {
3588f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    ANativeWindow_Buffer outBuffer;
35955fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian
3608f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    ARect temp;
3618f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    ARect* inOutDirtyBounds = NULL;
3628f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    if (dirtyIn) {
3638f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        temp = dirtyIn->getBounds();
3648f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        inOutDirtyBounds = &temp;
365cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    }
3669014726d8954a003323d65ba639b2544f8ecea2eMathias Agopian
3678f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    status_t err = SurfaceTextureClient::lock(&outBuffer, inOutDirtyBounds);
368ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
369076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (err == NO_ERROR) {
3708f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        other->w = uint32_t(outBuffer.width);
3718f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        other->h = uint32_t(outBuffer.height);
3728f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        other->s = uint32_t(outBuffer.stride);
3738f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        other->usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN;
3748f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        other->format = uint32_t(outBuffer.format);
3758f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian        other->bits = outBuffer.bits;
376076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
377076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
379cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian
3808f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopianstatus_t Surface::unlockAndPost() {
3818f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    return SurfaceTextureClient::unlockAndPost();
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
384a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian// ----------------------------------------------------------------------------
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
386