blob: 53ebf09a619a63665c3c9f7e606f21010ea0e209 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00002//
Geoff Langcec35902014-04-16 10:52:36 -04003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// Texture.cpp: Implements the gl::Texture class and its derived classes
9// Texture2D and TextureCubeMap. Implements GL texture objects and related
10// functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
11
12#include "libGLESv2/Texture.h"
13
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000014#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000015#include "common/mathutil.h"
16#include "common/utilities.h"
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +000017#include "libGLESv2/formatutils.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
19#include "libGLESv2/renderer/Image.h"
Brandon Jones6518fe22014-07-08 15:16:52 -070020#include "libGLESv2/renderer/d3d/TextureStorage.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000021#include "libEGL/Surface.h"
Jamie Madill0e0510f2013-10-10 15:46:23 -040022#include "libGLESv2/renderer/RenderTarget.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000023
24namespace gl
25{
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000026
Brandon Jonesf47bebc2014-07-09 14:28:42 -070027Texture::Texture(GLuint id, GLenum target)
28 : RefCountObject(id),
29 mUsage(GL_NONE),
30 mImmutable(false),
31 mTarget(target)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000032{
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000033}
34
35Texture::~Texture()
36{
37}
38
Geoff Lang4907f2c2013-07-25 12:53:57 -040039GLenum Texture::getTarget() const
40{
41 return mTarget;
42}
43
Geoff Lang63b5f1f2013-09-23 14:52:14 -040044void Texture::setUsage(GLenum usage)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000045{
Geoff Lang63b5f1f2013-09-23 14:52:14 -040046 mUsage = usage;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000047}
48
Brandon Jonesa328d562014-07-01 13:52:40 -070049void Texture::getSamplerStateWithNativeOffset(SamplerState *sampler)
daniel@transgaming.comebf139f2012-10-31 18:07:32 +000050{
51 *sampler = mSamplerState;
Nicolas Capens8de68282014-04-04 11:10:27 -040052
53 // Offset the effective base level by the texture storage's top level
54 rx::TextureStorageInterface *texture = getNativeTexture();
55 int topLevel = texture ? texture->getTopLevel() : 0;
56 sampler->baseLevel = topLevel + mSamplerState.baseLevel;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +000057}
58
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000059GLenum Texture::getUsage() const
60{
61 return mUsage;
62}
63
Jamie Madilld3d2a342013-10-07 10:46:35 -040064GLint Texture::getBaseLevelWidth() const
65{
66 const rx::Image *baseImage = getBaseLevelImage();
67 return (baseImage ? baseImage->getWidth() : 0);
68}
69
70GLint Texture::getBaseLevelHeight() const
71{
72 const rx::Image *baseImage = getBaseLevelImage();
73 return (baseImage ? baseImage->getHeight() : 0);
74}
75
76GLint Texture::getBaseLevelDepth() const
77{
78 const rx::Image *baseImage = getBaseLevelImage();
79 return (baseImage ? baseImage->getDepth() : 0);
80}
81
Jamie Madillb8f8b892014-01-07 10:12:50 -050082// Note: "base level image" is loosely defined to be any image from the base level,
83// where in the base of 2D array textures and cube maps there are several. Don't use
84// the base level image for anything except querying texture format and size.
Jamie Madilld3d2a342013-10-07 10:46:35 -040085GLenum Texture::getBaseLevelInternalFormat() const
86{
87 const rx::Image *baseImage = getBaseLevelImage();
88 return (baseImage ? baseImage->getInternalFormat() : GL_NONE);
89}
90
Brandon Jones6b19b002014-07-16 14:32:05 -070091// Tests for texture sampling completeness
92bool Texture::isSamplerComplete(const SamplerState &samplerState) const
93{
94 return getImplementation()->isSamplerComplete(samplerState);
95}
96
97rx::TextureStorageInterface *Texture::getNativeTexture()
98{
99 return getImplementation()->getNativeTexture();
100}
101
102void Texture::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
103{
104 getImplementation()->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, source);
105}
106
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700107unsigned int Texture::getTextureSerial()
108{
109 rx::TextureStorageInterface *texture = getNativeTexture();
110 return texture ? texture->getTextureSerial() : 0;
111}
112
113bool Texture::isImmutable() const
114{
115 return mImmutable;
116}
117
118int Texture::immutableLevelCount()
119{
120 return (mImmutable ? getNativeTexture()->getStorageInstance()->getLevelCount() : 0);
121}
122
123int Texture::mipLevels() const
124{
125 return log2(std::max(std::max(getBaseLevelWidth(), getBaseLevelHeight()), getBaseLevelDepth())) + 1;
126}
127
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700128Texture2D::Texture2D(rx::Texture2DImpl *impl, GLuint id)
129 : Texture(id, GL_TEXTURE_2D),
130 mTexture(impl)
Jamie Madill22f843a2013-10-24 17:49:36 -0400131{
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000132 mSurface = NULL;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000133}
134
135Texture2D::~Texture2D()
136{
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700137 SafeDelete(mTexture);
138
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000139 if (mSurface)
140 {
141 mSurface->setBoundTexture(NULL);
142 mSurface = NULL;
143 }
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700144}
daniel@transgaming.comd9ec9022012-12-20 20:52:16 +0000145
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000146void Texture2D::setUsage(GLenum usage)
147{
148 mUsage = usage;
149 mTexture->setUsage(usage);
150}
151
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000152GLsizei Texture2D::getWidth(GLint level) const
153{
154 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000155 return mTexture->getImage(level)->getWidth();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000156 else
157 return 0;
158}
159
160GLsizei Texture2D::getHeight(GLint level) const
161{
162 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000163 return mTexture->getImage(level)->getHeight();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000164 else
165 return 0;
166}
167
168GLenum Texture2D::getInternalFormat(GLint level) const
169{
170 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000171 return mTexture->getImage(level)->getInternalFormat();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000172 else
173 return GL_NONE;
174}
175
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000176GLenum Texture2D::getActualFormat(GLint level) const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000177{
178 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000179 return mTexture->getImage(level)->getActualFormat();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000180 else
Geoff Langcbf727a2014-02-10 12:50:45 -0500181 return GL_NONE;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000182}
183
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000184void Texture2D::redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000185{
186 releaseTexImage();
shannon.woods@transgaming.com8a406682013-02-28 23:15:26 +0000187
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000188 mTexture->redefineImage(level, internalformat, width, height);
189}
190
191void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels)
192{
193 GLenum sizedInternalFormat = IsSizedInternalFormat(internalFormat) ? internalFormat
194 : GetSizedInternalFormat(format, type);
195 redefineImage(level, sizedInternalFormat, width, height);
196
197 mTexture->setImage(level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000198}
199
200void Texture2D::bindTexImage(egl::Surface *surface)
201{
202 releaseTexImage();
203
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700204 mTexture->bindTexImage(surface);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000205
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000206 mSurface = surface;
207 mSurface->setBoundTexture(this);
208}
209
210void Texture2D::releaseTexImage()
211{
212 if (mSurface)
213 {
214 mSurface->setBoundTexture(NULL);
215 mSurface = NULL;
216
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700217 mTexture->releaseTexImage();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000218 }
219}
220
221void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels)
222{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000223 // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
224 redefineImage(level, format, width, height);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000225
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000226 mTexture->setCompressedImage(level, format, width, height, imageSize, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000227}
228
Jamie Madill88f18f42013-09-18 14:36:19 -0400229void Texture2D::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 +0000230{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000231 mTexture->subImage(level, xoffset, yoffset, width, height, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000232}
233
234void Texture2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels)
235{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000236 mTexture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000237}
238
239void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
240{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000241 GLenum sizedInternalFormat = IsSizedInternalFormat(format) ? format
242 : GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
243 redefineImage(level, sizedInternalFormat, width, height);
shannon.woods@transgaming.com8a406682013-02-28 23:15:26 +0000244
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000245 mTexture->copyImage(level, format, x, y, width, height, source);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000246}
247
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000248void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
249{
Jamie Madill73b5d062013-10-24 17:49:38 -0400250 mImmutable = true;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000251
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000252 mTexture->storage(levels, internalformat, width, height);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000253}
254
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000255bool Texture2D::isCompressed(GLint level) const
256{
Geoff Lange4a492b2014-06-19 14:14:41 -0400257 return IsFormatCompressed(getInternalFormat(level));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000258}
259
260bool Texture2D::isDepth(GLint level) const
261{
Geoff Lange4a492b2014-06-19 14:14:41 -0400262 return GetDepthBits(getInternalFormat(level)) > 0;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000263}
264
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000265void Texture2D::generateMipmaps()
266{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000267 // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
268 int levelCount = mipLevels();
269 for (int level = 1; level < levelCount; level++)
270 {
271 redefineImage(level, getBaseLevelInternalFormat(),
272 std::max(getBaseLevelWidth() >> level, 1),
273 std::max(getBaseLevelHeight() >> level, 1));
274 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000275
Brandon Jonesf47bebc2014-07-09 14:28:42 -0700276 mTexture->generateMipmaps();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000277}
278
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000279const rx::Image *Texture2D::getBaseLevelImage() const
280{
281 return mTexture->getImage(0);
282}
283
Geoff Lang8040f572013-07-25 16:49:54 -0400284unsigned int Texture2D::getRenderTargetSerial(GLint level)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000285{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000286 return mTexture->getRenderTargetSerial(level);
Geoff Lang8040f572013-07-25 16:49:54 -0400287}
288
289rx::RenderTarget *Texture2D::getRenderTarget(GLint level)
290{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000291 return mTexture->getRenderTarget(level);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000292}
293
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000294rx::RenderTarget *Texture2D::getDepthSencil(GLint level)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000295{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000296 return mTexture->getDepthSencil(level);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000297}
298
Brandon Jones0511e802014-07-14 16:27:26 -0700299TextureCubeMap::TextureCubeMap(rx::TextureCubeImpl *impl, GLuint id)
300 : Texture(id, GL_TEXTURE_CUBE_MAP),
301 mTexture(impl)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000302{
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000303}
304
305TextureCubeMap::~TextureCubeMap()
306{
Brandon Jones0511e802014-07-14 16:27:26 -0700307 SafeDelete(mTexture);
308}
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000309
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000310void TextureCubeMap::setUsage(GLenum usage)
311{
312 mUsage = usage;
313 mTexture->setUsage(usage);
314}
315
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000316GLsizei TextureCubeMap::getWidth(GLenum target, GLint level) const
317{
318 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000319 return mTexture->getImage(target, level)->getWidth();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000320 else
321 return 0;
322}
323
324GLsizei TextureCubeMap::getHeight(GLenum target, GLint level) const
325{
326 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000327 return mTexture->getImage(target, level)->getHeight();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000328 else
329 return 0;
330}
331
332GLenum TextureCubeMap::getInternalFormat(GLenum target, GLint level) const
333{
334 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000335 return mTexture->getImage(target, level)->getInternalFormat();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000336 else
337 return GL_NONE;
338}
339
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000340GLenum TextureCubeMap::getActualFormat(GLenum target, GLint level) const
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000341{
342 if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000343 return mTexture->getImage(target, level)->getActualFormat();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000344 else
Geoff Langcbf727a2014-02-10 12:50:45 -0500345 return GL_NONE;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000346}
347
Geoff Lang005df412013-10-16 14:12:50 -0400348void TextureCubeMap::setImagePosX(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 +0000349{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000350 mTexture->setImage(0, level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000351}
352
Geoff Lang005df412013-10-16 14:12:50 -0400353void TextureCubeMap::setImageNegX(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 +0000354{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000355 mTexture->setImage(1, level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000356}
357
Geoff Lang005df412013-10-16 14:12:50 -0400358void TextureCubeMap::setImagePosY(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 +0000359{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000360 mTexture->setImage(2, level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000361}
362
Geoff Lang005df412013-10-16 14:12:50 -0400363void TextureCubeMap::setImageNegY(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 +0000364{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000365 mTexture->setImage(3, level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000366}
367
Geoff Lang005df412013-10-16 14:12:50 -0400368void TextureCubeMap::setImagePosZ(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 +0000369{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000370 mTexture->setImage(4, level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000371}
372
Geoff Lang005df412013-10-16 14:12:50 -0400373void TextureCubeMap::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 +0000374{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000375 mTexture->setImage(5, level, width, height, internalFormat, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000376}
377
Jamie Madill2db197c2013-10-24 17:49:35 -0400378void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000379{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000380 mTexture->setCompressedImage(target, level, format, width, height, imageSize, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000381}
382
Jamie Madill88f18f42013-09-18 14:36:19 -0400383void TextureCubeMap::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 +0000384{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000385 mTexture->subImage(target, level, xoffset, yoffset, width, height, format, type, unpack, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000386}
387
388void TextureCubeMap::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels)
389{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000390 mTexture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, pixels);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000391}
392
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000393// Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
394bool TextureCubeMap::isCubeComplete() const
395{
Brandon Jones0511e802014-07-14 16:27:26 -0700396 return mTexture->isCubeComplete();
Jamie Madill07edd442013-07-19 16:36:58 -0400397}
398
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000399bool TextureCubeMap::isCompressed(GLenum target, GLint level) const
400{
Geoff Lange4a492b2014-06-19 14:14:41 -0400401 return IsFormatCompressed(getInternalFormat(target, level));
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000402}
403
Geoff Lang8040f572013-07-25 16:49:54 -0400404bool TextureCubeMap::isDepth(GLenum target, GLint level) const
405{
Geoff Lange4a492b2014-06-19 14:14:41 -0400406 return GetDepthBits(getInternalFormat(target, level)) > 0;
Geoff Lang8040f572013-07-25 16:49:54 -0400407}
408
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000409void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
410{
Brandon Jones0511e802014-07-14 16:27:26 -0700411 mTexture->copyImage(target, level, format, x, y, width, height, source);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000412}
413
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000414void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size)
415{
Jamie Madill3c0989c2013-10-24 17:49:39 -0400416 mImmutable = true;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000417
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000418 mTexture->storage(levels, internalformat, size);
419}
420
421void TextureCubeMap::generateMipmaps()
422{
423 mTexture->generateMipmaps();
424}
425
426const rx::Image *TextureCubeMap::getBaseLevelImage() const
427{
428 // Note: if we are not cube-complete, there is no single base level image that can describe all
429 // cube faces, so this method is only well-defined for a cube-complete base level.
430 return mTexture->getImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
Jamie Madill2ebab852013-10-24 17:49:42 -0400431}
432
Jamie Madill2db197c2013-10-24 17:49:35 -0400433unsigned int TextureCubeMap::getRenderTargetSerial(GLenum target, GLint level)
Geoff Lang8040f572013-07-25 16:49:54 -0400434{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000435 return mTexture->getRenderTargetSerial(target, level);
Geoff Lang8040f572013-07-25 16:49:54 -0400436}
437
438rx::RenderTarget *TextureCubeMap::getRenderTarget(GLenum target, GLint level)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000439{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000440 return mTexture->getRenderTarget(target, level);
Geoff Lang8040f572013-07-25 16:49:54 -0400441}
442
443rx::RenderTarget *TextureCubeMap::getDepthStencil(GLenum target, GLint level)
444{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000445 return mTexture->getDepthStencil(target, level);
daniel@transgaming.com690d8ae2012-10-31 19:52:08 +0000446}
447
Brandon Jones78b1acd2014-07-15 15:33:07 -0700448Texture3D::Texture3D(rx::Texture3DImpl *impl, GLuint id)
449 : Texture(id, GL_TEXTURE_3D),
450 mTexture(impl)
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000451{
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000452}
453
454Texture3D::~Texture3D()
455{
Brandon Jones78b1acd2014-07-15 15:33:07 -0700456 SafeDelete(mTexture);
457}
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000458
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000459void Texture3D::setUsage(GLenum usage)
460{
461 mUsage = usage;
462 mTexture->setUsage(usage);
463}
464
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000465GLsizei Texture3D::getWidth(GLint level) const
466{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000467 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getWidth() : 0;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000468}
469
470GLsizei Texture3D::getHeight(GLint level) const
471{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000472 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getHeight() : 0;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000473}
474
475GLsizei Texture3D::getDepth(GLint level) const
476{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000477 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getDepth() : 0;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000478}
479
480GLenum Texture3D::getInternalFormat(GLint level) const
481{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000482 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getInternalFormat() : GL_NONE;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000483}
484
485GLenum Texture3D::getActualFormat(GLint level) const
486{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000487 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getActualFormat() : GL_NONE;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000488}
489
490bool Texture3D::isCompressed(GLint level) const
491{
Geoff Lange4a492b2014-06-19 14:14:41 -0400492 return IsFormatCompressed(getInternalFormat(level));
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000493}
494
495bool Texture3D::isDepth(GLint level) const
496{
Geoff Lange4a492b2014-06-19 14:14:41 -0400497 return GetDepthBits(getInternalFormat(level)) > 0;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000498}
499
Geoff Lang005df412013-10-16 14:12:50 -0400500void Texture3D::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 +0000501{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000502 mTexture->setImage(level, width, height, depth, internalFormat, format, type, unpack, pixels);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000503}
504
505void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels)
506{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000507 mTexture->setCompressedImage(level, format, width, height, depth, imageSize, pixels);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000508}
509
Jamie Madill88f18f42013-09-18 14:36:19 -0400510void Texture3D::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 +0000511{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000512 mTexture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000513}
514
515void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels)
516{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000517 mTexture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000518}
519
520void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
521{
Jamie Madille664e202013-10-24 17:49:40 -0400522 mImmutable = true;
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000523
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000524 mTexture->storage(levels, internalformat, width, height, depth);
525}
526
527void Texture3D::generateMipmaps()
528{
529 mTexture->generateMipmaps();
530}
531
532const rx::Image *Texture3D::getBaseLevelImage() const
533{
534 return mTexture->getImage(0);
Jamie Madill2ebab852013-10-24 17:49:42 -0400535}
536
Geoff Lang8040f572013-07-25 16:49:54 -0400537unsigned int Texture3D::getRenderTargetSerial(GLint level, GLint layer)
538{
Brandon Jones78b1acd2014-07-15 15:33:07 -0700539 return mTexture->getRenderTargetSerial(level, layer);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000540}
541
Jamie Madilla2d4e552013-10-10 15:12:01 -0400542
Geoff Lang8040f572013-07-25 16:49:54 -0400543rx::RenderTarget *Texture3D::getRenderTarget(GLint level, GLint layer)
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000544{
Brandon Jones78b1acd2014-07-15 15:33:07 -0700545 return mTexture->getRenderTarget(level, layer);
Geoff Lang8040f572013-07-25 16:49:54 -0400546}
547
548rx::RenderTarget *Texture3D::getDepthStencil(GLint level, GLint layer)
549{
Brandon Jones78b1acd2014-07-15 15:33:07 -0700550 return mTexture->getDepthStencil(level, layer);
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +0000551}
552
Brandon Jones142ec422014-07-16 10:31:30 -0700553Texture2DArray::Texture2DArray(rx::Texture2DArrayImpl *impl, GLuint id)
554 : Texture(id, GL_TEXTURE_2D_ARRAY),
555 mTexture(impl)
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000556{
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000557}
558
559Texture2DArray::~Texture2DArray()
560{
Brandon Jones142ec422014-07-16 10:31:30 -0700561 SafeDelete(mTexture);
Jamie Madill884a4622013-10-24 17:49:41 -0400562}
563
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000564void Texture2DArray::setUsage(GLenum usage)
565{
566 mUsage = usage;
567 mTexture->setUsage(usage);
568}
569
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000570GLsizei Texture2DArray::getWidth(GLint level) const
571{
Brandon Jones142ec422014-07-16 10:31:30 -0700572 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS && mTexture->getLayerCount(level) > 0) ? mTexture->getImage(level, 0)->getWidth() : 0;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000573}
574
575GLsizei Texture2DArray::getHeight(GLint level) const
576{
Brandon Jones142ec422014-07-16 10:31:30 -0700577 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS && mTexture->getLayerCount(level) > 0) ? mTexture->getImage(level, 0)->getHeight() : 0;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000578}
579
Jamie Madillb8f8b892014-01-07 10:12:50 -0500580GLsizei Texture2DArray::getLayers(GLint level) const
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000581{
Brandon Jones142ec422014-07-16 10:31:30 -0700582 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getLayerCount(level) : 0;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000583}
584
585GLenum Texture2DArray::getInternalFormat(GLint level) const
586{
Brandon Jones142ec422014-07-16 10:31:30 -0700587 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS && mTexture->getLayerCount(level) > 0) ? mTexture->getImage(level, 0)->getInternalFormat() : GL_NONE;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000588}
589
590GLenum Texture2DArray::getActualFormat(GLint level) const
591{
Brandon Jones142ec422014-07-16 10:31:30 -0700592 return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS && mTexture->getLayerCount(level) > 0) ? mTexture->getImage(level, 0)->getActualFormat() : GL_NONE;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000593}
594
595bool Texture2DArray::isCompressed(GLint level) const
596{
Geoff Lange4a492b2014-06-19 14:14:41 -0400597 return IsFormatCompressed(getInternalFormat(level));
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000598}
599
600bool Texture2DArray::isDepth(GLint level) const
601{
Geoff Lange4a492b2014-06-19 14:14:41 -0400602 return GetDepthBits(getInternalFormat(level)) > 0;
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000603}
604
Geoff Lang005df412013-10-16 14:12:50 -0400605void Texture2DArray::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 +0000606{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000607 mTexture->setImage(level, width, height, depth, internalFormat, format, type, unpack, pixels);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000608}
609
610void Texture2DArray::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels)
611{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000612 mTexture->setCompressedImage(level, format, width, height, depth, imageSize, pixels);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000613}
614
Jamie Madill88f18f42013-09-18 14:36:19 -0400615void Texture2DArray::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 +0000616{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000617 mTexture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000618}
619
620void Texture2DArray::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels)
621{
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000622 mTexture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000623}
624
625void Texture2DArray::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
626{
Jamie Madill884a4622013-10-24 17:49:41 -0400627 mImmutable = true;
Brandon Jones142ec422014-07-16 10:31:30 -0700628
Jamie Madillf8bdfeb2014-07-31 18:31:28 +0000629 mTexture->storage(levels, internalformat, width, height, depth);
630}
631
632void Texture2DArray::generateMipmaps()
633{
634 mTexture->generateMipmaps();
635}
636
637const rx::Image *Texture2DArray::getBaseLevelImage() const
638{
639 return (mTexture->getLayerCount(0) > 0 ? mTexture->getImage(0, 0) : NULL);
Jamie Madill2ebab852013-10-24 17:49:42 -0400640}
641
Jamie Madille83d1a92013-10-24 17:49:33 -0400642unsigned int Texture2DArray::getRenderTargetSerial(GLint level, GLint layer)
Geoff Lang8040f572013-07-25 16:49:54 -0400643{
Brandon Jones142ec422014-07-16 10:31:30 -0700644 return mTexture->getRenderTargetSerial(level, layer);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000645}
646
Geoff Lang8040f572013-07-25 16:49:54 -0400647rx::RenderTarget *Texture2DArray::getRenderTarget(GLint level, GLint layer)
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000648{
Brandon Jones142ec422014-07-16 10:31:30 -0700649 return mTexture->getRenderTarget(level, layer);
Geoff Lang8040f572013-07-25 16:49:54 -0400650}
651
652rx::RenderTarget *Texture2DArray::getDepthStencil(GLint level, GLint layer)
653{
Brandon Jones142ec422014-07-16 10:31:30 -0700654 return mTexture->getDepthStencil(level, layer);
shannon.woods%transgaming.com@gtempaccount.com7625f792013-04-13 03:46:07 +0000655}
656
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000657}