TextureObjectManager.h revision 7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407
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}; 85 86void EGLTextureObject::incStrong(const void* id) const { 87 android_atomic_inc(&mCount); 88} 89void EGLTextureObject::decStrong(const void* id) const { 90 if (android_atomic_dec(&mCount) == 1) { 91 delete this; 92 } 93} 94uint32_t EGLTextureObject::getStrongCount() const { 95 return mCount; 96} 97size_t EGLTextureObject::size() const { 98 return mSize; 99} 100 101// ---------------------------------------------------------------------------- 102 103class EGLSurfaceManager : public TokenManager 104{ 105public: 106 EGLSurfaceManager(); 107 ~EGLSurfaceManager(); 108 109 // protocol for sp<> 110 inline void incStrong(const void* id) const; 111 inline void decStrong(const void* id) const; 112 typedef void weakref_type; 113 114 sp<EGLTextureObject> createTexture(GLuint name); 115 sp<EGLTextureObject> removeTexture(GLuint name); 116 sp<EGLTextureObject> replaceTexture(GLuint name); 117 void deleteTextures(GLsizei n, const GLuint *tokens); 118 sp<EGLTextureObject> texture(GLuint name); 119 120private: 121 mutable int32_t mCount; 122 mutable Mutex mLock; 123 KeyedVector< GLuint, sp<EGLTextureObject> > mTextures; 124}; 125 126void EGLSurfaceManager::incStrong(const void* id) const { 127 android_atomic_inc(&mCount); 128} 129void EGLSurfaceManager::decStrong(const void* id) const { 130 if (android_atomic_dec(&mCount) == 1) { 131 delete this; 132 } 133} 134 135 136// ---------------------------------------------------------------------------- 137}; // namespace android 138 139#endif // ANDROID_OPENGLES_SURFACE_H 140 141