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