Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / renderer / d3d / TextureD3D.h
1 //
2 // Copyright 2014 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 // TextureD3D.h: Implementations of the Texture interfaces shared betweeen the D3D backends.
8
9 #ifndef LIBGLESV2_RENDERER_TEXTURED3D_H_
10 #define LIBGLESV2_RENDERER_TEXTURED3D_H_
11
12 #include "libGLESv2/renderer/TextureImpl.h"
13 #include "libGLESv2/angletypes.h"
14 #include "libGLESv2/Constants.h"
15
16 namespace gl
17 {
18 class Framebuffer;
19 }
20
21 namespace rx
22 {
23
24 class Image;
25 class ImageD3D;
26 class Renderer;
27 class RenderTarget;
28 class TextureStorage;
29
30 class TextureD3D : public TextureImpl
31 {
32   public:
33     TextureD3D(Renderer *renderer);
34     virtual ~TextureD3D();
35
36     static TextureD3D *makeTextureD3D(TextureImpl *texture);
37
38     TextureStorage *getNativeTexture();
39
40     virtual void setUsage(GLenum usage) { mUsage = usage; }
41     bool hasDirtyImages() const { return mDirtyImages; }
42     void resetDirty() { mDirtyImages = false; }
43
44     GLint getBaseLevelWidth() const;
45     GLint getBaseLevelHeight() const;
46     GLint getBaseLevelDepth() const;
47     GLenum getBaseLevelInternalFormat() const;
48
49     bool isImmutable() const { return mImmutable; }
50
51     virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT) = 0;
52     virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index) = 0;
53
54     // Returns an iterator over all "Images" for this particular Texture.
55     virtual gl::ImageIndexIterator imageIterator() const = 0;
56
57     // Returns an ImageIndex for a particular "Image". 3D Textures do not have images for
58     // slices of their depth texures, so 3D textures ignore the layer parameter.
59     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
60     virtual bool isValidIndex(const gl::ImageIndex &index) const = 0;
61
62     virtual gl::Error generateMipmaps();
63     TextureStorage *getStorage();
64     Image *getBaseLevelImage() const;
65
66   protected:
67     gl::Error setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, const gl::ImageIndex &index);
68     gl::Error subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
69                        GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels, const gl::ImageIndex &index);
70     gl::Error setCompressedImage(const gl::PixelUnpackState &unpack, GLsizei imageSize, const void *pixels, Image *image);
71     gl::Error subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
72                                  GLenum format, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels, Image *image);
73     bool isFastUnpackable(const gl::PixelUnpackState &unpack, GLenum sizedInternalFormat);
74     gl::Error fastUnpackPixels(const gl::PixelUnpackState &unpack, const void *pixels, const gl::Box &destArea,
75                                GLenum sizedInternalFormat, GLenum type, RenderTarget *destRenderTarget);
76
77     GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
78     int mipLevels() const;
79     virtual void initMipmapsImages() = 0;
80     bool isBaseImageZeroSize() const;
81     virtual bool isImageComplete(const gl::ImageIndex &index) const = 0;
82
83     bool canCreateRenderTargetForImage(const gl::ImageIndex &index) const;
84     virtual gl::Error ensureRenderTarget();
85
86     virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const = 0;
87     virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage) = 0;
88     gl::Error commitRegion(const gl::ImageIndex &index, const gl::Box &region);
89
90     Renderer *mRenderer;
91
92     GLenum mUsage;
93
94     bool mDirtyImages;
95
96     bool mImmutable;
97     TextureStorage *mTexStorage;
98
99   private:
100     DISALLOW_COPY_AND_ASSIGN(TextureD3D);
101
102     virtual gl::Error initializeStorage(bool renderTarget) = 0;
103
104     virtual gl::Error updateStorage() = 0;
105
106     bool shouldUseSetData(const Image *image) const;
107 };
108
109 class TextureD3D_2D : public TextureD3D
110 {
111   public:
112     TextureD3D_2D(Renderer *renderer);
113     virtual ~TextureD3D_2D();
114
115     virtual Image *getImage(int level, int layer) const;
116     virtual Image *getImage(const gl::ImageIndex &index) const;
117     virtual GLsizei getLayerCount(int level) const;
118
119     GLsizei getWidth(GLint level) const;
120     GLsizei getHeight(GLint level) const;
121     GLenum getInternalFormat(GLint level) const;
122     GLenum getActualFormat(GLint level) const;
123     bool isDepth(GLint level) const;
124
125     virtual gl::Error setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
126     virtual gl::Error setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
127     virtual gl::Error subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
128     virtual gl::Error subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
129     virtual gl::Error copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
130     virtual gl::Error copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
131     virtual gl::Error storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
132
133     virtual void bindTexImage(egl::Surface *surface);
134     virtual void releaseTexImage();
135
136     virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
137     virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
138
139     virtual gl::ImageIndexIterator imageIterator() const;
140     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
141     virtual bool isValidIndex(const gl::ImageIndex &index) const;
142
143   private:
144     DISALLOW_COPY_AND_ASSIGN(TextureD3D_2D);
145
146     virtual gl::Error initializeStorage(bool renderTarget);
147     virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const;
148     virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
149
150     virtual gl::Error updateStorage();
151     virtual void initMipmapsImages();
152
153     bool isValidLevel(int level) const;
154     bool isLevelComplete(int level) const;
155     virtual bool isImageComplete(const gl::ImageIndex &index) const;
156
157     gl::Error updateStorageLevel(int level);
158
159     void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height);
160
161     ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
162 };
163
164 class TextureD3D_Cube : public TextureD3D
165 {
166   public:
167     TextureD3D_Cube(Renderer *renderer);
168     virtual ~TextureD3D_Cube();
169
170     virtual Image *getImage(int level, int layer) const;
171     virtual Image *getImage(const gl::ImageIndex &index) const;
172     virtual GLsizei getLayerCount(int level) const;
173
174     virtual bool hasDirtyImages() const { return mDirtyImages; }
175     virtual void resetDirty() { mDirtyImages = false; }
176     virtual void setUsage(GLenum usage) { mUsage = usage; }
177
178     GLenum getInternalFormat(GLint level, GLint layer) const;
179     bool isDepth(GLint level, GLint layer) const;
180
181     virtual gl::Error setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
182     virtual gl::Error setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
183     virtual gl::Error subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
184     virtual gl::Error subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
185     virtual gl::Error copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
186     virtual gl::Error copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
187     virtual gl::Error storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
188
189     virtual void bindTexImage(egl::Surface *surface);
190     virtual void releaseTexImage();
191
192     virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
193     virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
194
195     virtual gl::ImageIndexIterator imageIterator() const;
196     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
197     virtual bool isValidIndex(const gl::ImageIndex &index) const;
198
199   private:
200     DISALLOW_COPY_AND_ASSIGN(TextureD3D_Cube);
201
202     virtual gl::Error initializeStorage(bool renderTarget);
203     virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outTexStorage) const;
204     virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
205
206     virtual gl::Error updateStorage();
207     virtual void initMipmapsImages();
208
209     bool isValidFaceLevel(int faceIndex, int level) const;
210     bool isFaceLevelComplete(int faceIndex, int level) const;
211     bool isCubeComplete() const;
212     virtual bool isImageComplete(const gl::ImageIndex &index) const;
213     gl::Error updateStorageFaceLevel(int faceIndex, int level);
214
215     void redefineImage(int faceIndex, GLint level, GLenum internalformat, GLsizei width, GLsizei height);
216
217     ImageD3D *mImageArray[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
218 };
219
220 class TextureD3D_3D : public TextureD3D
221 {
222   public:
223     TextureD3D_3D(Renderer *renderer);
224     virtual ~TextureD3D_3D();
225
226     virtual Image *getImage(int level, int layer) const;
227     virtual Image *getImage(const gl::ImageIndex &index) const;
228     virtual GLsizei getLayerCount(int level) const;
229
230     GLsizei getWidth(GLint level) const;
231     GLsizei getHeight(GLint level) const;
232     GLsizei getDepth(GLint level) const;
233     GLenum getInternalFormat(GLint level) const;
234     bool isDepth(GLint level) const;
235
236     virtual gl::Error setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
237     virtual gl::Error setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
238     virtual gl::Error subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
239     virtual gl::Error subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
240     virtual gl::Error copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
241     virtual gl::Error copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
242     virtual gl::Error storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
243
244     virtual void bindTexImage(egl::Surface *surface);
245     virtual void releaseTexImage();
246
247     virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
248     virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
249
250     virtual gl::ImageIndexIterator imageIterator() const;
251     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
252     virtual bool isValidIndex(const gl::ImageIndex &index) const;
253
254   private:
255     DISALLOW_COPY_AND_ASSIGN(TextureD3D_3D);
256
257     virtual gl::Error initializeStorage(bool renderTarget);
258     virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outStorage) const;
259     virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
260
261     virtual gl::Error updateStorage();
262     virtual void initMipmapsImages();
263
264     bool isValidLevel(int level) const;
265     bool isLevelComplete(int level) const;
266     virtual bool isImageComplete(const gl::ImageIndex &index) const;
267     gl::Error updateStorageLevel(int level);
268
269     void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
270
271     ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
272 };
273
274 class TextureD3D_2DArray : public TextureD3D
275 {
276   public:
277     TextureD3D_2DArray(Renderer *renderer);
278     virtual ~TextureD3D_2DArray();
279
280     virtual Image *getImage(int level, int layer) const;
281     virtual Image *getImage(const gl::ImageIndex &index) const;
282     virtual GLsizei getLayerCount(int level) const;
283
284     GLsizei getWidth(GLint level) const;
285     GLsizei getHeight(GLint level) const;
286     GLenum getInternalFormat(GLint level) const;
287     bool isDepth(GLint level) const;
288
289     virtual gl::Error setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
290     virtual gl::Error setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
291     virtual gl::Error subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels);
292     virtual gl::Error subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const gl::PixelUnpackState &unpack, const void *pixels);
293     virtual gl::Error copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
294     virtual gl::Error copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
295     virtual gl::Error storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
296
297     virtual void bindTexImage(egl::Surface *surface);
298     virtual void releaseTexImage();
299
300     virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
301     virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index);
302
303     virtual gl::ImageIndexIterator imageIterator() const;
304     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
305     virtual bool isValidIndex(const gl::ImageIndex &index) const;
306
307   private:
308     DISALLOW_COPY_AND_ASSIGN(TextureD3D_2DArray);
309
310     virtual gl::Error initializeStorage(bool renderTarget);
311     virtual gl::Error createCompleteStorage(bool renderTarget, TextureStorage **outStorage) const;
312     virtual gl::Error setCompleteTexStorage(TextureStorage *newCompleteTexStorage);
313
314     virtual gl::Error updateStorage();
315     virtual void initMipmapsImages();
316
317     bool isValidLevel(int level) const;
318     bool isLevelComplete(int level) const;
319     virtual bool isImageComplete(const gl::ImageIndex &index) const;
320     gl::Error updateStorageLevel(int level);
321
322     void deleteImages();
323     void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
324
325     // Storing images as an array of single depth textures since D3D11 treats each array level of a
326     // Texture2D object as a separate subresource.  Each layer would have to be looped over
327     // to update all the texture layers since they cannot all be updated at once and it makes the most
328     // sense for the Image class to not have to worry about layer subresource as well as mip subresources.
329     GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
330     ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
331 };
332
333 }
334
335 #endif // LIBGLESV2_RENDERER_TEXTURED3D_H_