SurfaceTexture.h revision 7734ebfe47f42f980c1b44c1f284a91d8ad1d6c7
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 }; 47fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis enum { NO_CONNECTED_API = 0 }; 488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 49c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis struct FrameAvailableListener : public virtual RefBase { 503d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // onFrameAvailable() is called from queueBuffer() each time an 513d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // additional frame becomes available for consumption. This means that 523d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // frames that are queued while in asynchronous mode only trigger the 533d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // callback if no previous frames are pending. Frames queued while in 543d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // synchronous mode always trigger the callback. 553d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // 563d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // This is called without any lock held and can be called concurrently 573d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis // by multiple threads. 58c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis virtual void onFrameAvailable() = 0; 59c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis }; 60c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // tex indicates the name OpenGL texture to which images are to be streamed. 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // This texture name cannot be changed once the SurfaceTexture is created. 6314a0e58074f2698829b6554f578e6762c377caa3Grace Kloba SurfaceTexture(GLuint tex, bool allowSynchronousMode = true); 648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual ~SurfaceTexture(); 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // setBufferCount updates the number of available buffer slots. After 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // calling this all buffer slots are both unallocated and owned by the 698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // SurfaceTexture object (i.e. they are not owned by the client). 708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setBufferCount(int bufferCount); 718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 72c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian virtual sp<GraphicBuffer> requestBuffer(int buf); 738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // dequeueBuffer gets the next buffer slot index for the client to use. If a 758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // buffer slot is available then that slot index is written to the location 768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // pointed to by the buf argument and a status of OK is returned. If no 778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // slot is available then a status of -EBUSY is returned and buf is 788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // unmodified. 79c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h, 80c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t format, uint32_t usage); 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 821d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // queueBuffer returns a filled buffer to the SurfaceTexture. In addition, a 831d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // timestamp must be provided for the buffer. The timestamp is in 841d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // nanoseconds, and must be monotonically increasing. Its other semantics 851d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // (zero point, etc) are client-dependent and should be documented by the 861d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // client. 871d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala virtual status_t queueBuffer(int buf, int64_t timestamp); 888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual void cancelBuffer(int buf); 898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setCrop(const Rect& reg); 908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setTransform(uint32_t transform); 917734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian virtual status_t setScalingMode(int mode); 928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 93eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value); 94eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 958072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // setSynchronousMode set whether dequeueBuffer is synchronous or 968072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // asynchronous. In synchronous mode, dequeueBuffer blocks until 978072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // a buffer is available, the currently bound buffer can be dequeued and 988072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // queued buffers will be retired in order. 998072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // The default mode is asynchronous. 1008072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian virtual status_t setSynchronousMode(bool enabled); 1018072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 102fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // connect attempts to connect a client API to the SurfaceTexture. This 103fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // must be called before any other ISurfaceTexture methods are called except 104fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // for getAllocator. 105fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // 106fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // This method will fail if the connect was previously called on the 107fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // SurfaceTexture and no corresponding disconnect call was made. 108fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t connect(int api); 109fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis 110fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // disconnect attempts to disconnect a client API from the SurfaceTexture. 111fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // Calling this method will cause any subsequent calls to other 112fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // ISurfaceTexture methods to fail except for getAllocator and connect. 113fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // Successfully calling connect after this will allow the other methods to 114fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // succeed again. 115fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // 116fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // This method will fail if the the SurfaceTexture is not currently 117fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // connected to the specified client API. 118fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t disconnect(int api); 119fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis 1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // updateTexImage sets the image contents of the target texture to that of 1218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // the most recently queued buffer. 1228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // 1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // This call may only be made while the OpenGL ES context to which the 1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // target texture belongs is bound to the calling thread. 1258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis status_t updateTexImage(); 1268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1278072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // setBufferCountServer set the buffer count. If the client has requested 1288072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // a buffer count using setBufferCount, the server-buffer count will 1298072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // take effect once the client sets the count back to zero. 1308072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian status_t setBufferCountServer(int bufferCount); 1318072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 132f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // getTransformMatrix retrieves the 4x4 texture coordinate transform matrix 133f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // associated with the texture image set by the most recent call to 134f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // updateTexImage. 135f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 136f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // This transform matrix maps 2D homogeneous texture coordinates of the form 137f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // (s, t, 0, 1) with s and t in the inclusive range [0, 1] to the texture 138f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // coordinate that should be used to sample that location from the texture. 139f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // Sampling the texture outside of the range of this transform is undefined. 140f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 141f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // This transform is necessary to compensate for transforms that the stream 142f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // content producer may implicitly apply to the content. By forcing users of 143f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // a SurfaceTexture to apply this transform we avoid performing an extra 144f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // copy of the data that would be needed to hide the transform from the 145f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // user. 146f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // 147f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // The matrix is stored in column-major order so that it may be passed 148f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // directly to OpenGL ES via the glLoadMatrixf or glUniformMatrix4fv 149f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // functions. 150f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis void getTransformMatrix(float mtx[16]); 151f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 1521d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // getTimestamp retrieves the timestamp associated with the texture image 1531d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // set by the most recent call to updateTexImage. 1541d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // 1551d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // The timestamp is in nanoseconds, and is monotonically increasing. Its 1561d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // other semantics (zero point, etc) are source-dependent and should be 1571d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // documented by the source. 1581d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t getTimestamp(); 1591d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 160c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // setFrameAvailableListener sets the listener object that will be notified 161c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // when a new frame becomes available. 162292a31a4c2ae2f6faf134e8e4a726583017dad06Pannag Sanketi void setFrameAvailableListener(const sp<FrameAvailableListener>& listener); 163c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 1641b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // getAllocator retrieves the binder object that must be referenced as long 1651b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // as the GraphicBuffers dequeued from this SurfaceTexture are referenced. 1661b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // Holding this binder reference prevents SurfaceFlinger from freeing the 1671b20cde313b5ef8acdace742328df867956d24cbJamie Gennis // buffers before the client is done with them. 1681b20cde313b5ef8acdace742328df867956d24cbJamie Gennis sp<IBinder> getAllocator(); 1691b20cde313b5ef8acdace742328df867956d24cbJamie Gennis 170a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // setDefaultBufferSize is used to set the size of buffers returned by 171a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // requestBuffers when a with and height of zero is requested. 172a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // A call to setDefaultBufferSize() may trigger requestBuffers() to 173a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // be called from the client. 174a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian status_t setDefaultBufferSize(uint32_t w, uint32_t h); 175a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 1767a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentBuffer returns the buffer associated with the current image. 1777a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian sp<GraphicBuffer> getCurrentBuffer() const; 1787a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1797a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentTextureTarget returns the texture target of the current 1807a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // texture as returned by updateTexImage(). 1817a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian GLenum getCurrentTextureTarget() const; 1827a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1837a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentCrop returns the cropping rectangle of the current buffer 1847a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian Rect getCurrentCrop() const; 1857a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1867a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // getCurrentTransform returns the transform of the current buffer 1877a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian uint32_t getCurrentTransform() const; 1887a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 1897734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // getCurrentScalingMode returns the scaling mode of the current buffer 1907734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian uint32_t getCurrentScalingMode() const; 1917734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian 19268c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian // dump our state in a String 19368c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian void dump(String8& result) const; 19468c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian void dump(String8& result, const char* prefix, char* buffer, size_t SIZE) const; 19568c7794183a7dbfe3b20d4ce832f8eb79c2c619aMathias Agopian 1967a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopianprotected: 1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for 1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // all slots. 2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis void freeAllBuffers(); 2017a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian static bool isExternalFormat(uint32_t format); 2027a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian static GLenum getTextureTarget(uint32_t format); 2037a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 2047a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopianprivate: 2058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // createImage creates a new EGLImage from a GraphicBuffer. 2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLImageKHR createImage(EGLDisplay dpy, 2088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis const sp<GraphicBuffer>& graphicBuffer); 2098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2108072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian status_t setBufferCountServerLocked(int bufferCount); 2118072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 212736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis // computeCurrentTransformMatrix computes the transform matrix for the 213736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis // current texture. It uses mCurrentTransform and the current GraphicBuffer 214736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis // to compute this matrix and stores it in mCurrentTransformMatrix. 215736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis void computeCurrentTransformMatrix(); 216736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis 2178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis enum { INVALID_BUFFER_SLOT = -1 }; 2188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis struct BufferSlot { 220b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 221b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian BufferSlot() 222b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian : mEglImage(EGL_NO_IMAGE_KHR), 223b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mEglDisplay(EGL_NO_DISPLAY), 224b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mBufferState(BufferSlot::FREE), 225b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mRequestBufferCalled(false), 2268cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis mTransform(0), 2277734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 2288cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis mTimestamp(0) { 2298cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis mCrop.makeInvalid(); 230b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian } 231b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mGraphicBuffer points to the buffer allocated for this slot or is NULL 2338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // if no buffer has been allocated. 2348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis sp<GraphicBuffer> mGraphicBuffer; 2358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mEglImage is the EGLImage created from mGraphicBuffer. 2378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLImageKHR mEglImage; 2388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mEglDisplay is the EGLDisplay used to create mEglImage. 2408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis EGLDisplay mEglDisplay; 2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2428cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // BufferState represents the different states in which a buffer slot 2438cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // can be. 2448cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis enum BufferState { 2458cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // FREE indicates that the buffer is not currently being used and 2468cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // will not be used in the future until it gets dequeued and 2478cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // subseqently queued by the client. 2488cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis FREE = 0, 2498cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis 2508cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // DEQUEUED indicates that the buffer has been dequeued by the 2518cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // client, but has not yet been queued or canceled. The buffer is 2528cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // considered 'owned' by the client, and the server should not use 2538cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // it for anything. 2548cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // 2558cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // Note that when in synchronous-mode (mSynchronousMode == true), 2568cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // the buffer that's currently attached to the texture may be 2578cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // dequeued by the client. That means that the current buffer can 2588cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // be in either the DEQUEUED or QUEUED state. In asynchronous mode, 2598cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // however, the current buffer is always in the QUEUED state. 2608cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis DEQUEUED = 1, 2618cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis 2628cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // QUEUED indicates that the buffer has been queued by the client, 2638cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // and has not since been made available for the client to dequeue. 2648cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // Attaching the buffer to the texture does NOT transition the 2658cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // buffer away from the QUEUED state. However, in Synchronous mode 2668cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // the current buffer may be dequeued by the client under some 2678cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // circumstances. See the note about the current buffer in the 2688cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // documentation for DEQUEUED. 2698cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis QUEUED = 2, 2708cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis }; 2718cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis 2728cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // mBufferState is the current state of this buffer slot. 2738cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis BufferState mBufferState; 274b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 275b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mRequestBufferCalled is used for validating that the client did 276b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // call requestBuffer() when told to do so. Technically this is not 277b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // needed but useful for debugging and catching client bugs. 278b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian bool mRequestBufferCalled; 279b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 2808cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // mCrop is the current crop rectangle for this buffer slot. This gets 2818cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // set to mNextCrop each time queueBuffer gets called for this buffer. 2828cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis Rect mCrop; 283b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 2848cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // mTransform is the current transform flags for this buffer slot. This 2858cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // gets set to mNextTransform each time queueBuffer gets called for this 2868cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // slot. 2878cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis uint32_t mTransform; 288b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 2897734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // mScalingMode is the current scaling mode for this buffer slot. This 2907734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // gets set to mNextScalingMode each time queueBuffer gets called for 2917734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // this slot. 2927734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian uint32_t mScalingMode; 2937734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian 2948cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // mTimestamp is the current timestamp for this buffer slot. This gets 2958cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis // to set by queueBuffer each time this slot is queued. 2968cd5ba4b7f01d3a54a8f8bc6d1793aa5fc8e09efJamie Gennis int64_t mTimestamp; 2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis }; 2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mSlots is the array of buffer slots that must be mirrored on the client 3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // side. This allows buffer ownership to be transferred between the client 3018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // and server without sending a GraphicBuffer over binder. The entire array 3028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // is initialized to NULL at construction time, and buffers are allocated 3038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // for a slot when requestBuffer is called with that slot's index. 3048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis BufferSlot mSlots[NUM_BUFFER_SLOTS]; 3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 306a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // mDefaultWidth holds the default width of allocated buffers. It is used 307a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // in requestBuffers() if a width and height of zero is specified. 308a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian uint32_t mDefaultWidth; 309a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 310a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // mDefaultHeight holds the default height of allocated buffers. It is used 311a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // in requestBuffers() if a width and height of zero is specified. 312a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian uint32_t mDefaultHeight; 313a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 314a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // mPixelFormat holds the pixel format of allocated buffers. It is used 315a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian // in requestBuffers() if a format of zero is specified. 316a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian uint32_t mPixelFormat; 317a5c75c01620179ce00812354778a29a80d76e71fMathias Agopian 3188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mBufferCount is the number of buffer slots that the client and server 3198072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // must maintain. It defaults to MIN_ASYNC_BUFFER_SLOTS and can be changed 3208072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // by calling setBufferCount or setBufferCountServer 3218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mBufferCount; 3228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 323ae468f43418c3cbae74c7f546283f6bb4e4df690Jamie Gennis // mClientBufferCount is the number of buffer slots requested by the client. 324ae468f43418c3cbae74c7f546283f6bb4e4df690Jamie Gennis // The default is zero, which means the client doesn't care how many buffers 325ae468f43418c3cbae74c7f546283f6bb4e4df690Jamie Gennis // there is. 3268072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian int mClientBufferCount; 3278072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 3288072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian // mServerBufferCount buffer count requested by the server-side 3298072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian int mServerBufferCount; 3308072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 3318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mCurrentTexture is the buffer slot index of the buffer that is currently 33267eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // bound to the OpenGL texture. It is initialized to INVALID_BUFFER_SLOT, 33367eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // indicating that no buffer slot is currently bound to the texture. Note, 33467eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // however, that a value of INVALID_BUFFER_SLOT does not necessarily mean 33567eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // that no buffer is bound to the texture. A call to setBufferCount will 33667eedd74ab78c2bfed9fcdc74947b97289254ca4Jamie Gennis // reset mCurrentTexture to INVALID_BUFFER_SLOT. 3378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int mCurrentTexture; 3388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3397a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // mCurrentTextureTarget is the GLES texture target to be used with the 3407a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian // current texture. 3417a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian GLenum mCurrentTextureTarget; 3427a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian 3439a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mCurrentTextureBuf is the graphic buffer of the current texture. It's 3449a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // possible that this buffer is not associated with any buffer slot, so we 3459a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // must track it separately in order to properly use 3469a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // IGraphicBufferAlloc::freeAllGraphicBuffersExcept. 3479a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<GraphicBuffer> mCurrentTextureBuf; 3489a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 349f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mCurrentCrop is the crop rectangle that applies to the current texture. 3507734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // It gets set each time updateTexImage is called. 351f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mCurrentCrop; 352f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 353f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mCurrentTransform is the transform identifier for the current texture. It 3547734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // gets set each time updateTexImage is called. 355f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mCurrentTransform; 356f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 3577734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // mCurrentScalingMode is the scaling mode for the current texture. It gets 3587734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // set to each time updateTexImage is called. 3597734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian uint32_t mCurrentScalingMode; 3607734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian 361736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis // mCurrentTransformMatrix is the transform matrix for the current texture. 362736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis // It gets computed by computeTransformMatrix each time updateTexImage is 363736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis // called. 364736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis float mCurrentTransformMatrix[16]; 365736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis 3661d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala // mCurrentTimestamp is the timestamp for the current texture. It 3677734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // gets set each time updateTexImage is called. 3681d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala int64_t mCurrentTimestamp; 3691d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 370f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mNextCrop is the crop rectangle that will be used for the next buffer 371f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // that gets queued. It is set by calling setCrop. 372f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis Rect mNextCrop; 373f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 374f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // mNextTransform is the transform identifier that will be used for the next 375f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis // buffer that gets queued. It is set by calling setTransform. 376f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis uint32_t mNextTransform; 377f238e28500ca756fbd9e323f728ce7c8dda59475Jamie Gennis 3787734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // mNextScalingMode is the scaling mode that will be used for the next 3797734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian // buffers that get queued. It is set by calling setScalingMode. 3807734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian int mNextScalingMode; 3817734ebfe47f42f980c1b44c1f284a91d8ad1d6c7Mathias Agopian 3828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mTexName is the name of the OpenGL texture to which streamed images will 383292a31a4c2ae2f6faf134e8e4a726583017dad06Pannag Sanketi // be bound when updateTexImage is called. It is set at construction time 3848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // changed with a call to setTexName. 3858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis const GLuint mTexName; 3868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3879a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // mGraphicBufferAlloc is the connection to SurfaceFlinger that is used to 3889a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis // allocate new GraphicBuffer objects. 3899a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IGraphicBufferAlloc> mGraphicBufferAlloc; 3909a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 391c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // mFrameAvailableListener is the listener object that will be called when a 392c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // new frame becomes available. If it is not NULL it will be called from 393c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis // queueBuffer. 394c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis sp<FrameAvailableListener> mFrameAvailableListener; 395c4d4aeab52435c177ded6abdd578fec8191f0f5dJamie Gennis 396b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mSynchronousMode whether we're in synchronous mode or not 397b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian bool mSynchronousMode; 398b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 39914a0e58074f2698829b6554f578e6762c377caa3Grace Kloba // mAllowSynchronousMode whether we allow synchronous mode or not 40014a0e58074f2698829b6554f578e6762c377caa3Grace Kloba const bool mAllowSynchronousMode; 40114a0e58074f2698829b6554f578e6762c377caa3Grace Kloba 402fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // mConnectedApi indicates the API that is currently connected to this 403fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // SurfaceTexture. It defaults to NO_CONNECTED_API (= 0), and gets updated 404fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis // by the connect and disconnect methods. 405fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int mConnectedApi; 406fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis 407b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mDequeueCondition condition used for dequeueBuffer in synchronous mode 408b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian mutable Condition mDequeueCondition; 409b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 410b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian // mQueue is a FIFO of queued buffers used in synchronous mode 411b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian typedef Vector<int> Fifo; 412b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian Fifo mQueue; 413b3e518c820c7dbe35587bd45c510e4e5e7cfd9c9Mathias Agopian 4148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // mMutex is the mutex used to prevent concurrent access to the member 4158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // variables of SurfaceTexture objects. It must be locked whenever the 4168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis // member variables are accessed. 4177a042bf324fe3f3d5d4085fda21fe50dc0c362b4Mathias Agopian mutable Mutex mMutex; 418736aa9573bb7b78f9c315f396c104491b3639426Jamie Gennis 4198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 4208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 4228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 4238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#endif // ANDROID_GUI_SURFACETEXTURE_H 425