Surface.h revision ba5972ffdc7179dd9a387f22032eb18666d97917
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#ifndef ANDROID_UI_SURFACE_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_UI_SURFACE_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/ISurface.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/ISurfaceFlingerClient.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
317189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian#include <ui/egl/android_natives.h>
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianclass BufferMapper;
38e186431c33fa332b585e37f6b5ef5efd39b359cfAndreas Huberclass IOMX;
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Rect;
400926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianclass Surface;
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass SurfaceComposerClient;
42076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct per_client_cblk_t;
43076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct layer_cblk_t;
44076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
45076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianclass SurfaceControl : public RefBase
4862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
4962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianpublic:
5062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    static bool isValid(const sp<SurfaceControl>& surface) {
5101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return (surface != 0) && surface->isValid();
5262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    }
5301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    bool isValid() {
5401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return mToken>=0 && mClient!=0;
5501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    }
5601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static bool isSameSurface(
5701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
5862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
5962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    SurfaceID   ID() const      { return mToken; }
6062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t    getFlags() const { return mFlags; }
6162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t    getIdentity() const { return mIdentity; }
6262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // release surface data from java
6462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    void        clear();
6562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setLayer(int32_t layer);
6762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setPosition(int32_t x, int32_t y);
6862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setSize(uint32_t w, uint32_t h);
6962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    hide();
7062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    show(int32_t layer = -1);
7162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    freeze();
7262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    unfreeze();
7362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setFlags(uint32_t flags, uint32_t mask);
7462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setTransparentRegionHint(const Region& transparent);
7562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setAlpha(float alpha=1.0f);
7662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
7762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setFreezeTint(uint32_t tint);
7862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
7901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static status_t writeSurfaceToParcel(
8001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceControl>& control, Parcel* parcel);
8101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<Surface> getSurface() const;
8301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianprivate:
8501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    // can't be copied
8601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl& operator = (SurfaceControl& rhs);
8701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl(const SurfaceControl& rhs);
8801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
9062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class SurfaceComposerClient;
9162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
9262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // camera and camcorder need access to the ISurface binder interface for preview
9362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Camera;
9462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class MediaRecorder;
9562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // mediaplayer needs access to ISurface for display
9662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class MediaPlayer;
9701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    // for testing
9862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Test;
9962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    const sp<ISurface>& getISurface() const { return mSurface; }
10062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
10162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
10262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Surface;
10301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
10401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl(
10501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceComposerClient>& client,
10662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian            const sp<ISurface>& surface,
10762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian            const ISurfaceFlingerClient::surface_data_t& data,
10818d8446fe1596cd50561777e1d1a8c7b39c689f6Mathias Agopian            uint32_t w, uint32_t h, PixelFormat format, uint32_t flags);
10962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
11062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    ~SurfaceControl();
11101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
11262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t validate(per_client_cblk_t const* cblk) const;
11362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    void destroy();
11462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
11562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    sp<SurfaceComposerClient>   mClient;
11662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    sp<ISurface>                mSurface;
11762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    SurfaceID                   mToken;
11862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t                    mIdentity;
119cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    uint32_t                    mWidth;
120cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    uint32_t                    mHeight;
12162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    PixelFormat                 mFormat;
12262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t                    mFlags;
12362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    mutable Mutex               mLock;
12401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
12501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    mutable sp<Surface>         mSurfaceData;
12662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian};
12762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
12862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian// ---------------------------------------------------------------------------
12962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass Surface
131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    : public EGLNativeBase<android_native_window_t, Surface, RefBase>
132076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct SurfaceInfo {
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    w;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    h;
137076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    s;
138076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    usage;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void*       bits;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    reserved[2];
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
14401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    Surface(const Parcel& data);
14501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
14640b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    static bool isValid(const sp<Surface>& surface) {
14701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return (surface != 0) && surface->isValid();
14840b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    }
149ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
15001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static bool isSameSurface(
15101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<Surface>& lhs, const sp<Surface>& rhs);
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
153ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    bool        isValid();
154ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    SurfaceID   ID() const          { return mToken; }
155ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t    getFlags() const    { return mFlags; }
156ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t    getIdentity() const { return mIdentity; }
15740b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian
158ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // the lock/unlock APIs must be used from the same thread
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    lock(SurfaceInfo* info, bool blocking = true);
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    lock(SurfaceInfo* info, Region* dirty, bool blocking = true);
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    unlockAndPost();
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // setSwapRectangle() is intended to be used by GL ES clients
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void        setSwapRectangle(const Rect& r);
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
16701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    // can't be copied
16801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    Surface& operator = (Surface& rhs);
16901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    Surface(const Surface& rhs);
17001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
17101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    Surface(const sp<SurfaceControl>& control);
17201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    void init();
17301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian     ~Surface();
17401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class SurfaceComposerClient;
17601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    friend class SurfaceControl;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
178ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // camera and camcorder need access to the ISurface binder interface for preview
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class Camera;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class MediaRecorder;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // mediaplayer needs access to ISurface for display
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class MediaPlayer;
184e186431c33fa332b585e37f6b5ef5efd39b359cfAndreas Huber    friend class IOMX;
185ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // this is just to be able to write some unit tests
186ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    friend class Test;
187ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
188ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    sp<SurfaceComposerClient> getClient() const;
189ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    sp<ISurface> getISurface() const;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1915221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    status_t getBufferLocked(int index, int usage);
192076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
193076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian           status_t validate(per_client_cblk_t const* cblk) const;
194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static void _send_dirty_region(layer_cblk_t* lcblk, const Region& dirty);
195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1960926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    inline const BufferMapper& getBufferMapper() const { return mBufferMapper; }
1970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    inline BufferMapper& getBufferMapper() { return mBufferMapper; }
198076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
199076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static int setSwapInterval(android_native_window_t* window, int interval);
200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static int dequeueBuffer(android_native_window_t* window, android_native_buffer_t** buffer);
201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static int lockBuffer(android_native_window_t* window, android_native_buffer_t* buffer);
202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static int queueBuffer(android_native_window_t* window, android_native_buffer_t* buffer);
203cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    static int query(android_native_window_t* window, int what, int* value);
2045221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    static int perform(android_native_window_t* window, int operation, ...);
205076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int dequeueBuffer(android_native_buffer_t** buffer);
207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int lockBuffer(android_native_buffer_t* buffer);
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int queueBuffer(android_native_buffer_t* buffer);
209cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    int query(int what, int* value);
2105221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    int perform(int operation, va_list args);
2110926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2120926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t dequeueBuffer(sp<SurfaceBuffer>* buffer);
2130926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t lockBuffer(const sp<SurfaceBuffer>& buffer);
2140926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t queueBuffer(const sp<SurfaceBuffer>& buffer);
2150926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
217ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    void setUsage(uint32_t reqUsage);
218ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
219ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // constants
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<SurfaceComposerClient>   mClient;
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<ISurface>                mSurface;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SurfaceID                   mToken;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t                    mIdentity;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PixelFormat                 mFormat;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t                    mFlags;
226ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    BufferMapper&               mBufferMapper;
227ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
228ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // protected by mSurfaceLock
229ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    Rect                        mSwapRectangle;
230ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t                    mUsage;
231ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    bool                        mUsageChanged;
232ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
233ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // protected by mSurfaceLock. These are also used from lock/unlock
234ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // but in that case, they must be called form the same thread.
235ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    sp<SurfaceBuffer>           mBuffers[2];
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable Region              mDirtyRegion;
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable uint8_t             mBackbufferIndex;
238ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
239ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // must be used from the lock/unlock thread
240ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    sp<SurfaceBuffer>           mLockedBuffer;
241ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    mutable Region              mOldDirtyRegion;
242ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
243ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // query() must be called from dequeueBuffer() thread
244ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t                    mWidth;
245ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t                    mHeight;
246ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
247ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // Inherently thread-safe
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable Mutex               mSurfaceLock;
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_UI_SURFACE_H
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
255