SurfaceTexture.h revision 68c7794183a7dbfe3b20d4ce832f8eb79c2c619a
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> 299a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis#include <utils/Vector.h> 308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#define ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID "mSurfaceTexture" 328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 369a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennisclass IGraphicBufferAlloc; 3768c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopianclass String8; 389a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisclass SurfaceTexture : public BnSurfaceTexture { 408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 419d4d6c101d90d4a1d1ca9413cf3eb89d1f1898d6Jamie Gennis enum { MIN_UNDEQUEUED_BUFFERS = 2 }; 428072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian enum { 438072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian MIN_ASYNC_BUFFER_SLOTS = MIN_UNDEQUEUED_BUFFERS + 1, 448072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian MIN_SYNC_BUFFER_SLOTS = MIN_UNDEQUEUED_BUFFERS 458072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian }; 468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis enum { NUM_BUFFER_SLOTS = 32 }; 478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 48c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis struct FrameAvailableListener : public virtual RefBase { 49c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis virtual void onFrameAvailable() = 0; 50c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis }; 51c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // tex indicates the name OpenGL texture to which images are to be streamed. 538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // This texture name cannot be changed once the SurfaceTexture is created. 548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis SurfaceTexture(GLuint tex); 558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual ~SurfaceTexture(); 578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // setBufferCount updates the number of available buffer slots. After 598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // calling this all buffer slots are both unallocated and owned by the 608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // SurfaceTexture object (i.e. they are not owned by the client). 618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setBufferCount(int bufferCount); 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 63c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian virtual sp<GraphicBuffer> requestBuffer(int buf); 648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // dequeueBuffer gets the next buffer slot index for the client to use. If a 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // buffer slot is available then that slot index is written to the location 678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // pointed to by the buf argument and a status of OK is returned. If no 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // slot is available then a status of -EBUSY is returned and buf is 698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // unmodified. 70c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h, 71c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t format, uint32_t usage); 728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 731d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // queueBuffer returns a filled buffer to the SurfaceTexture. In addition, a 741d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // timestamp must be provided for the buffer. The timestamp is in 751d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // nanoseconds, and must be monotonically increasing. Its other semantics 761d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // (zero point, etc) are client-dependent and should be documented by the 771d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // client. 781d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala virtual status_t queueBuffer(int buf, int64_t timestamp); 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual void cancelBuffer(int buf); 808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setCrop(const Rect& reg); 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setTransform(uint32_t transform); 828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 83eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value); 84eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 858072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // setSynchronousMode set whether dequeueBuffer is synchronous or 868072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // asynchronous. In synchronous mode, dequeueBuffer blocks until 878072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // a buffer is available, the currently bound buffer can be dequeued and 888072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // queued buffers will be retired in order. 898072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // The default mode is asynchronous. 908072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian virtual status_t setSynchronousMode(bool enabled); 918072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // updateTexImage sets the image contents of the target texture to that of 938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // the most recently queued buffer. 948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // 958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // This call may only be made while the OpenGL ES context to which the 968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // target texture belongs is bound to the calling thread. 978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis status_t updateTexImage(); 988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 998072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // setBufferCountServer set the buffer count. If the client has requested 1008072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // a buffer count using setBufferCount, the server-buffer count will 1018072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // take effect once the client sets the count back to zero. 1028072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian status_t setBufferCountServer(int bufferCount); 1038072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 104f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // getTransformMatrix retrieves the 4x4 texture coordinate transform matrix 105f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // associated with the texture image set by the most recent call to 106f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // updateTexImage. 107f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 108f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // This transform matrix maps 2D homogeneous texture coordinates of the form 109f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // (s, t, 0, 1) with s and t in the inclusive range [0, 1] to the texture 110f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // coordinate that should be used to sample that location from the texture. 111f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // Sampling the texture outside of the range of this transform is undefined. 112f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 113f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // This transform is necessary to compensate for transforms that the stream 114f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // content producer may implicitly apply to the content. By forcing users of 115f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // a SurfaceTexture to apply this transform we avoid performing an extra 116f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // copy of the data that would be needed to hide the transform from the 117f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // user. 118f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 119f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // The matrix is stored in column-major order so that it may be passed 120f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // directly to OpenGL ES via the glLoadMatrixf or glUniformMatrix4fv 121f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // functions. 122f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis void getTransformMatrix(float mtx[16]); 123f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 1241d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // getTimestamp retrieves the timestamp associated with the texture image 1251d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // set by the most recent call to updateTexImage. 1261d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // 1271d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // The timestamp is in nanoseconds, and is monotonically increasing. Its 1281d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // other semantics (zero point, etc) are source-dependent and should be 1291d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // documented by the source. 1301d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t getTimestamp(); 1311d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 132c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // setFrameAvailableListener sets the listener object that will be notified 133c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // when a new frame becomes available. 134c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis void setFrameAvailableListener(const sp<FrameAvailableListener>& l); 135c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 1361b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // getAllocator retrieves the binder object that must be referenced as long 1371b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // as the GraphicBuffers dequeued from this SurfaceTexture are referenced. 1381b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // Holding this binder reference prevents SurfaceFlinger from freeing the 1391b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // buffers before the client is done with them. 1401b20cde313b5ef8acdace742328df867956d24cbJamie Gennis sp<IBinder> getAllocator(); 1411b20cde313b5ef8acdace742328df867956d24cbJamie Gennis 142a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // setDefaultBufferSize is used to set the size of buffers returned by 143a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // requestBuffers when a with and height of zero is requested. 144a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // A call to setDefaultBufferSize() may trigger requestBuffers() to 145a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // be called from the client. 146a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian status_t setDefaultBufferSize(uint32_t w, uint32_t h); 147a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 1487a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentBuffer returns the buffer associated with the current image. 1497a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian sp<GraphicBuffer> getCurrentBuffer() const; 1507a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1517a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentTextureTarget returns the texture target of the current 1527a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // texture as returned by updateTexImage(). 1537a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian GLenum getCurrentTextureTarget() const; 1547a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1557a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentCrop returns the cropping rectangle of the current buffer 1567a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian Rect getCurrentCrop() const; 1577a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1587a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentTransform returns the transform of the current buffer 1597a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian uint32_t getCurrentTransform() const; 1607a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 16168c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian // dump our state in a String 16268c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian void dump(String8& result) const; 16368c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian void dump(String8& result, const char* prefix, char* buffer, size_t SIZE) const; 16468c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian 1657a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopianprotected: 1668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for 1688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // all slots. 1698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis void freeAllBuffers(); 1707a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian static bool isExternalFormat(uint32_t format); 1717a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian static GLenum getTextureTarget(uint32_t format); 1727a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1737a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopianprivate: 1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // createImage creates a new EGLImage from a GraphicBuffer. 1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLImageKHR createImage(EGLDisplay dpy, 1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis const sp<GraphicBuffer>& graphicBuffer); 1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1798072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian status_t setBufferCountServerLocked(int bufferCount); 1808072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis enum { INVALID_BUFFER_SLOT = -1 }; 1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis struct BufferSlot { 184b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 185b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian BufferSlot() 186b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian : mEglImage(EGL_NO_IMAGE_KHR), 187b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mEglDisplay(EGL_NO_DISPLAY), 188b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mBufferState(BufferSlot::FREE), 189b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mRequestBufferCalled(false), 190b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mLastQueuedTransform(0), 191b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mLastQueuedTimestamp(0) { 192b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian } 193b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mGraphicBuffer points to the buffer allocated for this slot or is NULL 1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // if no buffer has been allocated. 1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis sp<GraphicBuffer> mGraphicBuffer; 1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mEglImage is the EGLImage created from mGraphicBuffer. 1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLImageKHR mEglImage; 2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mEglDisplay is the EGLDisplay used to create mEglImage. 2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLDisplay mEglDisplay; 2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 204b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mBufferState indicates whether the slot is currently accessible to a 2058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // client and should not be used by the SurfaceTexture object. It gets 2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // set to true when dequeueBuffer returns the slot and is reset to false 2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // when the client calls either queueBuffer or cancelBuffer on the slot. 208b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian enum { DEQUEUED=-2, FREE=-1, QUEUED=0 }; 209b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian int8_t mBufferState; 210b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 211b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 212b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mRequestBufferCalled is used for validating that the client did 213b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // call requestBuffer() when told to do so. Technically this is not 214b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // needed but useful for debugging and catching client bugs. 215b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian bool mRequestBufferCalled; 216b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 217b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mLastQueuedCrop is the crop rectangle for the buffer that was most 218b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // recently queued. This gets set to mNextCrop each time queueBuffer gets 219b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // called. 220b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian Rect mLastQueuedCrop; 221b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 222b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mLastQueuedTransform is the transform identifier for the buffer that was 223b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // most recently queued. This gets set to mNextTransform each time 224b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // queueBuffer gets called. 225b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian uint32_t mLastQueuedTransform; 226b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 227b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mLastQueuedTimestamp is the timestamp for the buffer that was most 228b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // recently queued. This gets set by queueBuffer. 229b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian int64_t mLastQueuedTimestamp; 2308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis }; 2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mSlots is the array of buffer slots that must be mirrored on the client 2338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // side. This allows buffer ownership to be transferred between the client 2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // and server without sending a GraphicBuffer over binder. The entire array 2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // is initialized to NULL at construction time, and buffers are allocated 2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // for a slot when requestBuffer is called with that slot's index. 2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis BufferSlot mSlots[NUM_BUFFER_SLOTS]; 2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 239a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // mDefaultWidth holds the default width of allocated buffers. It is used 240a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // in requestBuffers() if a width and height of zero is specified. 241a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian uint32_t mDefaultWidth; 242a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 243a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // mDefaultHeight holds the default height of allocated buffers. It is used 244a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // in requestBuffers() if a width and height of zero is specified. 245a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian uint32_t mDefaultHeight; 246a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 247a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // mPixelFormat holds the pixel format of allocated buffers. It is used 248a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // in requestBuffers() if a format of zero is specified. 249a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian uint32_t mPixelFormat; 250a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 2518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mBufferCount is the number of buffer slots that the client and server 2528072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // must maintain. It defaults to MIN_ASYNC_BUFFER_SLOTS and can be changed 2538072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // by calling setBufferCount or setBufferCountServer 2548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mBufferCount; 2558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2568072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // mRequestedBufferCount is the number of buffer slots requested by the 2578072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // client. The default is zero, which means the client doesn't care how 2588072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // many buffers there is. 2598072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian int mClientBufferCount; 2608072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 2618072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // mServerBufferCount buffer count requested by the server-side 2628072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian int mServerBufferCount; 2638072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 2648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mCurrentTexture is the buffer slot index of the buffer that is currently 26567eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // bound to the OpenGL texture. It is initialized to INVALID_BUFFER_SLOT, 26667eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // indicating that no buffer slot is currently bound to the texture. Note, 26767eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // however, that a value of INVALID_BUFFER_SLOT does not necessarily mean 26867eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // that no buffer is bound to the texture. A call to setBufferCount will 26967eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // reset mCurrentTexture to INVALID_BUFFER_SLOT. 2708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mCurrentTexture; 2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2727a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // mCurrentTextureTarget is the GLES texture target to be used with the 2737a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // current texture. 2747a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian GLenum mCurrentTextureTarget; 2757a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 2769a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mCurrentTextureBuf is the graphic buffer of the current texture. It's 2779a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // possible that this buffer is not associated with any buffer slot, so we 2789a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // must track it separately in order to properly use 2799a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // IGraphicBufferAlloc::freeAllGraphicBuffersExcept. 2809a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<GraphicBuffer> mCurrentTextureBuf; 2819a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 282f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mCurrentCrop is the crop rectangle that applies to the current texture. 283f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // It gets set to mLastQueuedCrop each time updateTexImage is called. 284f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mCurrentCrop; 285f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 286f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mCurrentTransform is the transform identifier for the current texture. It 287f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // gets set to mLastQueuedTransform each time updateTexImage is called. 288f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mCurrentTransform; 289f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 2901d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // mCurrentTimestamp is the timestamp for the current texture. It 2911d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // gets set to mLastQueuedTimestamp each time updateTexImage is called. 2921d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t mCurrentTimestamp; 2931d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 294f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mNextCrop is the crop rectangle that will be used for the next buffer 295f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // that gets queued. It is set by calling setCrop. 296f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mNextCrop; 297f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 298f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mNextTransform is the transform identifier that will be used for the next 299f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // buffer that gets queued. It is set by calling setTransform. 300f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mNextTransform; 301f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 3028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mTexName is the name of the OpenGL texture to which streamed images will 3038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // be bound when updateTexImage is called. It is set at construction time 3048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // changed with a call to setTexName. 3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis const GLuint mTexName; 3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3079a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mGraphicBufferAlloc is the connection to SurfaceFlinger that is used to 3089a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // allocate new GraphicBuffer objects. 3099a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IGraphicBufferAlloc> mGraphicBufferAlloc; 3109a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 311c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // mFrameAvailableListener is the listener object that will be called when a 312c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // new frame becomes available. If it is not NULL it will be called from 313c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // queueBuffer. 314c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis sp<FrameAvailableListener> mFrameAvailableListener; 315c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 316b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mSynchronousMode whether we're in synchronous mode or not 317b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian bool mSynchronousMode; 318b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 319b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mDequeueCondition condition used for dequeueBuffer in synchronous mode 320b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mutable Condition mDequeueCondition; 321b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 322b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mQueue is a FIFO of queued buffers used in synchronous mode 323b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian typedef Vector<int> Fifo; 324b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian Fifo mQueue; 325b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 3268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mMutex is the mutex used to prevent concurrent access to the member 3278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // variables of SurfaceTexture objects. It must be locked whenever the 3288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // member variables are accessed. 3297a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian mutable Mutex mMutex; 3308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 3318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 3338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 3348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#endif // ANDROID_GUI_SURFACETEXTURE_H 336