|
1 // |
|
2 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. |
|
3 // Use of this source code is governed by a BSD-style license that can be |
|
4 // found in the LICENSE file. |
|
5 // |
|
6 |
|
7 // Texture.h: Defines the abstract gl::Texture class and its concrete derived |
|
8 // classes Texture2D and TextureCubeMap. Implements GL texture objects and |
|
9 // related functionality. [OpenGL ES 2.0.24] section 3.7 page 63. |
|
10 |
|
11 #ifndef LIBGLESV2_TEXTURE_H_ |
|
12 #define LIBGLESV2_TEXTURE_H_ |
|
13 |
|
14 #include <vector> |
|
15 |
|
16 #define GL_APICALL |
|
17 #include <GLES2/gl2.h> |
|
18 |
|
19 #include "common/debug.h" |
|
20 #include "common/RefCountObject.h" |
|
21 #include "libGLESv2/angletypes.h" |
|
22 |
|
23 namespace egl |
|
24 { |
|
25 class Surface; |
|
26 } |
|
27 |
|
28 namespace rx |
|
29 { |
|
30 class Renderer; |
|
31 class TextureStorageInterface; |
|
32 class TextureStorageInterface2D; |
|
33 class TextureStorageInterfaceCube; |
|
34 class RenderTarget; |
|
35 class Image; |
|
36 } |
|
37 |
|
38 namespace gl |
|
39 { |
|
40 class Framebuffer; |
|
41 class Renderbuffer; |
|
42 |
|
43 enum |
|
44 { |
|
45 // These are the maximums the implementation can support |
|
46 // The actual GL caps are limited by the device caps |
|
47 // and should be queried from the Context |
|
48 IMPLEMENTATION_MAX_TEXTURE_SIZE = 16384, |
|
49 IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384, |
|
50 |
|
51 IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15 // 1+log2 of MAX_TEXTURE_SIZE |
|
52 }; |
|
53 |
|
54 class Texture : public RefCountObject |
|
55 { |
|
56 public: |
|
57 Texture(rx::Renderer *renderer, GLuint id); |
|
58 |
|
59 virtual ~Texture(); |
|
60 |
|
61 virtual void addProxyRef(const Renderbuffer *proxy) = 0; |
|
62 virtual void releaseProxy(const Renderbuffer *proxy) = 0; |
|
63 |
|
64 virtual GLenum getTarget() const = 0; |
|
65 |
|
66 bool setMinFilter(GLenum filter); |
|
67 bool setMagFilter(GLenum filter); |
|
68 bool setWrapS(GLenum wrap); |
|
69 bool setWrapT(GLenum wrap); |
|
70 bool setMaxAnisotropy(float textureMaxAnisotropy, float contextMaxAnisotropy); |
|
71 bool setUsage(GLenum usage); |
|
72 |
|
73 GLenum getMinFilter() const; |
|
74 GLenum getMagFilter() const; |
|
75 GLenum getWrapS() const; |
|
76 GLenum getWrapT() const; |
|
77 float getMaxAnisotropy() const; |
|
78 int getLodOffset(); |
|
79 void getSamplerState(SamplerState *sampler); |
|
80 GLenum getUsage() const; |
|
81 bool isMipmapFiltered() const; |
|
82 |
|
83 virtual bool isSamplerComplete() const = 0; |
|
84 |
|
85 rx::TextureStorageInterface *getNativeTexture(); |
|
86 virtual Renderbuffer *getRenderbuffer(GLenum target) = 0; |
|
87 |
|
88 virtual void generateMipmaps() = 0; |
|
89 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0; |
|
90 |
|
91 bool hasDirtyParameters() const; |
|
92 bool hasDirtyImages() const; |
|
93 void resetDirty(); |
|
94 unsigned int getTextureSerial(); |
|
95 unsigned int getRenderTargetSerial(GLenum target); |
|
96 |
|
97 bool isImmutable() const; |
|
98 |
|
99 static const GLuint INCOMPLETE_TEXTURE_ID = static_cast<GLuint>(-1); // Every texture takes an id at creation time. The value is arbitrary because it is never registered with the resource manager. |
|
100 |
|
101 protected: |
|
102 void setImage(GLint unpackAlignment, const void *pixels, rx::Image *image); |
|
103 bool subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, rx::Image *image); |
|
104 void setCompressedImage(GLsizei imageSize, const void *pixels, rx::Image *image); |
|
105 bool subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, rx::Image *image); |
|
106 |
|
107 GLint creationLevels(GLsizei width, GLsizei height) const; |
|
108 GLint creationLevels(GLsizei size) const; |
|
109 |
|
110 virtual void createTexture() = 0; |
|
111 virtual void updateTexture() = 0; |
|
112 virtual void convertToRenderTarget() = 0; |
|
113 virtual rx::RenderTarget *getRenderTarget(GLenum target) = 0; |
|
114 |
|
115 virtual int levelCount() = 0; |
|
116 |
|
117 rx::Renderer *mRenderer; |
|
118 |
|
119 SamplerState mSamplerState; |
|
120 GLenum mUsage; |
|
121 |
|
122 bool mDirtyImages; |
|
123 |
|
124 bool mImmutable; |
|
125 |
|
126 private: |
|
127 DISALLOW_COPY_AND_ASSIGN(Texture); |
|
128 |
|
129 virtual rx::TextureStorageInterface *getStorage(bool renderTarget) = 0; |
|
130 }; |
|
131 |
|
132 class Texture2D : public Texture |
|
133 { |
|
134 public: |
|
135 Texture2D(rx::Renderer *renderer, GLuint id); |
|
136 |
|
137 ~Texture2D(); |
|
138 |
|
139 void addProxyRef(const Renderbuffer *proxy); |
|
140 void releaseProxy(const Renderbuffer *proxy); |
|
141 |
|
142 virtual GLenum getTarget() const; |
|
143 |
|
144 GLsizei getWidth(GLint level) const; |
|
145 GLsizei getHeight(GLint level) const; |
|
146 GLenum getInternalFormat(GLint level) const; |
|
147 GLenum getActualFormat(GLint level) const; |
|
148 bool isCompressed(GLint level) const; |
|
149 bool isDepth(GLint level) const; |
|
150 |
|
151 void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
152 void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); |
|
153 void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
154 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); |
|
155 void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); |
|
156 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); |
|
157 void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); |
|
158 |
|
159 virtual bool isSamplerComplete() const; |
|
160 virtual void bindTexImage(egl::Surface *surface); |
|
161 virtual void releaseTexImage(); |
|
162 |
|
163 virtual void generateMipmaps(); |
|
164 |
|
165 virtual Renderbuffer *getRenderbuffer(GLenum target); |
|
166 |
|
167 protected: |
|
168 friend class RenderbufferTexture2D; |
|
169 virtual rx::RenderTarget *getRenderTarget(GLenum target); |
|
170 virtual rx::RenderTarget *getDepthStencil(GLenum target); |
|
171 virtual int levelCount(); |
|
172 |
|
173 private: |
|
174 DISALLOW_COPY_AND_ASSIGN(Texture2D); |
|
175 |
|
176 virtual void createTexture(); |
|
177 virtual void updateTexture(); |
|
178 virtual void convertToRenderTarget(); |
|
179 virtual rx::TextureStorageInterface *getStorage(bool renderTarget); |
|
180 |
|
181 bool isMipmapComplete() const; |
|
182 |
|
183 void redefineImage(GLint level, GLint internalformat, GLsizei width, GLsizei height); |
|
184 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); |
|
185 |
|
186 rx::Image *mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS]; |
|
187 |
|
188 rx::TextureStorageInterface2D *mTexStorage; |
|
189 egl::Surface *mSurface; |
|
190 |
|
191 // A specific internal reference count is kept for colorbuffer proxy references, |
|
192 // because, as the renderbuffer acting as proxy will maintain a binding pointer |
|
193 // back to this texture, there would be a circular reference if we used a binding |
|
194 // pointer here. This reference count will cause the pointer to be set to NULL if |
|
195 // the count drops to zero, but will not cause deletion of the Renderbuffer. |
|
196 Renderbuffer *mColorbufferProxy; |
|
197 unsigned int mProxyRefs; |
|
198 }; |
|
199 |
|
200 class TextureCubeMap : public Texture |
|
201 { |
|
202 public: |
|
203 TextureCubeMap(rx::Renderer *renderer, GLuint id); |
|
204 |
|
205 ~TextureCubeMap(); |
|
206 |
|
207 void addProxyRef(const Renderbuffer *proxy); |
|
208 void releaseProxy(const Renderbuffer *proxy); |
|
209 |
|
210 virtual GLenum getTarget() const; |
|
211 |
|
212 GLsizei getWidth(GLenum target, GLint level) const; |
|
213 GLsizei getHeight(GLenum target, GLint level) const; |
|
214 GLenum getInternalFormat(GLenum target, GLint level) const; |
|
215 GLenum getActualFormat(GLenum target, GLint level) const; |
|
216 bool isCompressed(GLenum target, GLint level) const; |
|
217 |
|
218 void setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
219 void setImageNegX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
220 void setImagePosY(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
221 void setImageNegY(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
222 void setImagePosZ(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
223 void setImageNegZ(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
224 |
|
225 void setCompressedImage(GLenum face, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); |
|
226 |
|
227 void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
228 void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); |
|
229 void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); |
|
230 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); |
|
231 void storage(GLsizei levels, GLenum internalformat, GLsizei size); |
|
232 |
|
233 virtual bool isSamplerComplete() const; |
|
234 |
|
235 virtual void generateMipmaps(); |
|
236 |
|
237 virtual Renderbuffer *getRenderbuffer(GLenum target); |
|
238 |
|
239 static unsigned int faceIndex(GLenum face); |
|
240 |
|
241 protected: |
|
242 friend class RenderbufferTextureCubeMap; |
|
243 virtual rx::RenderTarget *getRenderTarget(GLenum target); |
|
244 virtual int levelCount(); |
|
245 |
|
246 private: |
|
247 DISALLOW_COPY_AND_ASSIGN(TextureCubeMap); |
|
248 |
|
249 virtual void createTexture(); |
|
250 virtual void updateTexture(); |
|
251 virtual void convertToRenderTarget(); |
|
252 virtual rx::TextureStorageInterface *getStorage(bool renderTarget); |
|
253 |
|
254 bool isCubeComplete() const; |
|
255 bool isMipmapCubeComplete() const; |
|
256 |
|
257 void setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); |
|
258 void commitRect(int faceIndex, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); |
|
259 void redefineImage(int faceIndex, GLint level, GLint internalformat, GLsizei width, GLsizei height); |
|
260 |
|
261 rx::Image *mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS]; |
|
262 |
|
263 rx::TextureStorageInterfaceCube *mTexStorage; |
|
264 |
|
265 // A specific internal reference count is kept for colorbuffer proxy references, |
|
266 // because, as the renderbuffer acting as proxy will maintain a binding pointer |
|
267 // back to this texture, there would be a circular reference if we used a binding |
|
268 // pointer here. This reference count will cause the pointer to be set to NULL if |
|
269 // the count drops to zero, but will not cause deletion of the Renderbuffer. |
|
270 Renderbuffer *mFaceProxies[6]; |
|
271 unsigned int *mFaceProxyRefs[6]; |
|
272 }; |
|
273 } |
|
274 |
|
275 #endif // LIBGLESV2_TEXTURE_H_ |