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