Surface.h revision aca4e2287939b4ce3d9e9aced64c5c9641333503
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
179cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#ifndef ANDROID_SF_SURFACE_H
189cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#define ANDROID_SF_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
23aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis#include <utils/KeyedVector.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h>
297189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian#include <ui/egl/android_natives.h>
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
319cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurface.h>
327e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h>
339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
34e4e8cf1f19002be418aad1b89fa6bb8aeabf9f65Mathias Agopian#define ANDROID_VIEW_SURFACE_JNI_ID    "mNativeSurface"
35e4e8cf1f19002be418aad1b89fa6bb8aeabf9f65Mathias Agopian
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopianclass GraphicBuffer;
413330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass GraphicBufferMapper;
42e186431c33fa332b585e37f6b5ef5efd39b359cfAndreas Huberclass IOMX;
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Rect;
440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianclass Surface;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass SurfaceComposerClient;
46cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopianclass SharedClient;
47cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopianclass SharedBufferClient;
48d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianclass SurfaceClient;
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianclass SurfaceControl : public RefBase
5362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
5462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianpublic:
5562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    static bool isValid(const sp<SurfaceControl>& surface) {
5601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return (surface != 0) && surface->isValid();
5762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    }
5801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    bool isValid() {
5901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return mToken>=0 && mClient!=0;
6001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    }
6101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static bool isSameSurface(
6201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
6362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t    getFlags() const { return mFlags; }
6562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t    getIdentity() const { return mIdentity; }
6662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // release surface data from java
6862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    void        clear();
6962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
7062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setLayer(int32_t layer);
7162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setPosition(int32_t x, int32_t y);
7262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setSize(uint32_t w, uint32_t h);
7362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    hide();
7462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    show(int32_t layer = -1);
7562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    freeze();
7662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    unfreeze();
7762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setFlags(uint32_t flags, uint32_t mask);
7862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setTransparentRegionHint(const Region& transparent);
7962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setAlpha(float alpha=1.0f);
8062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
8162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setFreezeTint(uint32_t tint);
8262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
8301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static status_t writeSurfaceToParcel(
8401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceControl>& control, Parcel* parcel);
8501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<Surface> getSurface() const;
8701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianprivate:
8901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    // can't be copied
9001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl& operator = (SurfaceControl& rhs);
9101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl(const SurfaceControl& rhs);
9201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
9301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
9462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class SurfaceComposerClient;
9562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
9662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // camera and camcorder need access to the ISurface binder interface for preview
9762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Camera;
9862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class MediaRecorder;
9962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // mediaplayer needs access to ISurface for display
10062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class MediaPlayer;
10101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    // for testing
10262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Test;
10362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    const sp<ISurface>& getISurface() const { return mSurface; }
10462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
10562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
10662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Surface;
10701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
10801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl(
10901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceComposerClient>& client,
11062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian            const sp<ISurface>& surface,
1117e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian            const ISurfaceComposerClient::surface_data_t& data,
11218d8446fe1596cd50561777e1d1a8c7b39c689f6Mathias Agopian            uint32_t w, uint32_t h, PixelFormat format, uint32_t flags);
11362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
11462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    ~SurfaceControl();
11501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
116963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t validate() const;
11762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    void destroy();
11862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
11962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    sp<SurfaceComposerClient>   mClient;
12062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    sp<ISurface>                mSurface;
12162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    SurfaceID                   mToken;
12262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t                    mIdentity;
123cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    uint32_t                    mWidth;
124cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    uint32_t                    mHeight;
12562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    PixelFormat                 mFormat;
12662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t                    mFlags;
12762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    mutable Mutex               mLock;
12801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
12901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    mutable sp<Surface>         mSurfaceData;
13062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian};
13162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
13262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian// ---------------------------------------------------------------------------
13362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
134076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass Surface
1354b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    : public EGLNativeBase<ANativeWindow, Surface, RefBase>
136076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct SurfaceInfo {
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    w;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    h;
141076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    s;
142076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    usage;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void*       bits;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    reserved[2];
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    static status_t writeToParcel(
149579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian            const sp<Surface>& control, Parcel* parcel);
150579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
151aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static sp<Surface> readFromParcel(const Parcel& data);
15201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
15340b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    static bool isValid(const sp<Surface>& surface) {
15401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return (surface != 0) && surface->isValid();
15540b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    }
156ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
157ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    bool        isValid();
158ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t    getFlags() const    { return mFlags; }
159ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t    getIdentity() const { return mIdentity; }
16040b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian
161ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // the lock/unlock APIs must be used from the same thread
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    lock(SurfaceInfo* info, bool blocking = true);
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    lock(SurfaceInfo* info, Region* dirty, bool blocking = true);
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    unlockAndPost();
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1660926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // setSwapRectangle() is intended to be used by GL ES clients
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void        setSwapRectangle(const Rect& r);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
170b296533607232357597b255679db29470ab5925dMathias Agopianprivate:
171b296533607232357597b255679db29470ab5925dMathias Agopian    /*
172b296533607232357597b255679db29470ab5925dMathias Agopian     * Android frameworks friends
173b296533607232357597b255679db29470ab5925dMathias Agopian     * (eventually this should go away and be replaced by proper APIs)
174b296533607232357597b255679db29470ab5925dMathias Agopian     */
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // camera and camcorder need access to the ISurface binder interface for preview
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class Camera;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class MediaRecorder;
178b296533607232357597b255679db29470ab5925dMathias Agopian    // MediaPlayer needs access to ISurface for display
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    friend class MediaPlayer;
180e186431c33fa332b585e37f6b5ef5efd39b359cfAndreas Huber    friend class IOMX;
181ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // this is just to be able to write some unit tests
182ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    friend class Test;
183ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
184b296533607232357597b255679db29470ab5925dMathias Agopianprivate:
185b296533607232357597b255679db29470ab5925dMathias Agopian    friend class SurfaceComposerClient;
186b296533607232357597b255679db29470ab5925dMathias Agopian    friend class SurfaceControl;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188b296533607232357597b255679db29470ab5925dMathias Agopian    // can't be copied
189b296533607232357597b255679db29470ab5925dMathias Agopian    Surface& operator = (Surface& rhs);
190b296533607232357597b255679db29470ab5925dMathias Agopian    Surface(const Surface& rhs);
191076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
192b296533607232357597b255679db29470ab5925dMathias Agopian    Surface(const sp<SurfaceControl>& control);
193a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian    Surface(const Parcel& data, const sp<IBinder>& ref);
194b296533607232357597b255679db29470ab5925dMathias Agopian    ~Surface();
195b296533607232357597b255679db29470ab5925dMathias Agopian
196b296533607232357597b255679db29470ab5925dMathias Agopian
197b296533607232357597b255679db29470ab5925dMathias Agopian    /*
1984b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn     *  ANativeWindow hooks
199b296533607232357597b255679db29470ab5925dMathias Agopian     */
2004b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    static int setSwapInterval(ANativeWindow* window, int interval);
2014b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    static int dequeueBuffer(ANativeWindow* window, android_native_buffer_t** buffer);
2024b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    static int lockBuffer(ANativeWindow* window, android_native_buffer_t* buffer);
2034b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    static int queueBuffer(ANativeWindow* window, android_native_buffer_t* buffer);
2044b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    static int query(ANativeWindow* window, int what, int* value);
2054b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    static int perform(ANativeWindow* window, int operation, ...);
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int dequeueBuffer(android_native_buffer_t** buffer);
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int lockBuffer(android_native_buffer_t* buffer);
209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int queueBuffer(android_native_buffer_t* buffer);
210cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    int query(int what, int* value);
2115221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    int perform(int operation, va_list args);
2120926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
21355fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian    void dispatch_setUsage(va_list args);
21455fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian    int  dispatch_connect(va_list args);
21555fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian    int  dispatch_disconnect(va_list args);
216cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int  dispatch_crop(va_list args);
217f10d7fde03218c17251416a34d7b726a43ec528aMathias Agopian    int  dispatch_set_buffer_count(va_list args);
218a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    int  dispatch_set_buffers_geometry(va_list args);
219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
220ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    void setUsage(uint32_t reqUsage);
22155fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian    int  connect(int api);
22255fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian    int  disconnect(int api);
223cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int  crop(Rect const* rect);
224b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    int  setBufferCount(int bufferCount);
225a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    int  setBuffersGeometry(int w, int h, int format);
22655fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian
227b296533607232357597b255679db29470ab5925dMathias Agopian    /*
228b296533607232357597b255679db29470ab5925dMathias Agopian     *  private stuff...
229b296533607232357597b255679db29470ab5925dMathias Agopian     */
230b296533607232357597b255679db29470ab5925dMathias Agopian    void init();
231b296533607232357597b255679db29470ab5925dMathias Agopian    status_t validate() const;
232b296533607232357597b255679db29470ab5925dMathias Agopian    sp<ISurface> getISurface() const;
233b296533607232357597b255679db29470ab5925dMathias Agopian
234b296533607232357597b255679db29470ab5925dMathias Agopian    inline const GraphicBufferMapper& getBufferMapper() const { return mBufferMapper; }
235b296533607232357597b255679db29470ab5925dMathias Agopian    inline GraphicBufferMapper& getBufferMapper() { return mBufferMapper; }
236b296533607232357597b255679db29470ab5925dMathias Agopian
237a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    status_t getBufferLocked(int index,
238a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian            uint32_t w, uint32_t h, uint32_t format, uint32_t usage);
239b296533607232357597b255679db29470ab5925dMathias Agopian    int getBufferIndex(const sp<GraphicBuffer>& buffer) const;
240b296533607232357597b255679db29470ab5925dMathias Agopian
241a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    int getConnectedApi() const;
242ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
243a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    bool needNewBuffer(int bufIdx,
244a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian            uint32_t *pWidth, uint32_t *pHeight,
245a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian            uint32_t *pFormat, uint32_t *pUsage) const;
246a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
247aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static void cleanCachedSurfaces();
248aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis
249a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    class BufferInfo {
250a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t mWidth;
251a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t mHeight;
252a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t mFormat;
253a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t mUsage;
254a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        mutable uint32_t mDirty;
255a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        enum {
256a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian            GEOMETRY = 0x01
257a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        };
258a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    public:
259a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        BufferInfo();
260a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        void set(uint32_t w, uint32_t h, uint32_t format);
261a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        void set(uint32_t usage);
262a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        void get(uint32_t *pWidth, uint32_t *pHeight,
263a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian                uint32_t *pFormat, uint32_t *pUsage) const;
264a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        bool validateBuffer(const sp<GraphicBuffer>& buffer) const;
265a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    };
266a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
267ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // constants
268b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    GraphicBufferMapper&        mBufferMapper;
269b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    SurfaceClient&              mClient;
270b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    SharedBufferClient*         mSharedBufferClient;
271b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    status_t                    mInitCheck;
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<ISurface>                mSurface;
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t                    mIdentity;
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PixelFormat                 mFormat;
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t                    mFlags;
276ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
277ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // protected by mSurfaceLock
278ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    Rect                        mSwapRectangle;
27955fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian    int                         mConnected;
280cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    Rect                        mNextBufferCrop;
281a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    BufferInfo                  mBufferInfo;
282ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
283ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // protected by mSurfaceLock. These are also used from lock/unlock
284ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // but in that case, they must be called form the same thread.
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable Region              mDirtyRegion;
286ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
287ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // must be used from the lock/unlock thread
2883330b203039dea366d4981db1408a460134b2d2cMathias Agopian    sp<GraphicBuffer>           mLockedBuffer;
2893330b203039dea366d4981db1408a460134b2d2cMathias Agopian    sp<GraphicBuffer>           mPostedBuffer;
290ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    mutable Region              mOldDirtyRegion;
291245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian    bool                        mReserved;
292ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
293a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    // only used from dequeueBuffer()
294a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    Vector< sp<GraphicBuffer> > mBuffers;
295a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
296ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // query() must be called from dequeueBuffer() thread
297ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t                    mWidth;
298ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t                    mHeight;
299ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
300ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // Inherently thread-safe
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable Mutex               mSurfaceLock;
302cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    mutable Mutex               mApiLock;
303aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis
304aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    // A cache of Surface objects that have been deserialized into this process.
305aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static Mutex sCachedSurfacesLock;
306aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static DefaultKeyedVector<wp<IBinder>, wp<Surface> > sCachedSurfaces;
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3119cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#endif // ANDROID_SF_SURFACE_H
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
313