• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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_HWUI_TEXTURE_H
18 #define ANDROID_HWUI_TEXTURE_H
19 
20 #include "GpuMemoryTracker.h"
21 
22 #include <GLES2/gl2.h>
23 #include <SkBitmap.h>
24 
25 namespace android {
26 namespace uirenderer {
27 
28 class Caches;
29 class UvMapper;
30 class Layer;
31 
32 /**
33  * Represents an OpenGL texture.
34  */
35 class Texture : public GpuMemoryTracker {
36 public:
Texture(Caches & caches)37     Texture(Caches& caches)
38         : GpuMemoryTracker(GpuObjectType::Texture)
39         , mCaches(caches)
40     { }
41 
~Texture()42     virtual ~Texture() { }
43 
44     inline void setWrap(GLenum wrap, bool bindTexture = false, bool force = false,
45                 GLenum renderTarget = GL_TEXTURE_2D) {
46         setWrapST(wrap, wrap, bindTexture, force, renderTarget);
47     }
48 
49     virtual void setWrapST(GLenum wrapS, GLenum wrapT, bool bindTexture = false,
50             bool force = false, GLenum renderTarget = GL_TEXTURE_2D);
51 
52     inline void setFilter(GLenum filter, bool bindTexture = false, bool force = false,
53                 GLenum renderTarget = GL_TEXTURE_2D) {
54         setFilterMinMag(filter, filter, bindTexture, force, renderTarget);
55     }
56 
57     virtual void setFilterMinMag(GLenum min, GLenum mag, bool bindTexture = false,
58             bool force = false, GLenum renderTarget = GL_TEXTURE_2D);
59 
60     /**
61      * Convenience method to call glDeleteTextures() on this texture's id.
62      */
63     void deleteTexture();
64 
65     /**
66      * Sets the width, height, and format of the texture along with allocating
67      * the texture ID. Does nothing if the width, height, and format are already
68      * the requested values.
69      *
70      * The image data is undefined after calling this.
71      */
resize(uint32_t width,uint32_t height,GLint format)72     void resize(uint32_t width, uint32_t height, GLint format) {
73         upload(format, width, height, format, GL_UNSIGNED_BYTE, nullptr);
74     }
75 
76     /**
77      * Updates this Texture with the contents of the provided SkBitmap,
78      * also setting the appropriate width, height, and format. It is not necessary
79      * to call resize() prior to this.
80      *
81      * Note this does not set the generation from the SkBitmap.
82      */
83     void upload(const SkBitmap& source);
84 
85     /**
86      * Basically glTexImage2D/glTexSubImage2D.
87      */
88     void upload(GLint internalformat, uint32_t width, uint32_t height,
89             GLenum format, GLenum type, const void* pixels);
90 
91     /**
92      * Wraps an existing texture.
93      */
94     void wrap(GLuint id, uint32_t width, uint32_t height, GLint format);
95 
id()96     GLuint id() const {
97         return mId;
98     }
99 
width()100     uint32_t width() const {
101         return mWidth;
102     }
103 
height()104     uint32_t height() const {
105         return mHeight;
106     }
107 
format()108     GLint format() const {
109         return mFormat;
110     }
111 
112     /**
113      * Generation of the backing bitmap,
114      */
115     uint32_t generation = 0;
116     /**
117      * Indicates whether the texture requires blending.
118      */
119     bool blend = false;
120     /**
121      * Indicates whether this texture should be cleaned up after use.
122      */
123     bool cleanup = false;
124     /**
125      * Optional, size of the original bitmap.
126      */
127     uint32_t bitmapSize = 0;
128     /**
129      * Indicates whether this texture will use trilinear filtering.
130      */
131     bool mipMap = false;
132 
133     /**
134      * Optional, pointer to a texture coordinates mapper.
135      */
136     const UvMapper* uvMapper = nullptr;
137 
138     /**
139      * Whether or not the Texture is marked in use and thus not evictable for
140      * the current frame. This is reset at the start of a new frame.
141      */
142     void* isInUse = nullptr;
143 
144 private:
145     // TODO: Temporarily grant private access to Layer, remove once
146     // Layer can be de-tangled from being a dual-purpose render target
147     // and external texture wrapper
148     friend class Layer;
149 
150     // Returns true if the size changed, false if it was the same
151     bool updateSize(uint32_t width, uint32_t height, GLint format);
152     void resetCachedParams();
153 
154     GLuint mId = 0;
155     uint32_t mWidth = 0;
156     uint32_t mHeight = 0;
157     GLint mFormat = 0;
158 
159     /* See GLES spec section 3.8.14
160      * "In the initial state, the value assigned to TEXTURE_MIN_FILTER is
161      * NEAREST_MIPMAP_LINEAR and the value for TEXTURE_MAG_FILTER is LINEAR.
162      * s, t, and r wrap modes are all set to REPEAT."
163      */
164     GLenum mWrapS = GL_REPEAT;
165     GLenum mWrapT = GL_REPEAT;
166     GLenum mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
167     GLenum mMagFilter = GL_LINEAR;
168 
169     Caches& mCaches;
170 }; // struct Texture
171 
172 class AutoTexture {
173 public:
AutoTexture(Texture * texture)174     AutoTexture(Texture* texture)
175             : texture(texture) {}
~AutoTexture()176     ~AutoTexture() {
177         if (texture && texture->cleanup) {
178             texture->deleteTexture();
179             delete texture;
180         }
181     }
182 
183     Texture* const texture;
184 }; // class AutoTexture
185 
186 }; // namespace uirenderer
187 }; // namespace android
188 
189 #endif // ANDROID_HWUI_TEXTURE_H
190