Commit 691e58cd by Geoff Lang

Merge all gl::Texture* classes.

The validation for sampler completeness had a lot of duplicated code. The special cases have been merged into the base class by checking mTarget. BUG=angle:681 Change-Id: I11d94c1432f8fc70a1edaaf8228bbc43c3c8fff3 Reviewed-on: https://chromium-review.googlesource.com/236932Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 562e81bb
...@@ -343,9 +343,27 @@ int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsig ...@@ -343,9 +343,27 @@ int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsig
return -1; return -1;
} }
bool IsCubemapTextureTarget(GLenum target) META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1);
META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2);
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3);
META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4);
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 5);
bool IsCubeMapTextureTarget(GLenum target)
{
return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
}
size_t CubeMapTextureTargetToLayerIndex(GLenum target)
{
ASSERT(IsCubeMapTextureTarget(target));
return target - static_cast<size_t>(FirstCubeMapTextureTarget);
}
GLenum LayerIndexToCubeMapTextureTarget(size_t index)
{ {
return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z); ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
} }
bool IsTriangleMode(GLenum drawMode) bool IsTriangleMode(GLenum drawMode)
......
...@@ -34,7 +34,11 @@ int VariableSortOrder(GLenum type); ...@@ -34,7 +34,11 @@ int VariableSortOrder(GLenum type);
int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize); int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize);
bool IsCubemapTextureTarget(GLenum target); static const GLenum FirstCubeMapTextureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
static const GLenum LastCubeMapTextureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
bool IsCubeMapTextureTarget(GLenum target);
size_t CubeMapTextureTargetToLayerIndex(GLenum target);
GLenum LayerIndexToCubeMapTextureTarget(size_t index);
bool IsTriangleMode(GLenum drawMode); bool IsTriangleMode(GLenum drawMode);
......
...@@ -64,19 +64,19 @@ Context::Context(int clientVersion, const Context *shareContext, rx::Renderer *r ...@@ -64,19 +64,19 @@ Context::Context(int clientVersion, const Context *shareContext, rx::Renderer *r
// In order that access to these initial textures not be lost, they are treated as texture // In order that access to these initial textures not be lost, they are treated as texture
// objects all of whose names are 0. // objects all of whose names are 0.
Texture2D *zeroTexture2D = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), 0); Texture *zeroTexture2D = new Texture(mRenderer->createTexture(GL_TEXTURE_2D), 0, GL_TEXTURE_2D);
mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D); mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D);
TextureCubeMap *zeroTextureCube = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0); Texture *zeroTextureCube = new Texture(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), 0, GL_TEXTURE_CUBE_MAP);
mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube); mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube);
if (mClientVersion >= 3) if (mClientVersion >= 3)
{ {
// TODO: These could also be enabled via extension // TODO: These could also be enabled via extension
Texture3D *zeroTexture3D = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), 0); Texture *zeroTexture3D = new Texture(mRenderer->createTexture(GL_TEXTURE_3D), 0, GL_TEXTURE_3D);
mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D); mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D);
Texture2DArray *zeroTexture2DArray = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0); Texture *zeroTexture2DArray = new Texture(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), 0, GL_TEXTURE_2D_ARRAY);
mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray); mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray);
} }
...@@ -724,39 +724,9 @@ Query *Context::getQuery(unsigned int handle, bool create, GLenum type) ...@@ -724,39 +724,9 @@ Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
Texture *Context::getTargetTexture(GLenum target) const Texture *Context::getTargetTexture(GLenum target) const
{ {
if (!ValidTextureTarget(this, target)) ASSERT(ValidTextureTarget(this, target));
{
return NULL;
}
switch (target)
{
case GL_TEXTURE_2D: return getTexture2D();
case GL_TEXTURE_CUBE_MAP: return getTextureCubeMap();
case GL_TEXTURE_3D: return getTexture3D();
case GL_TEXTURE_2D_ARRAY: return getTexture2DArray();
default: return NULL;
}
}
Texture2D *Context::getTexture2D() const
{
return static_cast<Texture2D*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_2D));
}
TextureCubeMap *Context::getTextureCubeMap() const
{
return static_cast<TextureCubeMap*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_CUBE_MAP));
}
Texture3D *Context::getTexture3D() const return getSamplerTexture(mState.getActiveSampler(), target);
{
return static_cast<Texture3D*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_3D));
}
Texture2DArray *Context::getTexture2DArray() const
{
return static_cast<Texture2DArray*>(getSamplerTexture(mState.getActiveSampler(), GL_TEXTURE_2D_ARRAY));
} }
Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
......
...@@ -42,10 +42,6 @@ class Compiler; ...@@ -42,10 +42,6 @@ class Compiler;
class Shader; class Shader;
class Program; class Program;
class Texture; class Texture;
class Texture2D;
class TextureCubeMap;
class Texture3D;
class Texture2DArray;
class Framebuffer; class Framebuffer;
class Renderbuffer; class Renderbuffer;
class FenceNV; class FenceNV;
...@@ -151,11 +147,6 @@ class Context ...@@ -151,11 +147,6 @@ class Context
TransformFeedback *getTransformFeedback(GLuint handle) const; TransformFeedback *getTransformFeedback(GLuint handle) const;
Texture *getTargetTexture(GLenum target) const; Texture *getTargetTexture(GLenum target) const;
Texture2D *getTexture2D() const;
TextureCubeMap *getTextureCubeMap() const;
Texture3D *getTexture3D() const;
Texture2DArray *getTexture2DArray() const;
Texture *getSamplerTexture(unsigned int sampler, GLenum type) const; Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
Compiler *getCompiler() const; Compiler *getCompiler() const;
......
...@@ -123,7 +123,7 @@ GLint TextureAttachment::mipLevel() const ...@@ -123,7 +123,7 @@ GLint TextureAttachment::mipLevel() const
GLenum TextureAttachment::cubeMapFace() const GLenum TextureAttachment::cubeMapFace() const
{ {
return IsCubemapTextureTarget(mIndex.type) ? mIndex.type : GL_NONE; return IsCubeMapTextureTarget(mIndex.type) ? mIndex.type : GL_NONE;
} }
GLint TextureAttachment::layer() const GLint TextureAttachment::layer() const
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
// ImageIndex.cpp: Implementation for ImageIndex methods. // ImageIndex.cpp: Implementation for ImageIndex methods.
#include "libANGLE/ImageIndex.h" #include "libANGLE/ImageIndex.h"
#include "libANGLE/Texture.h" #include "libANGLE/Constants.h"
#include "common/utilities.h" #include "common/utilities.h"
namespace gl namespace gl
...@@ -34,8 +34,8 @@ ImageIndex ImageIndex::Make2D(GLint mipIndex) ...@@ -34,8 +34,8 @@ ImageIndex ImageIndex::Make2D(GLint mipIndex)
ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex) ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex)
{ {
ASSERT(gl::IsCubemapTextureTarget(target)); ASSERT(gl::IsCubeMapTextureTarget(target));
return ImageIndex(target, mipIndex, TextureCubeMap::targetToLayerIndex(target)); return ImageIndex(target, mipIndex, CubeMapTextureTargetToLayerIndex(target));
} }
ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex) ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex)
...@@ -134,7 +134,7 @@ ImageIndex ImageIndexIterator::current() const ...@@ -134,7 +134,7 @@ ImageIndex ImageIndexIterator::current() const
if (mType == GL_TEXTURE_CUBE_MAP) if (mType == GL_TEXTURE_CUBE_MAP)
{ {
value.type = TextureCubeMap::layerIndexToTarget(mCurrentLayer); value.type = LayerIndexToCubeMapTextureTarget(mCurrentLayer);
} }
return value; return value;
......
...@@ -370,30 +370,7 @@ void ResourceManager::checkTextureAllocation(GLuint texture, GLenum type) ...@@ -370,30 +370,7 @@ void ResourceManager::checkTextureAllocation(GLuint texture, GLenum type)
{ {
if (!getTexture(texture) && texture != 0) if (!getTexture(texture) && texture != 0)
{ {
Texture *textureObject; Texture *textureObject = new Texture(mRenderer->createTexture(type), texture, type);
if (type == GL_TEXTURE_2D)
{
textureObject = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), texture);
}
else if (type == GL_TEXTURE_CUBE_MAP)
{
textureObject = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), texture);
}
else if (type == GL_TEXTURE_3D)
{
textureObject = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), texture);
}
else if (type == GL_TEXTURE_2D_ARRAY)
{
textureObject = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), texture);
}
else
{
UNREACHABLE();
return;
}
mTextureMap[texture] = textureObject; mTextureMap[texture] = textureObject;
textureObject->addRef(); textureObject->addRef();
} }
......
...@@ -4,9 +4,7 @@ ...@@ -4,9 +4,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// //
// Texture.cpp: Implements the gl::Texture class and its derived classes // Texture.cpp: Implements the gl::Texture class. [OpenGL ES 2.0.24] section 3.7 page 63.
// Texture2D and TextureCubeMap. Implements GL texture objects and related
// functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
#include "libANGLE/Texture.h" #include "libANGLE/Texture.h"
#include "libANGLE/Context.h" #include "libANGLE/Context.h"
...@@ -87,28 +85,132 @@ GLenum Texture::getUsage() const ...@@ -87,28 +85,132 @@ GLenum Texture::getUsage() const
size_t Texture::getWidth(GLenum target, size_t level) const size_t Texture::getWidth(GLenum target, size_t level) const
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return getImageDesc(ImageIdentifier(target, level)).size.width; return getImageDesc(ImageIdentifier(target, level)).size.width;
} }
size_t Texture::getHeight(GLenum target, size_t level) const size_t Texture::getHeight(GLenum target, size_t level) const
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return getImageDesc(ImageIdentifier(target, level)).size.height; return getImageDesc(ImageIdentifier(target, level)).size.height;
} }
size_t Texture::getDepth(GLenum target, size_t level) const size_t Texture::getDepth(GLenum target, size_t level) const
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return getImageDesc(ImageIdentifier(target, level)).size.depth; return getImageDesc(ImageIdentifier(target, level)).size.depth;
} }
GLenum Texture::getInternalFormat(GLenum target, size_t level) const GLenum Texture::getInternalFormat(GLenum target, size_t level) const
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return getImageDesc(ImageIdentifier(target, level)).internalFormat; return getImageDesc(ImageIdentifier(target, level)).internalFormat;
} }
bool Texture::isSamplerComplete(const SamplerState &samplerState, const Data &data) const
{
GLenum baseTarget = getBaseImageTarget();
size_t width = getWidth(baseTarget, 0);
size_t height = getHeight(baseTarget, 0);
size_t depth = getDepth(baseTarget, 0);
if (width == 0 || height == 0 || depth == 0)
{
return false;
}
if (mTarget == GL_TEXTURE_CUBE_MAP && width != height)
{
return false;
}
GLenum internalFormat = getInternalFormat(baseTarget, 0);
const TextureCaps &textureCaps = data.textureCaps->get(internalFormat);
if (!textureCaps.filterable && !IsPointSampled(samplerState))
{
return false;
}
bool npotSupport = data.extensions->textureNPOT || data.clientVersion >= 3;
if (!npotSupport)
{
if ((samplerState.wrapS != GL_CLAMP_TO_EDGE && !gl::isPow2(width)) ||
(samplerState.wrapT != GL_CLAMP_TO_EDGE && !gl::isPow2(height)))
{
return false;
}
}
if (IsMipmapFiltered(samplerState))
{
if (!npotSupport)
{
if (!gl::isPow2(width) || !gl::isPow2(height))
{
return false;
}
}
if (!isMipmapComplete())
{
return false;
}
}
else
{
if (mTarget == GL_TEXTURE_CUBE_MAP && !isCubeComplete())
{
return false;
}
}
// OpenGLES 3.0.2 spec section 3.8.13 states that a texture is not mipmap complete if:
// The internalformat specified for the texture arrays is a sized internal depth or
// depth and stencil format (see table 3.13), the value of TEXTURE_COMPARE_-
// MODE is NONE, and either the magnification filter is not NEAREST or the mini-
// fication filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST.
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat);
if (formatInfo.depthBits > 0 && data.clientVersion > 2)
{
if (samplerState.compareMode == GL_NONE)
{
if ((samplerState.minFilter != GL_NEAREST && samplerState.minFilter != GL_NEAREST_MIPMAP_NEAREST) ||
samplerState.magFilter != GL_NEAREST)
{
return false;
}
}
}
return true;
}
// Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
bool Texture::isCubeComplete() const
{
ASSERT(mTarget == GL_TEXTURE_CUBE_MAP);
GLenum baseTarget = FirstCubeMapTextureTarget;
size_t width = getWidth(baseTarget, 0);
size_t height = getWidth(baseTarget, 0);
if (width == 0 || width != height)
{
return false;
}
GLenum internalFormat = getInternalFormat(baseTarget, 0);
for (GLenum face = baseTarget + 1; face <= LastCubeMapTextureTarget; face++)
{
if (getWidth(face, 0) != width ||
getHeight(face, 0) != height ||
getInternalFormat(face, 0) != internalFormat)
{
return false;
}
}
return true;
}
unsigned int Texture::getTextureSerial() const unsigned int Texture::getTextureSerial() const
{ {
return mTextureSerial; return mTextureSerial;
...@@ -132,7 +234,7 @@ int Texture::immutableLevelCount() ...@@ -132,7 +234,7 @@ int Texture::immutableLevelCount()
Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type, Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type,
const PixelUnpackState &unpack, const uint8_t *pixels) const PixelUnpackState &unpack, const uint8_t *pixels)
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
Error error = mTexture->setImage(target, level, internalFormat, size, format, type, unpack, pixels); Error error = mTexture->setImage(target, level, internalFormat, size, format, type, unpack, pixels);
if (error.isError()) if (error.isError())
...@@ -150,7 +252,7 @@ Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, cons ...@@ -150,7 +252,7 @@ Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, cons
Error Texture::setSubImage(GLenum target, size_t level, const Box &area, GLenum format, GLenum type, Error Texture::setSubImage(GLenum target, size_t level, const Box &area, GLenum format, GLenum type,
const PixelUnpackState &unpack, const uint8_t *pixels) const PixelUnpackState &unpack, const uint8_t *pixels)
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return mTexture->setSubImage(target, level, area, format, type, unpack, pixels); return mTexture->setSubImage(target, level, area, format, type, unpack, pixels);
} }
...@@ -158,7 +260,7 @@ Error Texture::setSubImage(GLenum target, size_t level, const Box &area, GLenum ...@@ -158,7 +260,7 @@ Error Texture::setSubImage(GLenum target, size_t level, const Box &area, GLenum
Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size,
const PixelUnpackState &unpack, const uint8_t *pixels) const PixelUnpackState &unpack, const uint8_t *pixels)
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
Error error = mTexture->setCompressedImage(target, level, internalFormat, size, unpack, pixels); Error error = mTexture->setCompressedImage(target, level, internalFormat, size, unpack, pixels);
if (error.isError()) if (error.isError())
...@@ -176,7 +278,7 @@ Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFo ...@@ -176,7 +278,7 @@ Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFo
Error Texture::setCompressedSubImage(GLenum target, size_t level, const Box &area, GLenum format, Error Texture::setCompressedSubImage(GLenum target, size_t level, const Box &area, GLenum format,
const PixelUnpackState &unpack, const uint8_t *pixels) const PixelUnpackState &unpack, const uint8_t *pixels)
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return mTexture->setCompressedSubImage(target, level, area, format, unpack, pixels); return mTexture->setCompressedSubImage(target, level, area, format, unpack, pixels);
} }
...@@ -184,7 +286,7 @@ Error Texture::setCompressedSubImage(GLenum target, size_t level, const Box &are ...@@ -184,7 +286,7 @@ Error Texture::setCompressedSubImage(GLenum target, size_t level, const Box &are
Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceArea, GLenum internalFormat, Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceArea, GLenum internalFormat,
const Framebuffer *source) const Framebuffer *source)
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
Error error = mTexture->copyImage(target, level, sourceArea, internalFormat, source); Error error = mTexture->copyImage(target, level, sourceArea, internalFormat, source);
if (error.isError()) if (error.isError())
...@@ -203,7 +305,7 @@ Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceAre ...@@ -203,7 +305,7 @@ Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceAre
Error Texture::copySubImage(GLenum target, size_t level, const Offset &destOffset, const Rectangle &sourceArea, Error Texture::copySubImage(GLenum target, size_t level, const Offset &destOffset, const Rectangle &sourceArea,
const Framebuffer *source) const Framebuffer *source)
{ {
ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubemapTextureTarget(target))); ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
return mTexture->copySubImage(target, level, destOffset, sourceArea, source); return mTexture->copySubImage(target, level, destOffset, sourceArea, source);
} }
...@@ -238,7 +340,7 @@ Error Texture::generateMipmaps() ...@@ -238,7 +340,7 @@ Error Texture::generateMipmaps()
releaseTexImage(); releaseTexImage();
ImageIdentifier baseLevel(mTarget == GL_TEXTURE_CUBE_MAP ? GL_TEXTURE_CUBE_MAP_POSITIVE_X : mTarget, 0); ImageIdentifier baseLevel(getBaseImageTarget(), 0);
const ImageDesc &baseImageInfo = getImageDesc(baseLevel); const ImageDesc &baseImageInfo = getImageDesc(baseLevel);
size_t mipLevels = log2(std::max(std::max(baseImageInfo.size.width, baseImageInfo.size.height), baseImageInfo.size.depth)) + 1; size_t mipLevels = log2(std::max(std::max(baseImageInfo.size.width, baseImageInfo.size.height), baseImageInfo.size.depth)) + 1;
setImageDescChain(mipLevels, baseImageInfo.size, baseImageInfo.internalFormat); setImageDescChain(mipLevels, baseImageInfo.size, baseImageInfo.internalFormat);
...@@ -257,7 +359,7 @@ void Texture::setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInt ...@@ -257,7 +359,7 @@ void Texture::setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInt
if (mTarget == GL_TEXTURE_CUBE_MAP) if (mTarget == GL_TEXTURE_CUBE_MAP)
{ {
for (size_t face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++) for (size_t face = FirstCubeMapTextureTarget; face <= LastCubeMapTextureTarget; face++)
{ {
setImageDesc(ImageIdentifier(face, level), levelInfo); setImageDesc(ImageIdentifier(face, level), levelInfo);
} }
...@@ -329,69 +431,45 @@ void Texture::releaseTexImage() ...@@ -329,69 +431,45 @@ void Texture::releaseTexImage()
} }
} }
Texture2D::Texture2D(rx::TextureImpl *impl, GLuint id) GLenum Texture::getBaseImageTarget() const
: Texture(impl, id, GL_TEXTURE_2D)
{ {
return mTarget == GL_TEXTURE_CUBE_MAP ? FirstCubeMapTextureTarget : mTarget;
} }
Texture2D::~Texture2D() size_t Texture::getExpectedMipLevels() const
{ {
} GLenum baseTarget = getBaseImageTarget();
size_t width = getWidth(baseTarget, 0);
// Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85. size_t height = getHeight(baseTarget, 0);
bool Texture2D::isSamplerComplete(const SamplerState &samplerState, const Data &data) const if (mTarget == GL_TEXTURE_3D)
{
size_t width = getWidth(GL_TEXTURE_2D, 0);
size_t height = getHeight(GL_TEXTURE_2D, 0);
if (width == 0 || height == 0)
{ {
return false; size_t depth = getDepth(baseTarget, 0);
return log2(std::max(std::max(width, height), depth)) + 1;
} }
else
GLenum internalFormat = getInternalFormat(GL_TEXTURE_2D, 0);
if (!data.textureCaps->get(internalFormat).filterable && !IsPointSampled(samplerState))
{ {
return false; return log2(std::max(width, height)) + 1;
}
bool npotSupport = data.extensions->textureNPOT;
if (!npotSupport)
{
if ((samplerState.wrapS != GL_CLAMP_TO_EDGE && !gl::isPow2(width)) ||
(samplerState.wrapT != GL_CLAMP_TO_EDGE && !gl::isPow2(height)))
{
return false;
}
} }
}
if (IsMipmapFiltered(samplerState)) bool Texture::isMipmapComplete() const
{
size_t expectedMipLevels = getExpectedMipLevels();
for (size_t level = 0; level < expectedMipLevels; level++)
{ {
if (!npotSupport) if (mTarget == GL_TEXTURE_CUBE_MAP)
{ {
if (!gl::isPow2(width) || !gl::isPow2(height)) for (GLenum face = FirstCubeMapTextureTarget; face <= LastCubeMapTextureTarget; face++)
{ {
return false; if (!isLevelComplete(face, level))
{
return false;
}
} }
} }
else
if (!isMipmapComplete())
{
return false;
}
}
// OpenGLES 3.0.2 spec section 3.8.13 states that a texture is not mipmap complete if:
// The internalformat specified for the texture arrays is a sized internal depth or
// depth and stencil format (see table 3.13), the value of TEXTURE_COMPARE_-
// MODE is NONE, and either the magnification filter is not NEAREST or the mini-
// fication filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST.
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat);
if (formatInfo.depthBits > 0 && data.clientVersion > 2)
{
if (samplerState.compareMode == GL_NONE)
{ {
if ((samplerState.minFilter != GL_NEAREST && samplerState.minFilter != GL_NEAREST_MIPMAP_NEAREST) || if (!isLevelComplete(mTarget, level))
samplerState.magFilter != GL_NEAREST)
{ {
return false; return false;
} }
...@@ -401,25 +479,8 @@ bool Texture2D::isSamplerComplete(const SamplerState &samplerState, const Data & ...@@ -401,25 +479,8 @@ bool Texture2D::isSamplerComplete(const SamplerState &samplerState, const Data &
return true; return true;
} }
// Tests for 2D texture (mipmap) completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
bool Texture2D::isMipmapComplete() const
{
size_t width = getWidth(GL_TEXTURE_2D, 0);
size_t height = getHeight(GL_TEXTURE_2D, 0);
size_t expectedMipLevels = log2(std::max(width, height)) + 1; bool Texture::isLevelComplete(GLenum target, size_t level) const
for (size_t level = 0; level < expectedMipLevels; level++)
{
if (!isLevelComplete(level))
{
return false;
}
}
return true;
}
bool Texture2D::isLevelComplete(size_t level) const
{ {
ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS); ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
...@@ -428,9 +489,10 @@ bool Texture2D::isLevelComplete(size_t level) const ...@@ -428,9 +489,10 @@ bool Texture2D::isLevelComplete(size_t level) const
return true; return true;
} }
size_t width = getWidth(GL_TEXTURE_2D, 0); size_t width = getWidth(target, 0);
size_t height = getHeight(GL_TEXTURE_2D, 0); size_t height = getHeight(target, 0);
if (width == 0 || height == 0) size_t depth = getHeight(target, 0);
if (width == 0 || height == 0 || depth == 0)
{ {
return false; return false;
} }
...@@ -441,323 +503,31 @@ bool Texture2D::isLevelComplete(size_t level) const ...@@ -441,323 +503,31 @@ bool Texture2D::isLevelComplete(size_t level) const
return true; return true;
} }
if (getInternalFormat(GL_TEXTURE_2D, level) != getInternalFormat(GL_TEXTURE_2D, 0))
{
return false;
}
if (getWidth(GL_TEXTURE_2D, level) != std::max<size_t>(1, width >> level))
{
return false;
}
if (getHeight(GL_TEXTURE_2D, level) != std::max<size_t>(1, height >> level))
{
return false;
}
return true;
}
TextureCubeMap::TextureCubeMap(rx::TextureImpl *impl, GLuint id)
: Texture(impl, id, GL_TEXTURE_CUBE_MAP)
{
}
TextureCubeMap::~TextureCubeMap()
{
}
// Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
bool TextureCubeMap::isCubeComplete() const
{
size_t width = getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
size_t height = getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
if (width == 0 || width != height)
{
return false;
}
GLenum internalFormat = getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + 1; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
{
if (getWidth(face, 0) != width ||
getHeight(face, 0) != height ||
getInternalFormat(face, 0) != internalFormat)
{
return false;
}
}
return true;
}
// Tests for texture sampling completeness
bool TextureCubeMap::isSamplerComplete(const SamplerState &samplerState, const Data &data) const
{
bool mipmapping = IsMipmapFiltered(samplerState);
GLenum internalFormat = getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
if (!data.textureCaps->get(internalFormat).filterable && !IsPointSampled(samplerState))
{
return false;
}
size_t size = getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
if (!gl::isPow2(size) && !data.extensions->textureNPOT)
{
if (samplerState.wrapS != GL_CLAMP_TO_EDGE || samplerState.wrapT != GL_CLAMP_TO_EDGE || mipmapping)
{
return false;
}
}
if (!mipmapping)
{
if (!isCubeComplete())
{
return false;
}
}
else
{
if (!isMipmapComplete()) // Also tests for isCubeComplete()
{
return false;
}
}
return true;
}
int TextureCubeMap::targetToLayerIndex(GLenum target)
{
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1);
META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2);
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3);
META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4);
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 5);
return target - GL_TEXTURE_CUBE_MAP_POSITIVE_X;
}
GLenum TextureCubeMap::layerIndexToTarget(GLint layer)
{
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1);
META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2);
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3);
META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4);
META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 5);
return GL_TEXTURE_CUBE_MAP_POSITIVE_X + layer;
}
bool TextureCubeMap::isMipmapComplete() const
{
if (isImmutable())
{
return true;
}
if (!isCubeComplete())
{
return false;
}
size_t width = getWidth(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0);
size_t height = getHeight(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0);
size_t expectedMipLevels = log2(std::max(width, height)) + 1;
for (GLenum face = GL_TEXTURE_CUBE_MAP_NEGATIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
{
for (size_t level = 1; level < expectedMipLevels; level++)
{
if (!isFaceLevelComplete(face, level))
{
return false;
}
}
}
return true;
}
bool TextureCubeMap::isFaceLevelComplete(GLenum target, size_t level) const
{
ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS && IsCubemapTextureTarget(target));
if (isImmutable())
{
return true;
}
size_t baseSize = getWidth(target, 0);
if (baseSize == 0)
{
return false;
}
// "isCubeComplete" checks for base level completeness and we must call that
// to determine if any face at level 0 is complete. We omit that check here
// to avoid re-checking cube-completeness for every face at level 0.
if (level == 0)
{
return true;
}
// Check that non-zero levels are consistent with the base level.
if (getInternalFormat(target, level) != getInternalFormat(target, 0)) if (getInternalFormat(target, level) != getInternalFormat(target, 0))
{ {
return false; return false;
} }
if (getWidth(target, level) != std::max<size_t>(1, baseSize >> level)) if (getWidth(target, level) != std::max<size_t>(1, width >> level))
{ {
return false; return false;
} }
return true; if (getHeight(target, level) != std::max<size_t>(1, height >> level))
}
Texture3D::Texture3D(rx::TextureImpl *impl, GLuint id)
: Texture(impl, id, GL_TEXTURE_3D)
{
}
Texture3D::~Texture3D()
{
}
bool Texture3D::isSamplerComplete(const SamplerState &samplerState, const Data &data) const
{
size_t width = getWidth(GL_TEXTURE_3D, 0);
size_t height = getHeight(GL_TEXTURE_3D, 0);
size_t depth = getDepth(GL_TEXTURE_3D, 0);
if (width == 0 || height == 0 || depth == 0)
{
return false;
}
GLenum internalFormat = getInternalFormat(GL_TEXTURE_3D, 0);
if (!data.textureCaps->get(internalFormat).filterable && !IsPointSampled(samplerState))
{ {
return false; return false;
} }
if (IsMipmapFiltered(samplerState) && !isMipmapComplete()) if (mTarget == GL_TEXTURE_3D)
{ {
return false; if (getDepth(target, level) != std::max<size_t>(1, depth >> level))
}
return true;
}
bool Texture3D::isMipmapComplete() const
{
size_t width = getWidth(GL_TEXTURE_2D_ARRAY, 0);
size_t height = getHeight(GL_TEXTURE_2D_ARRAY, 0);
size_t depth = getDepth(GL_TEXTURE_3D, 0);
size_t expectedMipLevels = log2(std::max(std::max(width, height), depth)) + 1;
for (size_t level = 0; level < expectedMipLevels; level++)
{
if (!isLevelComplete(level))
{ {
return false; return false;
} }
} }
else if (mTarget == GL_TEXTURE_2D_ARRAY)
return true;
}
bool Texture3D::isLevelComplete(size_t level) const
{
ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
if (isImmutable())
{ {
return true; if (getDepth(target, level) != depth)
}
size_t width = getWidth(GL_TEXTURE_3D, level);
size_t height = getHeight(GL_TEXTURE_3D, level);
size_t depth = getDepth(GL_TEXTURE_3D, level);
if (width == 0 || height == 0 || depth == 0)
{
return false;
}
if (level == 0)
{
return true;
}
if (getInternalFormat(GL_TEXTURE_3D, level) != getInternalFormat(GL_TEXTURE_3D, 0))
{
return false;
}
if (getWidth(GL_TEXTURE_3D, level) != std::max<size_t>(1, width >> level))
{
return false;
}
if (getHeight(GL_TEXTURE_3D, level) != std::max<size_t>(1, height >> level))
{
return false;
}
if (getDepth(GL_TEXTURE_3D, level) != std::max<size_t>(1, depth >> level))
{
return false;
}
return true;
}
Texture2DArray::Texture2DArray(rx::TextureImpl *impl, GLuint id)
: Texture(impl, id, GL_TEXTURE_2D_ARRAY)
{
}
Texture2DArray::~Texture2DArray()
{
}
bool Texture2DArray::isSamplerComplete(const SamplerState &samplerState, const Data &data) const
{
size_t width = getWidth(GL_TEXTURE_2D_ARRAY, 0);
size_t height = getHeight(GL_TEXTURE_2D_ARRAY, 0);
size_t depth = getDepth(GL_TEXTURE_2D_ARRAY, 0);
if (width == 0 || height == 0 || depth == 0)
{
return false;
}
GLenum internalFormat = getInternalFormat(GL_TEXTURE_2D_ARRAY, 0);
if (!data.textureCaps->get(internalFormat).filterable && !IsPointSampled(samplerState))
{
return false;
}
if (IsMipmapFiltered(samplerState) && !isMipmapComplete())
{
return false;
}
return true;
}
bool Texture2DArray::isMipmapComplete() const
{
size_t width = getWidth(GL_TEXTURE_2D_ARRAY, 0);
size_t height = getHeight(GL_TEXTURE_2D_ARRAY, 0);
size_t expectedMipLevels = log2(std::max(width, height)) + 1;
for (size_t level = 1; level < expectedMipLevels; level++)
{
if (!isLevelComplete(level))
{ {
return false; return false;
} }
...@@ -766,49 +536,4 @@ bool Texture2DArray::isMipmapComplete() const ...@@ -766,49 +536,4 @@ bool Texture2DArray::isMipmapComplete() const
return true; return true;
} }
bool Texture2DArray::isLevelComplete(size_t level) const
{
ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
if (isImmutable())
{
return true;
}
size_t width = getWidth(GL_TEXTURE_2D_ARRAY, level);
size_t height = getHeight(GL_TEXTURE_2D_ARRAY, level);
size_t layers = getDepth(GL_TEXTURE_2D_ARRAY, 0);
if (width == 0 || height == 0 || layers == 0)
{
return false;
}
if (level == 0)
{
return true;
}
if (getInternalFormat(GL_TEXTURE_2D_ARRAY, level) != getInternalFormat(GL_TEXTURE_2D_ARRAY, 0))
{
return false;
}
if (getWidth(GL_TEXTURE_2D_ARRAY, level) != std::max<size_t>(1, width >> level))
{
return false;
}
if (getHeight(GL_TEXTURE_2D_ARRAY, level) != std::max<size_t>(1, height >> level))
{
return false;
}
if (getDepth(GL_TEXTURE_2D_ARRAY, level) != layers)
{
return false;
}
return true;
}
} }
...@@ -4,9 +4,7 @@ ...@@ -4,9 +4,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// //
// Texture.h: Defines the abstract gl::Texture class and its concrete derived // Texture.h: Defines the gl::Texture class [OpenGL ES 2.0.24] section 3.7 page 63.
// classes Texture2D and TextureCubeMap. Implements GL texture objects and
// related functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
#ifndef LIBANGLE_TEXTURE_H_ #ifndef LIBANGLE_TEXTURE_H_
#define LIBANGLE_TEXTURE_H_ #define LIBANGLE_TEXTURE_H_
...@@ -35,7 +33,7 @@ struct Data; ...@@ -35,7 +33,7 @@ struct Data;
bool IsMipmapFiltered(const gl::SamplerState &samplerState); bool IsMipmapFiltered(const gl::SamplerState &samplerState);
class Texture : public RefCountObject class Texture final : public RefCountObject
{ {
public: public:
Texture(rx::TextureImpl *impl, GLuint id, GLenum target); Texture(rx::TextureImpl *impl, GLuint id, GLenum target);
...@@ -55,7 +53,8 @@ class Texture : public RefCountObject ...@@ -55,7 +53,8 @@ class Texture : public RefCountObject
size_t getDepth(GLenum target, size_t level) const; size_t getDepth(GLenum target, size_t level) const;
GLenum getInternalFormat(GLenum target, size_t level) const; GLenum getInternalFormat(GLenum target, size_t level) const;
virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const = 0; bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const;
bool isCubeComplete() const;
virtual Error setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type, virtual Error setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type,
const PixelUnpackState &unpack, const uint8_t *pixels); const PixelUnpackState &unpack, const uint8_t *pixels);
...@@ -91,7 +90,9 @@ class Texture : public RefCountObject ...@@ -91,7 +90,9 @@ class Texture : public RefCountObject
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. 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.
protected: private:
DISALLOW_COPY_AND_ASSIGN(Texture);
static unsigned int issueTextureSerial(); static unsigned int issueTextureSerial();
rx::TextureImpl *mTexture; rx::TextureImpl *mTexture;
...@@ -126,8 +127,11 @@ class Texture : public RefCountObject ...@@ -126,8 +127,11 @@ class Texture : public RefCountObject
const unsigned int mTextureSerial; const unsigned int mTextureSerial;
static unsigned int mCurrentTextureSerial; static unsigned int mCurrentTextureSerial;
private: GLenum getBaseImageTarget() const;
DISALLOW_COPY_AND_ASSIGN(Texture); size_t getExpectedMipLevels() const;
bool isMipmapComplete() const;
bool isLevelComplete(GLenum target, size_t level) const;
const ImageDesc &getImageDesc(const ImageIdentifier& index) const; const ImageDesc &getImageDesc(const ImageIdentifier& index) const;
void setImageDesc(const ImageIdentifier& index, const ImageDesc &desc); void setImageDesc(const ImageIdentifier& index, const ImageDesc &desc);
...@@ -140,75 +144,6 @@ class Texture : public RefCountObject ...@@ -140,75 +144,6 @@ class Texture : public RefCountObject
egl::Surface *mBoundSurface; egl::Surface *mBoundSurface;
}; };
class Texture2D : public Texture
{
public:
Texture2D(rx::TextureImpl *impl, GLuint id);
virtual ~Texture2D();
virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const;
private:
DISALLOW_COPY_AND_ASSIGN(Texture2D);
bool isMipmapComplete() const;
bool isLevelComplete(size_t level) const;
};
class TextureCubeMap : public Texture
{
public:
TextureCubeMap(rx::TextureImpl *impl, GLuint id);
virtual ~TextureCubeMap();
virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const;
bool isCubeComplete() const;
static int targetToLayerIndex(GLenum target);
static GLenum layerIndexToTarget(GLint layer);
private:
DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
bool isMipmapComplete() const;
bool isFaceLevelComplete(GLenum target, size_t level) const;
};
class Texture3D : public Texture
{
public:
Texture3D(rx::TextureImpl *impl, GLuint id);
virtual ~Texture3D();
virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const;
private:
DISALLOW_COPY_AND_ASSIGN(Texture3D);
bool isMipmapComplete() const;
bool isLevelComplete(size_t level) const;
};
class Texture2DArray : public Texture
{
public:
Texture2DArray(rx::TextureImpl *impl, GLuint id);
virtual ~Texture2DArray();
virtual bool isSamplerComplete(const SamplerState &samplerState, const Data &data) const;
private:
DISALLOW_COPY_AND_ASSIGN(Texture2DArray);
bool isMipmapComplete() const;
bool isLevelComplete(size_t level) const;
};
} }
#endif // LIBANGLE_TEXTURE_H_ #endif // LIBANGLE_TEXTURE_H_
...@@ -18,11 +18,6 @@ class Display; ...@@ -18,11 +18,6 @@ class Display;
class Config; class Config;
} }
namespace gl
{
class Texture2D;
}
namespace rx namespace rx
{ {
......
...@@ -582,15 +582,7 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLenum type) ...@@ -582,15 +582,7 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLenum type)
const gl::Extents colorSize(1, 1, 1); const gl::Extents colorSize(1, 1, 1);
const gl::PixelUnpackState incompleteUnpackState(1); const gl::PixelUnpackState incompleteUnpackState(1);
gl::Texture* t = NULL; gl::Texture* t = new gl::Texture(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID, type);
switch (type)
{
default: UNREACHABLE(); // default falls through to TEXTURE_2D
case GL_TEXTURE_2D: t = new gl::Texture2D(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID); break;
case GL_TEXTURE_CUBE_MAP: t = new gl::TextureCubeMap(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID); break;
case GL_TEXTURE_3D: t = new gl::Texture3D(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID); break;
case GL_TEXTURE_2D_ARRAY: t = new gl::Texture2DArray(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID); break;
}
if (type == GL_TEXTURE_CUBE_MAP) if (type == GL_TEXTURE_CUBE_MAP)
{ {
......
...@@ -434,7 +434,7 @@ bool TextureD3D::isBaseImageZeroSize() const ...@@ -434,7 +434,7 @@ bool TextureD3D::isBaseImageZeroSize() const
return true; return true;
} }
if (!gl::IsCubemapTextureTarget(baseImage->getTarget()) && baseImage->getHeight() <= 0) if (!gl::IsCubeMapTextureTarget(baseImage->getTarget()) && baseImage->getHeight() <= 0)
{ {
return true; return true;
} }
...@@ -1213,7 +1213,7 @@ gl::Error TextureD3D_Cube::setCompressedImage(GLenum target, size_t level, GLenu ...@@ -1213,7 +1213,7 @@ gl::Error TextureD3D_Cube::setCompressedImage(GLenum target, size_t level, GLenu
ASSERT(size.depth == 1); ASSERT(size.depth == 1);
// compressed formats don't have separate sized internal formats-- we can just use the compressed format directly // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
redefineImage(faceIndex, level, internalFormat, size); redefineImage(faceIndex, level, internalFormat, size);
...@@ -1240,7 +1240,7 @@ gl::Error TextureD3D_Cube::setCompressedSubImage(GLenum target, size_t level, co ...@@ -1240,7 +1240,7 @@ gl::Error TextureD3D_Cube::setCompressedSubImage(GLenum target, size_t level, co
gl::Error TextureD3D_Cube::copyImage(GLenum target, size_t level, const gl::Rectangle &sourceArea, GLenum internalFormat, gl::Error TextureD3D_Cube::copyImage(GLenum target, size_t level, const gl::Rectangle &sourceArea, GLenum internalFormat,
const gl::Framebuffer *source) const gl::Framebuffer *source)
{ {
int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE); GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE);
gl::Extents size(sourceArea.width, sourceArea.height, 1); gl::Extents size(sourceArea.width, sourceArea.height, 1);
...@@ -1287,7 +1287,7 @@ gl::Error TextureD3D_Cube::copyImage(GLenum target, size_t level, const gl::Rect ...@@ -1287,7 +1287,7 @@ gl::Error TextureD3D_Cube::copyImage(GLenum target, size_t level, const gl::Rect
gl::Error TextureD3D_Cube::copySubImage(GLenum target, size_t level, const gl::Offset &destOffset, const gl::Rectangle &sourceArea, gl::Error TextureD3D_Cube::copySubImage(GLenum target, size_t level, const gl::Offset &destOffset, const gl::Rectangle &sourceArea,
const gl::Framebuffer *source) const gl::Framebuffer *source)
{ {
int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level); gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
...@@ -1427,7 +1427,7 @@ unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index) ...@@ -1427,7 +1427,7 @@ unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index)
gl::Error TextureD3D_Cube::getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT) gl::Error TextureD3D_Cube::getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT)
{ {
ASSERT(gl::IsCubemapTextureTarget(index.type)); ASSERT(gl::IsCubeMapTextureTarget(index.type));
// ensure the underlying texture is created // ensure the underlying texture is created
gl::Error error = ensureRenderTarget(); gl::Error error = ensureRenderTarget();
...@@ -1605,7 +1605,7 @@ gl::Error TextureD3D_Cube::updateStorageFaceLevel(int faceIndex, int level) ...@@ -1605,7 +1605,7 @@ gl::Error TextureD3D_Cube::updateStorageFaceLevel(int faceIndex, int level)
if (image->isDirty()) if (image->isDirty())
{ {
GLenum faceTarget = gl::TextureCubeMap::layerIndexToTarget(faceIndex); GLenum faceTarget = gl::LayerIndexToCubeMapTextureTarget(faceIndex);
gl::ImageIndex index = gl::ImageIndex::MakeCube(faceTarget, level); gl::ImageIndex index = gl::ImageIndex::MakeCube(faceTarget, level);
gl::Box region(0, 0, 0, image->getWidth(), image->getHeight(), 1); gl::Box region(0, 0, 0, image->getWidth(), image->getHeight(), 1);
gl::Error error = commitRegion(index, region); gl::Error error = commitRegion(index, region);
...@@ -1659,12 +1659,12 @@ gl::ImageIndexIterator TextureD3D_Cube::imageIterator() const ...@@ -1659,12 +1659,12 @@ gl::ImageIndexIterator TextureD3D_Cube::imageIterator() const
gl::ImageIndex TextureD3D_Cube::getImageIndex(GLint mip, GLint layer) const gl::ImageIndex TextureD3D_Cube::getImageIndex(GLint mip, GLint layer) const
{ {
// The "layer" of the image index corresponds to the cube face // The "layer" of the image index corresponds to the cube face
return gl::ImageIndex::MakeCube(gl::TextureCubeMap::layerIndexToTarget(layer), mip); return gl::ImageIndex::MakeCube(gl::LayerIndexToCubeMapTextureTarget(layer), mip);
} }
bool TextureD3D_Cube::isValidIndex(const gl::ImageIndex &index) const bool TextureD3D_Cube::isValidIndex(const gl::ImageIndex &index) const
{ {
return (mTexStorage && gl::IsCubemapTextureTarget(index.type) && return (mTexStorage && gl::IsCubeMapTextureTarget(index.type) &&
index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount()); index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount());
} }
......
...@@ -111,7 +111,7 @@ static bool ImageIndexConflictsWithSRV(const gl::ImageIndex *index, D3D11_SHADER ...@@ -111,7 +111,7 @@ static bool ImageIndexConflictsWithSRV(const gl::ImageIndex *index, D3D11_SHADER
unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize; unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize;
// Cube maps can be mapped to Texture2DArray SRVs // Cube maps can be mapped to Texture2DArray SRVs
return (type == GL_TEXTURE_2D_ARRAY || gl::IsCubemapTextureTarget(type)) && return (type == GL_TEXTURE_2D_ARRAY || gl::IsCubeMapTextureTarget(type)) &&
desc.Texture2DArray.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip && desc.Texture2DArray.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip &&
desc.Texture2DArray.FirstArraySlice <= layerIndex && layerIndex < maxSlice; desc.Texture2DArray.FirstArraySlice <= layerIndex && layerIndex < maxSlice;
} }
...@@ -121,7 +121,7 @@ static bool ImageIndexConflictsWithSRV(const gl::ImageIndex *index, D3D11_SHADER ...@@ -121,7 +121,7 @@ static bool ImageIndexConflictsWithSRV(const gl::ImageIndex *index, D3D11_SHADER
unsigned maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip; unsigned maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip;
maxSrvMip = (desc.TextureCube.MipLevels == -1) ? INT_MAX : maxSrvMip; maxSrvMip = (desc.TextureCube.MipLevels == -1) ? INT_MAX : maxSrvMip;
return gl::IsCubemapTextureTarget(type) && return gl::IsCubeMapTextureTarget(type) &&
desc.TextureCube.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip; desc.TextureCube.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip;
} }
......
...@@ -402,7 +402,7 @@ gl::Error Image9::copyToStorage(TextureStorage *storage, const gl::ImageIndex &i ...@@ -402,7 +402,7 @@ gl::Error Image9::copyToStorage(TextureStorage *storage, const gl::ImageIndex &i
} }
else else
{ {
ASSERT(gl::IsCubemapTextureTarget(index.type)); ASSERT(gl::IsCubeMapTextureTarget(index.type));
TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage); TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage);
gl::Error error = storage9->getCubeMapSurface(index.type, index.mipIndex, true, &destSurface); gl::Error error = storage9->getCubeMapSurface(index.type, index.mipIndex, true, &destSurface);
if (error.isError()) if (error.isError())
......
...@@ -1259,7 +1259,7 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi ...@@ -1259,7 +1259,7 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi
return false; return false;
} }
gl::Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); gl::Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
if (!texture) if (!texture)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
...@@ -1298,7 +1298,7 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi ...@@ -1298,7 +1298,7 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi
} }
else else
{ {
if (IsCubemapTextureTarget(target) && width != height) if (IsCubeMapTextureTarget(target) && width != height)
{ {
context->recordError(Error(GL_INVALID_VALUE)); context->recordError(Error(GL_INVALID_VALUE));
return false; return false;
......
...@@ -62,7 +62,7 @@ bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level, ...@@ -62,7 +62,7 @@ bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level,
return false; return false;
} }
} }
else if (IsCubemapTextureTarget(target)) else if (IsCubeMapTextureTarget(target))
{ {
if (!isSubImage && width != height) if (!isSubImage && width != height)
{ {
...@@ -83,7 +83,7 @@ bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level, ...@@ -83,7 +83,7 @@ bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level,
return false; return false;
} }
gl::Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); gl::Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
if (!texture) if (!texture)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
...@@ -799,19 +799,7 @@ bool ValidateES2TexStorageParameters(Context *context, GLenum target, GLsizei le ...@@ -799,19 +799,7 @@ bool ValidateES2TexStorageParameters(Context *context, GLenum target, GLsizei le
break; break;
} }
gl::Texture *texture = NULL; gl::Texture *texture = context->getTargetTexture(target);
switch(target)
{
case GL_TEXTURE_2D:
texture = context->getTexture2D();
break;
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
default:
UNREACHABLE();
}
if (!texture || texture->id() == 0) if (!texture || texture->id() == 0)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
......
...@@ -366,7 +366,7 @@ bool ValidateES3TexImageParameters(Context *context, GLenum target, GLint level, ...@@ -366,7 +366,7 @@ bool ValidateES3TexImageParameters(Context *context, GLenum target, GLint level,
return false; return false;
} }
gl::Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); gl::Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
if (!texture) if (!texture)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
...@@ -865,13 +865,10 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le ...@@ -865,13 +865,10 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
const gl::Caps &caps = context->getCaps(); const gl::Caps &caps = context->getCaps();
gl::Texture *texture = NULL;
switch (target) switch (target)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
{ {
texture = context->getTexture2D();
if (static_cast<GLuint>(width) > caps.max2DTextureSize || if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
static_cast<GLuint>(height) > caps.max2DTextureSize) static_cast<GLuint>(height) > caps.max2DTextureSize)
{ {
...@@ -883,8 +880,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le ...@@ -883,8 +880,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP:
{ {
texture = context->getTextureCubeMap();
if (width != height) if (width != height)
{ {
context->recordError(Error(GL_INVALID_VALUE)); context->recordError(Error(GL_INVALID_VALUE));
...@@ -901,8 +896,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le ...@@ -901,8 +896,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
case GL_TEXTURE_3D: case GL_TEXTURE_3D:
{ {
texture = context->getTexture3D();
if (static_cast<GLuint>(width) > caps.max3DTextureSize || if (static_cast<GLuint>(width) > caps.max3DTextureSize ||
static_cast<GLuint>(height) > caps.max3DTextureSize || static_cast<GLuint>(height) > caps.max3DTextureSize ||
static_cast<GLuint>(depth) > caps.max3DTextureSize) static_cast<GLuint>(depth) > caps.max3DTextureSize)
...@@ -915,8 +908,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le ...@@ -915,8 +908,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_2D_ARRAY:
{ {
texture = context->getTexture2DArray();
if (static_cast<GLuint>(width) > caps.max2DTextureSize || if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
static_cast<GLuint>(height) > caps.max2DTextureSize || static_cast<GLuint>(height) > caps.max2DTextureSize ||
static_cast<GLuint>(depth) > caps.maxArrayTextureLayers) static_cast<GLuint>(depth) > caps.maxArrayTextureLayers)
...@@ -932,6 +923,7 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le ...@@ -932,6 +923,7 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
return false; return false;
} }
gl::Texture *texture = context->getTargetTexture(target);
if (!texture || texture->id() == 0) if (!texture || texture->id() == 0)
{ {
context->recordError(Error(GL_INVALID_OPERATION)); context->recordError(Error(GL_INVALID_OPERATION));
......
...@@ -742,7 +742,7 @@ void GL_APIENTRY CompressedTexImage2D(GLenum target, GLint level, GLenum interna ...@@ -742,7 +742,7 @@ void GL_APIENTRY CompressedTexImage2D(GLenum target, GLint level, GLenum interna
} }
Extents size(width, height, 1); Extents size(width, height, 1);
Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Error error = texture->setCompressedImage(target, level, internalformat, size, context->getState().getUnpackState(), Error error = texture->setCompressedImage(target, level, internalformat, size, context->getState().getUnpackState(),
reinterpret_cast<const uint8_t *>(data)); reinterpret_cast<const uint8_t *>(data));
if (error.isError()) if (error.isError())
...@@ -787,7 +787,7 @@ void GL_APIENTRY CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs ...@@ -787,7 +787,7 @@ void GL_APIENTRY CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs
Box area(xoffset, yoffset, 0, width, height, 1); Box area(xoffset, yoffset, 0, width, height, 1);
Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Error error = texture->setCompressedSubImage(target, level, area, format, context->getState().getUnpackState(), Error error = texture->setCompressedSubImage(target, level, area, format, context->getState().getUnpackState(),
reinterpret_cast<const uint8_t *>(data)); reinterpret_cast<const uint8_t *>(data));
if (error.isError()) if (error.isError())
...@@ -824,7 +824,7 @@ void GL_APIENTRY CopyTexImage2D(GLenum target, GLint level, GLenum internalforma ...@@ -824,7 +824,7 @@ void GL_APIENTRY CopyTexImage2D(GLenum target, GLint level, GLenum internalforma
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
const Framebuffer *framebuffer = context->getState().getReadFramebuffer(); const Framebuffer *framebuffer = context->getState().getReadFramebuffer();
Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Error error = texture->copyImage(target, level, sourceArea, internalformat, framebuffer); Error error = texture->copyImage(target, level, sourceArea, internalformat, framebuffer);
if (error.isError()) if (error.isError())
{ {
...@@ -861,7 +861,7 @@ void GL_APIENTRY CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL ...@@ -861,7 +861,7 @@ void GL_APIENTRY CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
const Framebuffer *framebuffer = context->getState().getReadFramebuffer(); const Framebuffer *framebuffer = context->getState().getReadFramebuffer();
Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer); Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
if (error.isError()) if (error.isError())
{ {
...@@ -1379,7 +1379,7 @@ void GL_APIENTRY FramebufferTexture2D(GLenum target, GLenum attachment, GLenum t ...@@ -1379,7 +1379,7 @@ void GL_APIENTRY FramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
} }
else else
{ {
ASSERT(IsCubemapTextureTarget(textarget)); ASSERT(IsCubeMapTextureTarget(textarget));
index = ImageIndex::MakeCube(textarget, level); index = ImageIndex::MakeCube(textarget, level);
} }
...@@ -1493,14 +1493,10 @@ void GL_APIENTRY GenerateMipmap(GLenum target) ...@@ -1493,14 +1493,10 @@ void GL_APIENTRY GenerateMipmap(GLenum target)
} }
// Cube completeness check // Cube completeness check
if (target == GL_TEXTURE_CUBE_MAP) if (target == GL_TEXTURE_CUBE_MAP && !texture->isCubeComplete())
{ {
TextureCubeMap *textureCube = static_cast<TextureCubeMap *>(texture); context->recordError(Error(GL_INVALID_OPERATION));
if (!textureCube->isCubeComplete()) return;
{
context->recordError(Error(GL_INVALID_OPERATION));
return;
}
} }
Error error = texture->generateMipmaps(); Error error = texture->generateMipmaps();
...@@ -3555,7 +3551,7 @@ void GL_APIENTRY TexImage2D(GLenum target, GLint level, GLint internalformat, GL ...@@ -3555,7 +3551,7 @@ void GL_APIENTRY TexImage2D(GLenum target, GLint level, GLint internalformat, GL
} }
Extents size(width, height, 1); Extents size(width, height, 1);
Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Error error = texture->setImage(target, level, internalformat, size, format, type, context->getState().getUnpackState(), Error error = texture->setImage(target, level, internalformat, size, format, type, context->getState().getUnpackState(),
reinterpret_cast<const uint8_t *>(pixels)); reinterpret_cast<const uint8_t *>(pixels));
if (error.isError()) if (error.isError())
...@@ -3696,7 +3692,7 @@ void GL_APIENTRY TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint ...@@ -3696,7 +3692,7 @@ void GL_APIENTRY TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint
} }
Box area(xoffset, yoffset, 0, width, height, 1); Box area(xoffset, yoffset, 0, width, height, 1);
Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target); Texture *texture = context->getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
Error error = texture->setSubImage(target, level, area, format, type, context->getState().getUnpackState(), Error error = texture->setSubImage(target, level, area, format, type, context->getState().getUnpackState(),
reinterpret_cast<const uint8_t *>(pixels)); reinterpret_cast<const uint8_t *>(pixels));
if (error.isError()) if (error.isError())
......
...@@ -6,8 +6,9 @@ ...@@ -6,8 +6,9 @@
#include "gmock/gmock.h" #include "gmock/gmock.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "common/utilities.h"
#include "libANGLE/ImageIndex.h" #include "libANGLE/ImageIndex.h"
#include "libANGLE/Texture.h"
using namespace gl; using namespace gl;
...@@ -55,7 +56,7 @@ TEST(ImageIndexTest, IteratorCube) ...@@ -55,7 +56,7 @@ TEST(ImageIndexTest, IteratorCube)
EXPECT_TRUE(iter.hasNext()); EXPECT_TRUE(iter.hasNext());
ImageIndex nextIndex = iter.next(); ImageIndex nextIndex = iter.next();
GLenum cubeTarget = TextureCubeMap::layerIndexToTarget(layer); GLenum cubeTarget = LayerIndexToCubeMapTextureTarget(layer);
EXPECT_EQ(cubeTarget, nextIndex.type); EXPECT_EQ(cubeTarget, nextIndex.type);
EXPECT_EQ(mip, nextIndex.mipIndex); EXPECT_EQ(mip, nextIndex.mipIndex);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment