TextureObjectManager.h revision 076b1cc3a9b90aa5b381a1ed268ca0b548444c9b
1/* 2** Copyright 2006, The Android Open Source Project 3** 4** Licensed under the Apache License, Version 2.0 (the "License"); 5** you may not use this file except in compliance with the License. 6** You may obtain a copy of the License at 7** 8** http://www.apache.org/licenses/LICENSE-2.0 9** 10** Unless required by applicable law or agreed to in writing, software 11** distributed under the License is distributed on an "AS IS" BASIS, 12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13** See the License for the specific language governing permissions and 14** limitations under the License. 15*/ 16 17#ifndef ANDROID_OPENGLES_SURFACE_H 18#define ANDROID_OPENGLES_SURFACE_H 19 20#include <stdint.h> 21#include <stddef.h> 22#include <sys/types.h> 23 24#include <utils/Atomic.h> 25#include <utils/threads.h> 26#include <utils/RefBase.h> 27#include <utils/KeyedVector.h> 28#include <utils/Errors.h> 29 30#include <private/pixelflinger/ggl_context.h> 31 32#include <GLES/gl.h> 33 34#include "Tokenizer.h" 35#include "TokenManager.h" 36 37 38namespace android { 39 40// ---------------------------------------------------------------------------- 41 42class EGLTextureObject 43{ 44public: 45 EGLTextureObject(); 46 ~EGLTextureObject(); 47 48 // protocol for sp<> 49 inline void incStrong(const void* id) const; 50 inline void decStrong(const void* id) const; 51 inline uint32_t getStrongCount() const; 52 53 status_t setSurface(GGLSurface const* s); 54 status_t reallocate(GLint level, 55 int w, int h, int s, 56 int format, int compressedFormat, int bpr); 57 inline size_t size() const; 58 const GGLSurface& mip(int lod) const; 59 GGLSurface& editMip(int lod); 60 bool hasMipmaps() const { return mMipmaps!=0; } 61 bool isComplete() const { return mIsComplete; } 62 void copyParameters(const sp<EGLTextureObject>& old); 63 64private: 65 status_t allocateMipmaps(); 66 void freeMipmaps(); 67 void init(); 68 mutable int32_t mCount; 69 size_t mSize; 70 GGLSurface *mMipmaps; 71 int mNumExtraLod; 72 bool mIsComplete; 73 74public: 75 GGLSurface surface; 76 GLenum wraps; 77 GLenum wrapt; 78 GLenum min_filter; 79 GLenum mag_filter; 80 GLenum internalformat; 81 GLint crop_rect[4]; 82 GLint generate_mipmap; 83 GLint direct; 84#ifdef LIBAGL_USE_GRALLOC_COPYBITS 85 int copybits_fd; 86#endif // LIBAGL_USE_GRALLOC_COPYBITS 87}; 88 89void EGLTextureObject::incStrong(const void* id) const { 90 android_atomic_inc(&mCount); 91} 92void EGLTextureObject::decStrong(const void* id) const { 93 if (android_atomic_dec(&mCount) == 1) { 94 delete this; 95 } 96} 97uint32_t EGLTextureObject::getStrongCount() const { 98 return mCount; 99} 100size_t EGLTextureObject::size() const { 101 return mSize; 102} 103 104// ---------------------------------------------------------------------------- 105 106class EGLSurfaceManager : public TokenManager 107{ 108public: 109 EGLSurfaceManager(); 110 ~EGLSurfaceManager(); 111 112 // protocol for sp<> 113 inline void incStrong(const void* id) const; 114 inline void decStrong(const void* id) const; 115 typedef void weakref_type; 116 117 sp<EGLTextureObject> createTexture(GLuint name); 118 sp<EGLTextureObject> removeTexture(GLuint name); 119 sp<EGLTextureObject> replaceTexture(GLuint name); 120 void deleteTextures(GLsizei n, const GLuint *tokens); 121 sp<EGLTextureObject> texture(GLuint name); 122 123private: 124 mutable int32_t mCount; 125 mutable Mutex mLock; 126 KeyedVector< GLuint, sp<EGLTextureObject> > mTextures; 127}; 128 129void EGLSurfaceManager::incStrong(const void* id) const { 130 android_atomic_inc(&mCount); 131} 132void EGLSurfaceManager::decStrong(const void* id) const { 133 if (android_atomic_dec(&mCount) == 1) { 134 delete this; 135 } 136} 137 138 139// ---------------------------------------------------------------------------- 140}; // namespace android 141 142#endif // ANDROID_OPENGLES_SURFACE_H 143 144