1ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/*
2ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Copyright (C) 2010 The Android Open Source Project
3ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *
4ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * you may not use this file except in compliance with the License.
6ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * You may obtain a copy of the License at
7ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *
8ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9ce0537b80087a6225273040a987414b1dd081aa0Romain Guy *
10ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Unless required by applicable law or agreed to in writing, software
11ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * See the License for the specific language governing permissions and
14ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * limitations under the License.
15ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */
16ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_TEXTURE_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_TEXTURE_H
19ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
20ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <GLES2/gl2.h>
21ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
22ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace android {
23ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace uirenderer {
24ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
258aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guyclass Caches;
263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyclass UvMapper;
273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
28ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/**
29ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Represents an OpenGL texture.
30ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */
318aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guyclass Texture {
328aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guypublic:
338aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    Texture();
348aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    Texture(Caches& caches);
359ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
36a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    virtual ~Texture() { }
37a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy
388aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    inline void setWrap(GLenum wrap, bool bindTexture = false, bool force = false,
39d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy                GLenum renderTarget = GL_TEXTURE_2D) {
40d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy        setWrapST(wrap, wrap, bindTexture, force, renderTarget);
41d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    }
42d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy
43a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    virtual void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false,
448aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy            bool force = false, GLenum renderTarget = GL_TEXTURE_2D);
45e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
468aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    inline void setFilter(GLenum filter, bool bindTexture = false, bool force = false,
47d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy                GLenum renderTarget = GL_TEXTURE_2D) {
48d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy        setFilterMinMag(filter, filter, bindTexture, force, renderTarget);
49d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy    }
50d21b6e1fe337b35f62cf2028e9bd0637fd009a75Romain Guy
51a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    virtual void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false,
528aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy            bool force = false, GLenum renderTarget = GL_TEXTURE_2D);
5322158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
54ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
55be1b127c7bec252e0c6ab0e06ed6babed07d496fRomain Guy     * Convenience method to call glDeleteTextures() on this texture's id.
56be1b127c7bec252e0c6ab0e06ed6babed07d496fRomain Guy     */
57be1b127c7bec252e0c6ab0e06ed6babed07d496fRomain Guy    void deleteTexture() const;
58be1b127c7bec252e0c6ab0e06ed6babed07d496fRomain Guy
59be1b127c7bec252e0c6ab0e06ed6babed07d496fRomain Guy    /**
60ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Name of the texture.
61ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
62ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    GLuint id;
63ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
64fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy     * Generation of the backing bitmap,
65fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy     */
66fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy    uint32_t generation;
67fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy    /**
68ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Indicates whether the texture requires blending.
69ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
70ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    bool blend;
71ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
72ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Width of the backing bitmap.
73ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
747d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy    uint32_t width;
75ce0537b80087a6225273040a987414b1dd081aa0Romain Guy    /**
76ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     * Height of the backing bitmap.
77ce0537b80087a6225273040a987414b1dd081aa0Romain Guy     */
787d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy    uint32_t height;
7922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    /**
8022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy     * Indicates whether this texture should be cleaned up after use.
8122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy     */
8222158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    bool cleanup;
839aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy    /**
849aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy     * Optional, size of the original bitmap.
859aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy     */
869aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy    uint32_t bitmapSize;
87713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy    /**
88713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy     * Indicates whether this texture will use trilinear filtering.
89713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy     */
90713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guy    bool mipMap;
918164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy
923b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    /**
933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * Optional, pointer to a texture coordinates mapper.
943b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     */
953b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    const UvMapper* uvMapper;
963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
97860d155f866cc15a725e7ce03763280987f24901John Reck    /**
98860d155f866cc15a725e7ce03763280987f24901John Reck     * Whether or not the Texture is marked in use and thus not evictable for
99860d155f866cc15a725e7ce03763280987f24901John Reck     * the current frame. This is reset at the start of a new frame.
100860d155f866cc15a725e7ce03763280987f24901John Reck     */
101860d155f866cc15a725e7ce03763280987f24901John Reck    bool isInUse;
102860d155f866cc15a725e7ce03763280987f24901John Reck
103713e1bb9df6bdfc21bd5c40d1a6ecf6c822a4be5Romain Guyprivate:
1048164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy    /**
1058164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy     * Last wrap modes set on this texture. Defaults to GL_CLAMP_TO_EDGE.
1068164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy     */
1078aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    GLenum mWrapS;
1088aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    GLenum mWrapT;
1099ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy
1109ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy    /**
1119ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy     * Last filters set on this texture. Defaults to GL_NEAREST.
1129ace8f5e79e76893fe4ca9e4d10f6c4056330485Romain Guy     */
1138aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    GLenum mMinFilter;
1148aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    GLenum mMagFilter;
1158aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy
1168aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    bool mFirstFilter;
1178aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    bool mFirstWrap;
118e3c26851dc315b730ea0fe5ef35bb1db81f6d675Romain Guy
1198aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    Caches& mCaches;
120ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // struct Texture
121ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
12222158e139a3d6c6a9787ca0de224e9368f643284Romain Guyclass AutoTexture {
12322158e139a3d6c6a9787ca0de224e9368f643284Romain Guypublic:
12422158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    AutoTexture(const Texture* texture): mTexture(texture) { }
12522158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    ~AutoTexture() {
12622158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        if (mTexture && mTexture->cleanup) {
127be1b127c7bec252e0c6ab0e06ed6babed07d496fRomain Guy            mTexture->deleteTexture();
12822158e139a3d6c6a9787ca0de224e9368f643284Romain Guy            delete mTexture;
12922158e139a3d6c6a9787ca0de224e9368f643284Romain Guy        }
13022158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    }
13122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
13222158e139a3d6c6a9787ca0de224e9368f643284Romain Guyprivate:
13322158e139a3d6c6a9787ca0de224e9368f643284Romain Guy    const Texture* mTexture;
13422158e139a3d6c6a9787ca0de224e9368f643284Romain Guy}; // class AutoTexture
13522158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
136ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer
137ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android
138ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
1395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_TEXTURE_H
140