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