SurfaceTexture.h revision 8ba32fade11abb73f3fd47ea0953c9528eb5b91f
18ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis/*
28ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Copyright (C) 2010 The Android Open Source Project
38ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *
48ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
58ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * you may not use this file except in compliance with the License.
68ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * You may obtain a copy of the License at
78ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *
88ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
98ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *
108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Unless required by applicable law or agreed to in writing, software
118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * See the License for the specific language governing permissions and
148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * limitations under the License.
158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis */
168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#ifndef ANDROID_GUI_SURFACETEXTURE_H
188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#define ANDROID_GUI_SURFACETEXTURE_H
198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <EGL/egl.h>
218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <EGL/eglext.h>
228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <GLES2/gl2.h>
238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <gui/ISurfaceTexture.h>
258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <ui/GraphicBuffer.h>
278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/threads.h>
298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#define ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID "mSurfaceTexture"
318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android {
338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ----------------------------------------------------------------------------
348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisclass SurfaceTexture : public BnSurfaceTexture {
368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic:
378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    enum { MIN_BUFFER_SLOTS = 3 };
388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    enum { NUM_BUFFER_SLOTS = 32 };
398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // tex indicates the name OpenGL texture to which images are to be streamed.
418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // This texture name cannot be changed once the SurfaceTexture is created.
428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    SurfaceTexture(GLuint tex);
438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual ~SurfaceTexture();
458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // setBufferCount updates the number of available buffer slots.  After
478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // calling this all buffer slots are both unallocated and owned by the
488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // SurfaceTexture object (i.e. they are not owned by the client).
498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual status_t setBufferCount(int bufferCount);
508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual sp<GraphicBuffer> requestBuffer(int buf, uint32_t w, uint32_t h,
528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            uint32_t format, uint32_t usage);
538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // dequeueBuffer gets the next buffer slot index for the client to use. If a
558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // buffer slot is available then that slot index is written to the location
568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // pointed to by the buf argument and a status of OK is returned.  If no
578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // slot is available then a status of -EBUSY is returned and buf is
588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // unmodified.
598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual status_t dequeueBuffer(int *buf);
608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual status_t queueBuffer(int buf);
628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual void cancelBuffer(int buf);
638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual status_t setCrop(const Rect& reg);
648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    virtual status_t setTransform(uint32_t transform);
658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // updateTexImage sets the image contents of the target texture to that of
678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // the most recently queued buffer.
688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    //
698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // This call may only be made while the OpenGL ES context to which the
708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // target texture belongs is bound to the calling thread.
718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    status_t updateTexImage();
728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisprivate:
748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for
768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // all slots.
778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    void freeAllBuffers();
788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // createImage creates a new EGLImage from a GraphicBuffer.
808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    EGLImageKHR createImage(EGLDisplay dpy,
818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            const sp<GraphicBuffer>& graphicBuffer);
828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    enum { INVALID_BUFFER_SLOT = -1 };
848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    struct BufferSlot {
868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // mGraphicBuffer points to the buffer allocated for this slot or is NULL
878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // if no buffer has been allocated.
888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        sp<GraphicBuffer> mGraphicBuffer;
898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // mEglImage is the EGLImage created from mGraphicBuffer.
918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        EGLImageKHR mEglImage;
928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // mEglDisplay is the EGLDisplay used to create mEglImage.
948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        EGLDisplay mEglDisplay;
958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // mOwnedByClient indicates whether the slot is currently accessible to a
978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // client and should not be used by the SurfaceTexture object. It gets
988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // set to true when dequeueBuffer returns the slot and is reset to false
998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        // when the client calls either queueBuffer or cancelBuffer on the slot.
1008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        bool mOwnedByClient;
1018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    };
1028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // mSlots is the array of buffer slots that must be mirrored on the client
1048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // side. This allows buffer ownership to be transferred between the client
1058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // and server without sending a GraphicBuffer over binder. The entire array
1068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // is initialized to NULL at construction time, and buffers are allocated
1078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // for a slot when requestBuffer is called with that slot's index.
1088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    BufferSlot mSlots[NUM_BUFFER_SLOTS];
1098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // mBufferCount is the number of buffer slots that the client and server
1118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // must maintain. It defaults to MIN_BUFFER_SLOTS and can be changed by
1128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // calling setBufferCount.
1138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int mBufferCount;
1148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // mCurrentTexture is the buffer slot index of the buffer that is currently
1168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // bound to the OpenGL texture. A value of INVALID_BUFFER_SLOT, indicating
1178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // that no buffer is currently bound to the texture.
1188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int mCurrentTexture;
1198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // mLastQueued is the buffer slot index of the most recently enqueued buffer.
1218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // At construction time it is initialized to INVALID_BUFFER_SLOT, and is
1228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // updated each time queueBuffer is called.
1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    int mLastQueued;
1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // mTexName is the name of the OpenGL texture to which streamed images will
1268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // be bound when updateTexImage is called. It is set at construction time
1278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // changed with a call to setTexName.
1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    const GLuint mTexName;
1298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // mMutex is the mutex used to prevent concurrent access to the member
1318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // variables of SurfaceTexture objects. It must be locked whenever the
1328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    // member variables are accessed.
1338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    Mutex mMutex;
1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis};
1358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ----------------------------------------------------------------------------
1378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android
1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#endif // ANDROID_GUI_SURFACETEXTURE_H
140