• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2002-2010 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 #include <d3d9.h>
19 
20 #include "libGLESv2/Renderbuffer.h"
21 #include "libGLESv2/RefCountObject.h"
22 #include "libGLESv2/utilities.h"
23 #include "common/debug.h"
24 
25 namespace gl
26 {
27 class Blit;
28 
29 enum
30 {
31     // These are the maximums the implementation can support
32     // The actual GL caps are limited by the device caps
33     // and should be queried from the Context
34     IMPLEMENTATION_MAX_TEXTURE_SIZE = 16384,
35     IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384,
36 
37     IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15   // 1+log2 of MAX_TEXTURE_SIZE
38 };
39 
40 class Texture : public RefCountObject
41 {
42   public:
43     explicit Texture(GLuint id);
44 
45     virtual ~Texture();
46 
47     virtual GLenum getTarget() const = 0;
48 
49     bool setMinFilter(GLenum filter);
50     bool setMagFilter(GLenum filter);
51     bool setWrapS(GLenum wrap);
52     bool setWrapT(GLenum wrap);
53 
54     GLenum getMinFilter() const;
55     GLenum getMagFilter() const;
56     GLenum getWrapS() const;
57     GLenum getWrapT() const;
58 
59     GLuint getWidth() const;
60     GLuint getHeight() const;
61 
62     virtual GLenum getFormat() const = 0;
63     virtual bool isComplete() const = 0;
64     virtual bool isCompressed() const = 0;
65     bool isFloatingPoint() const;
66     bool isRenderableFormat() const;
67 
68     D3DFORMAT getD3DFormat() const;
69     IDirect3DBaseTexture9 *getTexture();
70     virtual Renderbuffer *getColorbuffer(GLenum target) = 0;
71 
72     virtual void generateMipmaps() = 0;
73     virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source) = 0;
74 
75     bool isDirty() const;
76 
77     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.
78 
79   protected:
80     class TextureColorbufferProxy;
81     friend class TextureColorbufferProxy;
82     class TextureColorbufferProxy : public Colorbuffer
83     {
84       public:
85         TextureColorbufferProxy(Texture *texture, GLenum target);
86             // target is a 2D-like texture target (GL_TEXTURE_2D or one of the cube face targets)
87 
88         virtual void addRef() const;
89         virtual void release() const;
90 
91         virtual IDirect3DSurface9 *getRenderTarget();
92 
93         virtual int getWidth() const;
94         virtual int getHeight() const;
95         virtual GLenum getFormat() const;
96         virtual bool isFloatingPoint() const;
97 
98       private:
99         Texture *mTexture;
100         GLenum mTarget;
101     };
102 
103     // Helper structure representing a single image layer
104     struct Image
105     {
106         Image();
107         ~Image();
108 
109         GLsizei width;
110         GLsizei height;
111         GLenum format;
112 
113         bool dirty;
114 
115         IDirect3DSurface9 *surface;
116     };
117 
118     static D3DFORMAT selectFormat(GLenum format, GLenum type);
119 
120     void setImage(GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img);
121     bool subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img);
122     void setCompressedImage(GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *img);
123     bool subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *img);
124     void copyNonRenderable(Image *image, GLenum internalFormat, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, IDirect3DSurface9 *renderTarget);
125 
126     void needRenderTarget();
127 
128     GLint creationLevels(GLsizei width, GLsizei height, GLint maxlevel) const;
129     GLint creationLevels(GLsizei size, GLint maxlevel) const;
130 
131     // The pointer returned is weak and it is assumed the derived class will keep a strong pointer until the next createTexture() call.
132     virtual IDirect3DBaseTexture9 *createTexture() = 0;
133     virtual void updateTexture() = 0;
134     virtual IDirect3DBaseTexture9 *convertToRenderTarget() = 0;
135     virtual IDirect3DSurface9 *getRenderTarget(GLenum target) = 0;
136 
137     virtual bool dirtyImageData() const = 0;
138 
139     void dropTexture();
140     void pushTexture(IDirect3DBaseTexture9 *newTexture, bool renderable);
141     void createSurface(GLsizei width, GLsizei height, GLenum format, GLenum type, Image *img);
142 
143     Blit *getBlitter();
144 
145     int levelCount() const;
146 
147     bool isRenderable() const;
148 
149     unsigned int mWidth;
150     unsigned int mHeight;
151     GLenum mMinFilter;
152     GLenum mMagFilter;
153     GLenum mWrapS;
154     GLenum mWrapT;
155     GLenum mType;
156 
157     bool mDirtyMetaData;
158 
159   private:
160     DISALLOW_COPY_AND_ASSIGN(Texture);
161 
162     void loadImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type,
163                        GLint unpackAlignment, const void *input, std::size_t outputPitch, void *output, D3DSURFACE_DESC *description) const;
164 
165     void loadAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
166                             size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
167     void loadAlphaFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
168                                  size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
169     void loadAlphaHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
170                                      size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
171     void loadLuminanceImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
172                                 size_t inputPitch, const void *input, size_t outputPitch, void *output, bool native) const;
173     void loadLuminanceFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
174                                      size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
175     void loadLuminanceHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
176                                          size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
177     void loadLuminanceAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
178                                      size_t inputPitch, const void *input, size_t outputPitch, void *output, bool native) const;
179     void loadLuminanceAlphaFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
180                                           size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
181     void loadLuminanceAlphaHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
182                                               size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
183     void loadRGBUByteImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
184                                size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
185     void loadRGB565ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
186                              size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
187     void loadRGBFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
188                                size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
189     void loadRGBHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
190                                    size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
191     void loadRGBAUByteImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
192                                 size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
193     void loadRGBA4444ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
194                                size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
195     void loadRGBA5551ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
196                                size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
197     void loadRGBAFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
198                                 size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
199     void loadRGBAHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
200                                     size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
201     void loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
202                            size_t inputPitch, const void *input, size_t outputPitch, void *output) const;
203 
204     IDirect3DBaseTexture9 *mBaseTexture; // This is a weak pointer. The derived class is assumed to own a strong pointer.
205 
206     bool mDirty;
207     bool mIsRenderable;
208 };
209 
210 class Texture2D : public Texture
211 {
212   public:
213     explicit Texture2D(GLuint id);
214 
215     ~Texture2D();
216 
217     GLenum getTarget() const;
218     GLenum getFormat() const;
219 
220     void setImage(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
221     void setCompressedImage(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
222     void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
223     void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
224     void copyImage(GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source);
225     void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source);
226 
227     bool isComplete() const;
228     bool isCompressed() const;
229 
230     virtual void generateMipmaps();
231 
232     virtual Renderbuffer *getColorbuffer(GLenum target);
233 
234   private:
235     DISALLOW_COPY_AND_ASSIGN(Texture2D);
236 
237     virtual IDirect3DBaseTexture9 *createTexture();
238     virtual void updateTexture();
239     virtual IDirect3DBaseTexture9 *convertToRenderTarget();
240     virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
241 
242     virtual bool dirtyImageData() const;
243 
244     bool redefineTexture(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum type);
245     void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
246 
247     Image mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
248 
249     IDirect3DTexture9 *mTexture;
250 
251     BindingPointer<Renderbuffer> mColorbufferProxy;
252 };
253 
254 class TextureCubeMap : public Texture
255 {
256   public:
257     explicit TextureCubeMap(GLuint id);
258 
259     ~TextureCubeMap();
260 
261     GLenum getTarget() const;
262     GLenum getFormat() const;
263 
264     void setImagePosX(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
265     void setImageNegX(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
266     void setImagePosY(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
267     void setImageNegY(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
268     void setImagePosZ(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
269     void setImageNegZ(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
270 
271     void setCompressedImage(GLenum face, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
272 
273     void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
274     void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
275     void copyImage(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source);
276     void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source);
277 
278     bool isComplete() const;
279     bool isCompressed() const;
280 
281     virtual void generateMipmaps();
282 
283     virtual Renderbuffer *getColorbuffer(GLenum target);
284 
285   private:
286     DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
287 
288     virtual IDirect3DBaseTexture9 *createTexture();
289     virtual void updateTexture();
290     virtual IDirect3DBaseTexture9 *convertToRenderTarget();
291     virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
292 
293     virtual bool dirtyImageData() const;
294 
295     // faceIdentifier is 0-5 or one of the GL_TEXTURE_CUBE_MAP_* enumerants.
296     // Returns NULL if the call underlying Direct3D call fails.
297     IDirect3DSurface9 *getCubeMapSurface(unsigned int faceIdentifier, unsigned int level);
298 
299     static unsigned int faceIndex(GLenum face);
300 
301     bool isCubeComplete() const;
302 
303     void setImage(int face, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
304     void commitRect(GLenum faceTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
305     bool redefineTexture(GLint level, GLenum internalFormat, GLsizei width);
306 
307     Image mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
308 
309     IDirect3DCubeTexture9 *mTexture;
310 
311     BindingPointer<Renderbuffer> mFaceProxies[6];
312 };
313 }
314 
315 #endif   // LIBGLESV2_TEXTURE_H_
316