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 <cutils/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 #include <EGL/egl.h>
34 #include <EGL/eglext.h>
35 
36 #include "Tokenizer.h"
37 #include "TokenManager.h"
38 
39 
40 namespace android {
41 
42 // ----------------------------------------------------------------------------
43 
44 class EGLTextureObject : public LightRefBase<EGLTextureObject>
45 {
46 public:
47                     EGLTextureObject();
48                    ~EGLTextureObject();
49 
50     status_t    setSurface(GGLSurface const* s);
51     status_t    setImage(ANativeWindowBuffer* buffer);
setImageBits(void * vaddr)52     void        setImageBits(void* vaddr) { surface.data = (GGLubyte*)vaddr; }
53 
54     status_t            reallocate(GLint level,
55                             int w, int h, int s,
56                             int format, int compressedFormat, int bpr);
size()57     inline  size_t      size() const { return mSize; }
58     const GGLSurface&   mip(int lod) const;
59     GGLSurface&         editMip(int lod);
hasMipmaps()60     bool                hasMipmaps() const { return mMipmaps!=0; }
isComplete()61     bool                isComplete() const { return mIsComplete; }
62     void                copyParameters(const sp<EGLTextureObject>& old);
63 
64 private:
65         status_t        allocateMipmaps();
66             void        freeMipmaps();
67             void        init();
68     size_t              mSize;
69     GGLSurface          *mMipmaps;
70     int                 mNumExtraLod;
71     bool                mIsComplete;
72 
73 public:
74     GGLSurface          surface;
75     GLenum              wraps;
76     GLenum              wrapt;
77     GLenum              min_filter;
78     GLenum              mag_filter;
79     GLenum              internalformat;
80     GLint               crop_rect[4];
81     GLint               generate_mipmap;
82     GLint               direct;
83     ANativeWindowBuffer* buffer;
84 };
85 
86 // ----------------------------------------------------------------------------
87 
88 class EGLSurfaceManager :
89     public LightRefBase<EGLSurfaceManager>,
90     public TokenManager
91 {
92 public:
93                 EGLSurfaceManager();
94                 ~EGLSurfaceManager();
95 
96     sp<EGLTextureObject>    createTexture(GLuint name);
97     sp<EGLTextureObject>    removeTexture(GLuint name);
98     sp<EGLTextureObject>    replaceTexture(GLuint name);
99     void                    deleteTextures(GLsizei n, const GLuint *tokens);
100     sp<EGLTextureObject>    texture(GLuint name);
101 
102 private:
103     mutable Mutex                               mLock;
104     KeyedVector< GLuint, sp<EGLTextureObject> > mTextures;
105 };
106 
107 // ----------------------------------------------------------------------------
108 }; // namespace android
109 
110 #endif // ANDROID_OPENGLES_SURFACE_H
111 
112