blob: cd4682e6a8b1c7666ff3ccb1b7b80df45b7d3e21 [file] [log] [blame]
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00001//
shannon.woods@transgaming.come2e97982013-02-28 23:18:50 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00003// 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
shannon.woods%transgaming.com@gtempaccount.comf26ddae2013-04-13 03:29:13 +000017#include <GLES3/gl3.h>
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000018#include <GLES2/gl2.h>
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000019
20#include "common/debug.h"
21#include "common/RefCountObject.h"
daniel@transgaming.com8bc304a2013-01-11 04:07:42 +000022#include "libGLESv2/angletypes.h"
Geoff Lang8040f572013-07-25 16:49:54 -040023#include "libGLESv2/RenderbufferProxySet.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000024
25namespace egl
26{
27class Surface;
28}
29
daniel@transgaming.com370482e2012-11-28 19:32:13 +000030namespace rx
31{
32class Renderer;
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000033class TextureStorageInterface;
34class TextureStorageInterface2D;
35class TextureStorageInterfaceCube;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +000036class TextureStorageInterface3D;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +000037class TextureStorageInterface2DArray;
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000038class RenderTarget;
39class Image;
daniel@transgaming.com370482e2012-11-28 19:32:13 +000040}
41
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000042namespace gl
43{
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000044class Framebuffer;
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000045class Renderbuffer;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000046
47enum
48{
49 // These are the maximums the implementation can support
50 // The actual GL caps are limited by the device caps
51 // and should be queried from the Context
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +000052 IMPLEMENTATION_MAX_2D_TEXTURE_SIZE = 16384,
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000053 IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384,
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +000054 IMPLEMENTATION_MAX_3D_TEXTURE_SIZE = 2048,
shannon.woods%transgaming.com@gtempaccount.coma98a8112013-04-13 03:45:57 +000055 IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS = 2048,
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000056
57 IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15 // 1+log2 of MAX_TEXTURE_SIZE
58};
59
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000060class Texture : public RefCountObject
61{
62 public:
Geoff Lang4907f2c2013-07-25 12:53:57 -040063 Texture(rx::Renderer *renderer, GLuint id, GLenum target);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000064
65 virtual ~Texture();
66
Geoff Lang8040f572013-07-25 16:49:54 -040067 void addProxyRef(const Renderbuffer *proxy);
68 void releaseProxy(const Renderbuffer *proxy);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000069
Geoff Lang4907f2c2013-07-25 12:53:57 -040070 GLenum getTarget() const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000071
Geoff Lang63b5f1f2013-09-23 14:52:14 -040072 void setMinFilter(GLenum filter);
73 void setMagFilter(GLenum filter);
74 void setWrapS(GLenum wrap);
75 void setWrapT(GLenum wrap);
76 void setWrapR(GLenum wrap);
77 void setMaxAnisotropy(float textureMaxAnisotropy, float contextMaxAnisotropy);
78 void setCompareMode(GLenum mode);
79 void setCompareFunc(GLenum func);
80 void setUsage(GLenum usage);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000081
82 GLenum getMinFilter() const;
83 GLenum getMagFilter() const;
84 GLenum getWrapS() const;
85 GLenum getWrapT() const;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +000086 GLenum getWrapR() const;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +000087 float getMaxAnisotropy() const;
daniel@transgaming.comebf139f2012-10-31 18:07:32 +000088 int getLodOffset();
89 void getSamplerState(SamplerState *sampler);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000090 GLenum getUsage() const;
shannonwoods@chromium.org8757c062013-05-30 00:14:24 +000091 virtual int levelCount() = 0;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000092
Jamie Madilld3d2a342013-10-07 10:46:35 -040093 GLint getBaseLevelWidth() const;
94 GLint getBaseLevelHeight() const;
95 GLint getBaseLevelDepth() const;
96 GLenum getBaseLevelInternalFormat() const;
97
Jamie Madillf8989902013-07-19 16:36:58 -040098 virtual bool isSamplerComplete(const SamplerState &samplerState) const = 0;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000099
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000100 rx::TextureStorageInterface *getNativeTexture();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000101
102 virtual void generateMipmaps() = 0;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000103 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000104
105 bool hasDirtyParameters() const;
106 bool hasDirtyImages() const;
107 void resetDirty();
108 unsigned int getTextureSerial();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000109
110 bool isImmutable() const;
111
112 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.
113
114 protected:
Jamie Madill88f18f42013-09-18 14:36:19 -0400115 void setImage(const PixelUnpackState &unpack, GLenum type, const void *pixels, rx::Image *image);
shannon.woods%transgaming.com@gtempaccount.com4760c562013-04-13 03:42:30 +0000116 bool subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
Jamie Madill88f18f42013-09-18 14:36:19 -0400117 GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels, rx::Image *image);
daniel@transgaming.com31b13e12012-11-28 19:34:30 +0000118 void setCompressedImage(GLsizei imageSize, const void *pixels, rx::Image *image);
shannon.woods%transgaming.com@gtempaccount.com4760c562013-04-13 03:42:30 +0000119 bool subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
120 GLenum format, GLsizei imageSize, const void *pixels, rx::Image *image);
Geoff Lang005df412013-10-16 14:12:50 -0400121 bool isFastUnpackable(const PixelUnpackState &unpack, GLenum sizedInternalFormat);
Jamie Madill1beb1db2013-09-18 14:36:28 -0400122 bool fastUnpackPixels(const PixelUnpackState &unpack, const void *pixels, const Box &destArea,
Jamie Madill8cc7d972013-10-10 15:51:55 -0400123 GLenum sizedInternalFormat, GLenum type, rx::RenderTarget *destRenderTarget);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000124
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000125 GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000126 GLint creationLevels(GLsizei width, GLsizei height) const;
127 GLint creationLevels(GLsizei size) const;
Jamie Madill22f843a2013-10-24 17:49:36 -0400128 int mipLevels() const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000129
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000130 virtual void createTexture() = 0;
Jamie Madill169d1112013-10-24 17:49:37 -0400131 virtual void updateStorage() = 0;
Jamie Madille83d1a92013-10-24 17:49:33 -0400132 virtual bool ensureRenderTarget() = 0;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000133
daniel@transgaming.com370482e2012-11-28 19:32:13 +0000134 rx::Renderer *mRenderer;
135
daniel@transgaming.comebf139f2012-10-31 18:07:32 +0000136 SamplerState mSamplerState;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000137 GLenum mUsage;
138
139 bool mDirtyImages;
140
141 bool mImmutable;
142
Geoff Lang4907f2c2013-07-25 12:53:57 -0400143 GLenum mTarget;
144
Geoff Lang8040f572013-07-25 16:49:54 -0400145 // A specific internal reference count is kept for colorbuffer proxy references,
146 // because, as the renderbuffer acting as proxy will maintain a binding pointer
147 // back to this texture, there would be a circular reference if we used a binding
148 // pointer here. This reference count will cause the pointer to be set to NULL if
149 // the count drops to zero, but will not cause deletion of the Renderbuffer.
150 RenderbufferProxySet mRenderbufferProxies;
151
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000152 private:
153 DISALLOW_COPY_AND_ASSIGN(Texture);
154
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000155 virtual rx::TextureStorageInterface *getStorage(bool renderTarget) = 0;
Jamie Madilld3d2a342013-10-07 10:46:35 -0400156 virtual const rx::Image *getBaseLevelImage() const = 0;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000157};
158
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000159class Texture2D : public Texture
160{
161 public:
daniel@transgaming.com370482e2012-11-28 19:32:13 +0000162 Texture2D(rx::Renderer *renderer, GLuint id);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000163
164 ~Texture2D();
165
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000166 GLsizei getWidth(GLint level) const;
167 GLsizei getHeight(GLint level) const;
168 GLenum getInternalFormat(GLint level) const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000169 GLenum getActualFormat(GLint level) const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000170 bool isCompressed(GLint level) const;
171 bool isDepth(GLint level) const;
172
Geoff Lang005df412013-10-16 14:12:50 -0400173 void setImage(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000174 void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
Jamie Madill88f18f42013-09-18 14:36:19 -0400175 void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000176 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
177 void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000178 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000179 void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
180
Jamie Madillf8989902013-07-19 16:36:58 -0400181 virtual bool isSamplerComplete(const SamplerState &samplerState) const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000182 virtual void bindTexImage(egl::Surface *surface);
183 virtual void releaseTexImage();
184
185 virtual void generateMipmaps();
186
Geoff Lang8040f572013-07-25 16:49:54 -0400187 Renderbuffer *getRenderbuffer(GLint level);
188 unsigned int getRenderTargetSerial(GLint level);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000189
190 protected:
191 friend class RenderbufferTexture2D;
Geoff Lang8040f572013-07-25 16:49:54 -0400192 rx::RenderTarget *getRenderTarget(GLint level);
193 rx::RenderTarget *getDepthSencil(GLint level);
daniel@transgaming.com690d8ae2012-10-31 19:52:08 +0000194 virtual int levelCount();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000195
196 private:
197 DISALLOW_COPY_AND_ASSIGN(Texture2D);
198
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000199 virtual void createTexture();
Jamie Madill169d1112013-10-24 17:49:37 -0400200 virtual void updateStorage();
Jamie Madille83d1a92013-10-24 17:49:33 -0400201 virtual bool ensureRenderTarget();
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000202 virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
Jamie Madilld3d2a342013-10-07 10:46:35 -0400203 virtual const rx::Image *getBaseLevelImage() const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000204
205 bool isMipmapComplete() const;
Jamie Madill07edd442013-07-19 16:36:58 -0400206 bool isLevelComplete(int level) const;
Jamie Madill169d1112013-10-24 17:49:37 -0400207 void updateStorageLevel(int level);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000208
Geoff Lang005df412013-10-16 14:12:50 -0400209 void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000210 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
211
daniel@transgaming.comd9ec9022012-12-20 20:52:16 +0000212 rx::Image *mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000213
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000214 rx::TextureStorageInterface2D *mTexStorage;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000215 egl::Surface *mSurface;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000216};
217
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000218class TextureCubeMap : public Texture
219{
220 public:
daniel@transgaming.com370482e2012-11-28 19:32:13 +0000221 TextureCubeMap(rx::Renderer *renderer, GLuint id);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000222
223 ~TextureCubeMap();
224
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000225 GLsizei getWidth(GLenum target, GLint level) const;
226 GLsizei getHeight(GLenum target, GLint level) const;
227 GLenum getInternalFormat(GLenum target, GLint level) const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000228 GLenum getActualFormat(GLenum target, GLint level) const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000229 bool isCompressed(GLenum target, GLint level) const;
Geoff Lang8040f572013-07-25 16:49:54 -0400230 bool isDepth(GLenum target, GLint level) const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000231
Geoff Lang005df412013-10-16 14:12:50 -0400232 void setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
233 void setImageNegX(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
234 void setImagePosY(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
235 void setImageNegY(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
236 void setImagePosZ(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
237 void setImageNegZ(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000238
Jamie Madill2db197c2013-10-24 17:49:35 -0400239 void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000240
Jamie Madill88f18f42013-09-18 14:36:19 -0400241 void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000242 void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
243 void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000244 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000245 void storage(GLsizei levels, GLenum internalformat, GLsizei size);
246
Jamie Madillf8989902013-07-19 16:36:58 -0400247 virtual bool isSamplerComplete(const SamplerState &samplerState) const;
Jamie Madillc1f8b162013-10-07 10:46:38 -0400248 bool isCubeComplete() const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000249
250 virtual void generateMipmaps();
251
Geoff Lang8040f572013-07-25 16:49:54 -0400252 Renderbuffer *getRenderbuffer(GLenum target, GLint level);
Jamie Madill2db197c2013-10-24 17:49:35 -0400253 unsigned int getRenderTargetSerial(GLenum target, GLint level);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000254
Jamie Madill2db197c2013-10-24 17:49:35 -0400255 static int targetToIndex(GLenum target);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000256
257 protected:
258 friend class RenderbufferTextureCubeMap;
Geoff Lang8040f572013-07-25 16:49:54 -0400259 rx::RenderTarget *getRenderTarget(GLenum target, GLint level);
260 rx::RenderTarget *getDepthStencil(GLenum target, GLint level);
daniel@transgaming.com690d8ae2012-10-31 19:52:08 +0000261 virtual int levelCount();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000262
263 private:
264 DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
265
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000266 virtual void createTexture();
Jamie Madill169d1112013-10-24 17:49:37 -0400267 virtual void updateStorage();
Jamie Madille83d1a92013-10-24 17:49:33 -0400268 virtual bool ensureRenderTarget();
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000269 virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
Jamie Madilld3d2a342013-10-07 10:46:35 -0400270 virtual const rx::Image *getBaseLevelImage() const;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000271
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000272 bool isMipmapCubeComplete() const;
Jamie Madill2db197c2013-10-24 17:49:35 -0400273 bool isFaceLevelComplete(int faceIndex, int level) const;
Jamie Madill169d1112013-10-24 17:49:37 -0400274 void updateStorageFaceLevel(int faceIndex, int level);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000275
Geoff Lang005df412013-10-16 14:12:50 -0400276 void setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000277 void commitRect(int faceIndex, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
Geoff Lang005df412013-10-16 14:12:50 -0400278 void redefineImage(int faceIndex, GLint level, GLenum internalformat, GLsizei width, GLsizei height);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000279
daniel@transgaming.comd9ec9022012-12-20 20:52:16 +0000280 rx::Image *mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000281
daniel@transgaming.com87705f82012-12-20 21:10:45 +0000282 rx::TextureStorageInterfaceCube *mTexStorage;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000283};
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000284
285class Texture3D : public Texture
286{
287 public:
288 Texture3D(rx::Renderer *renderer, GLuint id);
289
290 ~Texture3D();
291
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000292 GLsizei getWidth(GLint level) const;
293 GLsizei getHeight(GLint level) const;
294 GLsizei getDepth(GLint level) const;
295 GLenum getInternalFormat(GLint level) const;
296 GLenum getActualFormat(GLint level) const;
297 bool isCompressed(GLint level) const;
298 bool isDepth(GLint level) const;
299
Geoff Lang005df412013-10-16 14:12:50 -0400300 void setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000301 void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels);
Jamie Madill88f18f42013-09-18 14:36:19 -0400302 void subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000303 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels);
304 void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
305
306 virtual void generateMipmaps();
307 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
308
Jamie Madillf8989902013-07-19 16:36:58 -0400309 virtual bool isSamplerComplete(const SamplerState &samplerState) const;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000310 virtual bool isMipmapComplete() const;
311
Geoff Lang8040f572013-07-25 16:49:54 -0400312 Renderbuffer *getRenderbuffer(GLint level, GLint layer);
313 unsigned int getRenderTargetSerial(GLint level, GLint layer);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000314
315 protected:
Geoff Langd5d8e392013-07-25 16:53:03 -0400316 friend class RenderbufferTexture3DLayer;
Jamie Madilla2d4e552013-10-10 15:12:01 -0400317 rx::RenderTarget *getRenderTarget(GLint level);
Geoff Lang8040f572013-07-25 16:49:54 -0400318 rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
319 rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000320 virtual int levelCount();
321
322 private:
323 DISALLOW_COPY_AND_ASSIGN(Texture3D);
324
325 virtual void createTexture();
Jamie Madill169d1112013-10-24 17:49:37 -0400326 virtual void updateStorage();
Jamie Madille83d1a92013-10-24 17:49:33 -0400327 virtual bool ensureRenderTarget();
328
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000329 virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
Jamie Madilld3d2a342013-10-07 10:46:35 -0400330 virtual const rx::Image *getBaseLevelImage() const;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000331
Geoff Lang005df412013-10-16 14:12:50 -0400332 void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000333 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
334
Jamie Madill07edd442013-07-19 16:36:58 -0400335 bool isLevelComplete(int level) const;
Jamie Madill169d1112013-10-24 17:49:37 -0400336 void updateStorageLevel(int level);
Jamie Madill07edd442013-07-19 16:36:58 -0400337
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000338 rx::Image *mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
339
340 rx::TextureStorageInterface3D *mTexStorage;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000341};
342
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000343class Texture2DArray : public Texture
344{
345 public:
346 Texture2DArray(rx::Renderer *renderer, GLuint id);
347
348 ~Texture2DArray();
349
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000350 GLsizei getWidth(GLint level) const;
351 GLsizei getHeight(GLint level) const;
352 GLsizei getDepth(GLint level) const;
353 GLenum getInternalFormat(GLint level) const;
354 GLenum getActualFormat(GLint level) const;
355 bool isCompressed(GLint level) const;
356 bool isDepth(GLint level) const;
357
Geoff Lang005df412013-10-16 14:12:50 -0400358 void setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000359 void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels);
Jamie Madill88f18f42013-09-18 14:36:19 -0400360 void subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000361 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels);
362 void storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
363
364 virtual void generateMipmaps();
365 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
366
Jamie Madillf8989902013-07-19 16:36:58 -0400367 virtual bool isSamplerComplete(const SamplerState &samplerState) const;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000368 virtual bool isMipmapComplete() const;
369
Geoff Lang8040f572013-07-25 16:49:54 -0400370 Renderbuffer *getRenderbuffer(GLint level, GLint layer);
371 unsigned int getRenderTargetSerial(GLint level, GLint layer);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000372
373 protected:
Geoff Langd5d8e392013-07-25 16:53:03 -0400374 friend class RenderbufferTexture2DArrayLayer;
Geoff Lang8040f572013-07-25 16:49:54 -0400375 rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
376 rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000377 virtual int levelCount();
378
379 private:
380 DISALLOW_COPY_AND_ASSIGN(Texture2DArray);
381
382 virtual void createTexture();
Jamie Madill169d1112013-10-24 17:49:37 -0400383 virtual void updateStorage();
Jamie Madille83d1a92013-10-24 17:49:33 -0400384 virtual bool ensureRenderTarget();
385
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000386 virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
Jamie Madilld3d2a342013-10-07 10:46:35 -0400387 virtual const rx::Image *getBaseLevelImage() const;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000388
Geoff Lang005df412013-10-16 14:12:50 -0400389 void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000390 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLint layerTarget, GLsizei width, GLsizei height);
391
Jamie Madill07edd442013-07-19 16:36:58 -0400392 bool isLevelComplete(int level) const;
Jamie Madill169d1112013-10-24 17:49:37 -0400393 void updateStorageLevel(int level);
Jamie Madill07edd442013-07-19 16:36:58 -0400394
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000395 // Storing images as an array of single depth textures since D3D11 treats each array level of a
396 // Texture2D object as a separate subresource. Each layer would have to be looped over
397 // to update all the texture layers since they cannot all be updated at once and it makes the most
398 // sense for the Image class to not have to worry about layer subresource as well as mip subresources.
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000399 GLsizei mLayerCounts[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
shannonwoods@chromium.org644f7662013-05-30 00:02:07 +0000400 rx::Image **mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000401
402 rx::TextureStorageInterface2DArray *mTexStorage;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000403};
404
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000405}
406
jbauman@chromium.org68715282012-07-12 23:28:41 +0000407#endif // LIBGLESV2_TEXTURE_H_