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