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
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)
......
......@@ -34,7 +34,11 @@ int VariableSortOrder(GLenum type);
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);
......
......@@ -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
// 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);
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);
if (mClientVersion >= 3)
{
// 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);
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);
}
......@@ -724,39 +724,9 @@ Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
Texture *Context::getTargetTexture(GLenum target) const
{
if (!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));
}
ASSERT(ValidTextureTarget(this, target));
Texture3D *Context::getTexture3D() const
{
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));
return getSamplerTexture(mState.getActiveSampler(), target);
}
Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
......
......@@ -42,10 +42,6 @@ class Compiler;
class Shader;
class Program;
class Texture;
class Texture2D;
class TextureCubeMap;
class Texture3D;
class Texture2DArray;
class Framebuffer;
class Renderbuffer;
class FenceNV;
......@@ -151,11 +147,6 @@ class Context
TransformFeedback *getTransformFeedback(GLuint handle) 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;
Compiler *getCompiler() const;
......
......@@ -123,7 +123,7 @@ GLint TextureAttachment::mipLevel() 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
......
......@@ -7,7 +7,7 @@
// ImageIndex.cpp: Implementation for ImageIndex methods.
#include "libANGLE/ImageIndex.h"
#include "libANGLE/Texture.h"
#include "libANGLE/Constants.h"
#include "common/utilities.h"
namespace gl
......@@ -34,8 +34,8 @@ ImageIndex ImageIndex::Make2D(GLint mipIndex)
ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex)
{
ASSERT(gl::IsCubemapTextureTarget(target));
return ImageIndex(target, mipIndex, TextureCubeMap::targetToLayerIndex(target));
ASSERT(gl::IsCubeMapTextureTarget(target));
return ImageIndex(target, mipIndex, CubeMapTextureTargetToLayerIndex(target));
}
ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex)
......@@ -134,7 +134,7 @@ ImageIndex ImageIndexIterator::current() const
if (mType == GL_TEXTURE_CUBE_MAP)
{
value.type = TextureCubeMap::layerIndexToTarget(mCurrentLayer);
value.type = LayerIndexToCubeMapTextureTarget(mCurrentLayer);
}
return value;
......
......@@ -370,30 +370,7 @@ void ResourceManager::checkTextureAllocation(GLuint texture, GLenum type)
{
if (!getTexture(texture) && texture != 0)
{
Texture *textureObject;
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;
}
Texture *textureObject = new Texture(mRenderer->createTexture(type), texture, type);
mTextureMap[texture] = textureObject;
textureObject->addRef();
}
......
......@@ -4,9 +4,7 @@
// found in the LICENSE file.
//
// Texture.cpp: Implements the gl::Texture class and its derived classes
// Texture2D and TextureCubeMap. Implements GL texture objects and related
// functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
// Texture.cpp: Implements the gl::Texture class. [OpenGL ES 2.0.24] section 3.7 page 63.
#include "libANGLE/Texture.h"
#include "libANGLE/Context.h"
......@@ -87,28 +85,132 @@ GLenum Texture::getUsage() 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;
}
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;
}
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;
}
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;
}
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
{
return mTextureSerial;
......@@ -132,7 +234,7 @@ int Texture::immutableLevelCount()
Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, GLenum format, GLenum type,
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);
if (error.isError())
......@@ -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,
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);
}
......@@ -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,
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);
if (error.isError())
......@@ -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,
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);
}
......@@ -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,
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);
if (error.isError())
......@@ -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,
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);
}
......@@ -238,7 +340,7 @@ Error Texture::generateMipmaps()
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);
size_t mipLevels = log2(std::max(std::max(baseImageInfo.size.width, baseImageInfo.size.height), baseImageInfo.size.depth)) + 1;
setImageDescChain(mipLevels, baseImageInfo.size, baseImageInfo.internalFormat);
......@@ -257,7 +359,7 @@ void Texture::setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInt
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);
}
......@@ -329,69 +431,45 @@ void Texture::releaseTexImage()
}
}
Texture2D::Texture2D(rx::TextureImpl *impl, GLuint id)
: Texture(impl, id, GL_TEXTURE_2D)
GLenum Texture::getBaseImageTarget() const
{
return mTarget == GL_TEXTURE_CUBE_MAP ? FirstCubeMapTextureTarget : mTarget;
}
Texture2D::~Texture2D()
size_t Texture::getExpectedMipLevels() const
{
}
// Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85.
bool Texture2D::isSamplerComplete(const SamplerState &samplerState, const Data &data) const
{
size_t width = getWidth(GL_TEXTURE_2D, 0);
size_t height = getHeight(GL_TEXTURE_2D, 0);
if (width == 0 || height == 0)
GLenum baseTarget = getBaseImageTarget();
size_t width = getWidth(baseTarget, 0);
size_t height = getHeight(baseTarget, 0);
if (mTarget == GL_TEXTURE_3D)
{
return false;
size_t depth = getDepth(baseTarget, 0);
return log2(std::max(std::max(width, height), depth)) + 1;
}
GLenum internalFormat = getInternalFormat(GL_TEXTURE_2D, 0);
if (!data.textureCaps->get(internalFormat).filterable && !IsPointSampled(samplerState))
else
{
return false;
}
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;
}
return log2(std::max(width, height)) + 1;
}
}
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;
}
}
}
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)
else
{
if ((samplerState.minFilter != GL_NEAREST && samplerState.minFilter != GL_NEAREST_MIPMAP_NEAREST) ||
samplerState.magFilter != GL_NEAREST)
if (!isLevelComplete(mTarget, level))
{
return false;
}
......@@ -401,25 +479,8 @@ bool Texture2D::isSamplerComplete(const SamplerState &samplerState, const Data &
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;
for (size_t level = 0; level < expectedMipLevels; level++)
{
if (!isLevelComplete(level))
{
return false;
}
}
return true;
}
bool Texture2D::isLevelComplete(size_t level) const
bool Texture::isLevelComplete(GLenum target, size_t level) const
{
ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
......@@ -428,9 +489,10 @@ bool Texture2D::isLevelComplete(size_t level) const
return true;
}
size_t width = getWidth(GL_TEXTURE_2D, 0);
size_t height = getHeight(GL_TEXTURE_2D, 0);
if (width == 0 || height == 0)
size_t width = getWidth(target, 0);
size_t height = getHeight(target, 0);
size_t depth = getHeight(target, 0);
if (width == 0 || height == 0 || depth == 0)
{
return false;
}
......@@ -441,323 +503,31 @@ bool Texture2D::isLevelComplete(size_t level) const
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))
{
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 true;
}
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))
if (getHeight(target, level) != std::max<size_t>(1, height >> level))
{
return false;
}
if (IsMipmapFiltered(samplerState) && !isMipmapComplete())
if (mTarget == GL_TEXTURE_3D)
{
return false;
}
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))
if (getDepth(target, level) != std::max<size_t>(1, depth >> level))
{
return false;
}
}
return true;
}
bool Texture3D::isLevelComplete(size_t level) const
{
ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
if (isImmutable())
else if (mTarget == GL_TEXTURE_2D_ARRAY)
{
return true;
}
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))
if (getDepth(target, level) != depth)
{
return false;
}
......@@ -766,49 +536,4 @@ bool Texture2DArray::isMipmapComplete() const
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 @@
// found in the LICENSE file.
//
// Texture.h: Defines the abstract gl::Texture class and its concrete derived
// classes Texture2D and TextureCubeMap. Implements GL texture objects and
// related functionality. [OpenGL ES 2.0.24] section 3.7 page 63.
// Texture.h: Defines the gl::Texture class [OpenGL ES 2.0.24] section 3.7 page 63.
#ifndef LIBANGLE_TEXTURE_H_
#define LIBANGLE_TEXTURE_H_
......@@ -35,7 +33,7 @@ struct Data;
bool IsMipmapFiltered(const gl::SamplerState &samplerState);
class Texture : public RefCountObject
class Texture final : public RefCountObject
{
public:
Texture(rx::TextureImpl *impl, GLuint id, GLenum target);
......@@ -55,7 +53,8 @@ class Texture : public RefCountObject
size_t getDepth(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,
const PixelUnpackState &unpack, const uint8_t *pixels);
......@@ -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.
protected:
private:
DISALLOW_COPY_AND_ASSIGN(Texture);
static unsigned int issueTextureSerial();
rx::TextureImpl *mTexture;
......@@ -126,8 +127,11 @@ class Texture : public RefCountObject
const unsigned int mTextureSerial;
static unsigned int mCurrentTextureSerial;
private:
DISALLOW_COPY_AND_ASSIGN(Texture);
GLenum getBaseImageTarget() const;
size_t getExpectedMipLevels() const;
bool isMipmapComplete() const;
bool isLevelComplete(GLenum target, size_t level) const;
const ImageDesc &getImageDesc(const ImageIdentifier& index) const;
void setImageDesc(const ImageIdentifier& index, const ImageDesc &desc);
......@@ -140,75 +144,6 @@ class Texture : public RefCountObject
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_
......@@ -18,11 +18,6 @@ class Display;
class Config;
}
namespace gl
{
class Texture2D;
}
namespace rx
{
......
......@@ -582,15 +582,7 @@ gl::Texture *RendererD3D::getIncompleteTexture(GLenum type)
const gl::Extents colorSize(1, 1, 1);
const gl::PixelUnpackState incompleteUnpackState(1);
gl::Texture* t = NULL;
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;
}
gl::Texture* t = new gl::Texture(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID, type);
if (type == GL_TEXTURE_CUBE_MAP)
{
......
......@@ -434,7 +434,7 @@ bool TextureD3D::isBaseImageZeroSize() const
return true;
}
if (!gl::IsCubemapTextureTarget(baseImage->getTarget()) && baseImage->getHeight() <= 0)
if (!gl::IsCubeMapTextureTarget(baseImage->getTarget()) && baseImage->getHeight() <= 0)
{
return true;
}
......@@ -1213,7 +1213,7 @@ gl::Error TextureD3D_Cube::setCompressedImage(GLenum target, size_t level, GLenu
ASSERT(size.depth == 1);
// 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);
......@@ -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,
const gl::Framebuffer *source)
{
int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target);
size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE);
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
gl::Error TextureD3D_Cube::copySubImage(GLenum target, size_t level, const gl::Offset &destOffset, const gl::Rectangle &sourceArea,
const gl::Framebuffer *source)
{
int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target);
size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
......@@ -1427,7 +1427,7 @@ unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &index)
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
gl::Error error = ensureRenderTarget();
......@@ -1605,7 +1605,7 @@ gl::Error TextureD3D_Cube::updateStorageFaceLevel(int faceIndex, int level)
if (image->isDirty())
{
GLenum faceTarget = gl::TextureCubeMap::layerIndexToTarget(faceIndex);
GLenum faceTarget = gl::LayerIndexToCubeMapTextureTarget(faceIndex);
gl::ImageIndex index = gl::ImageIndex::MakeCube(faceTarget, level);
gl::Box region(0, 0, 0, image->getWidth(), image->getHeight(), 1);
gl::Error error = commitRegion(index, region);
......@@ -1659,12 +1659,12 @@ gl::ImageIndexIterator TextureD3D_Cube::imageIterator() const
gl::ImageIndex TextureD3D_Cube::getImageIndex(GLint mip, GLint layer) const
{
// 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
{
return (mTexStorage && gl::IsCubemapTextureTarget(index.type) &&
return (mTexStorage && gl::IsCubeMapTextureTarget(index.type) &&
index.mipIndex >= 0 && index.mipIndex < mTexStorage->getLevelCount());
}
......
......@@ -111,7 +111,7 @@ static bool ImageIndexConflictsWithSRV(const gl::ImageIndex *index, D3D11_SHADER
unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize;
// 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.FirstArraySlice <= layerIndex && layerIndex < maxSlice;
}
......@@ -121,7 +121,7 @@ static bool ImageIndexConflictsWithSRV(const gl::ImageIndex *index, D3D11_SHADER
unsigned maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip;
maxSrvMip = (desc.TextureCube.MipLevels == -1) ? INT_MAX : maxSrvMip;
return gl::IsCubemapTextureTarget(type) &&
return gl::IsCubeMapTextureTarget(type) &&
desc.TextureCube.MostDetailedMip <= mipLevel && mipLevel < maxSrvMip;
}
......
......@@ -402,7 +402,7 @@ gl::Error Image9::copyToStorage(TextureStorage *storage, const gl::ImageIndex &i
}
else
{
ASSERT(gl::IsCubemapTextureTarget(index.type));
ASSERT(gl::IsCubeMapTextureTarget(index.type));
TextureStorage9_Cube *storage9 = TextureStorage9_Cube::makeTextureStorage9_Cube(storage);
gl::Error error = storage9->getCubeMapSurface(index.type, index.mipIndex, true, &destSurface);
if (error.isError())
......
......@@ -1259,7 +1259,7 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi
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)
{
context->recordError(Error(GL_INVALID_OPERATION));
......@@ -1298,7 +1298,7 @@ bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLi
}
else
{
if (IsCubemapTextureTarget(target) && width != height)
if (IsCubeMapTextureTarget(target) && width != height)
{
context->recordError(Error(GL_INVALID_VALUE));
return false;
......
......@@ -62,7 +62,7 @@ bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level,
return false;
}
}
else if (IsCubemapTextureTarget(target))
else if (IsCubeMapTextureTarget(target))
{
if (!isSubImage && width != height)
{
......@@ -83,7 +83,7 @@ bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level,
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)
{
context->recordError(Error(GL_INVALID_OPERATION));
......@@ -799,19 +799,7 @@ bool ValidateES2TexStorageParameters(Context *context, GLenum target, GLsizei le
break;
}
gl::Texture *texture = NULL;
switch(target)
{
case GL_TEXTURE_2D:
texture = context->getTexture2D();
break;
case GL_TEXTURE_CUBE_MAP:
texture = context->getTextureCubeMap();
break;
default:
UNREACHABLE();
}
gl::Texture *texture = context->getTargetTexture(target);
if (!texture || texture->id() == 0)
{
context->recordError(Error(GL_INVALID_OPERATION));
......
......@@ -366,7 +366,7 @@ bool ValidateES3TexImageParameters(Context *context, GLenum target, GLint level,
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)
{
context->recordError(Error(GL_INVALID_OPERATION));
......@@ -865,13 +865,10 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
const gl::Caps &caps = context->getCaps();
gl::Texture *texture = NULL;
switch (target)
{
case GL_TEXTURE_2D:
{
texture = context->getTexture2D();
if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
static_cast<GLuint>(height) > caps.max2DTextureSize)
{
......@@ -883,8 +880,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
case GL_TEXTURE_CUBE_MAP:
{
texture = context->getTextureCubeMap();
if (width != height)
{
context->recordError(Error(GL_INVALID_VALUE));
......@@ -901,8 +896,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
case GL_TEXTURE_3D:
{
texture = context->getTexture3D();
if (static_cast<GLuint>(width) > caps.max3DTextureSize ||
static_cast<GLuint>(height) > caps.max3DTextureSize ||
static_cast<GLuint>(depth) > caps.max3DTextureSize)
......@@ -915,8 +908,6 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
case GL_TEXTURE_2D_ARRAY:
{
texture = context->getTexture2DArray();
if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
static_cast<GLuint>(height) > caps.max2DTextureSize ||
static_cast<GLuint>(depth) > caps.maxArrayTextureLayers)
......@@ -932,6 +923,7 @@ bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei le
return false;
}
gl::Texture *texture = context->getTargetTexture(target);
if (!texture || texture->id() == 0)
{
context->recordError(Error(GL_INVALID_OPERATION));
......
......@@ -742,7 +742,7 @@ void GL_APIENTRY CompressedTexImage2D(GLenum target, GLint level, GLenum interna
}
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(),
reinterpret_cast<const uint8_t *>(data));
if (error.isError())
......@@ -787,7 +787,7 @@ void GL_APIENTRY CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs
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(),
reinterpret_cast<const uint8_t *>(data));
if (error.isError())
......@@ -824,7 +824,7 @@ void GL_APIENTRY CopyTexImage2D(GLenum target, GLint level, GLenum internalforma
Rectangle sourceArea(x, y, width, height);
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);
if (error.isError())
{
......@@ -861,7 +861,7 @@ void GL_APIENTRY CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
Rectangle sourceArea(x, y, width, height);
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);
if (error.isError())
{
......@@ -1379,7 +1379,7 @@ void GL_APIENTRY FramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
}
else
{
ASSERT(IsCubemapTextureTarget(textarget));
ASSERT(IsCubeMapTextureTarget(textarget));
index = ImageIndex::MakeCube(textarget, level);
}
......@@ -1493,14 +1493,10 @@ void GL_APIENTRY GenerateMipmap(GLenum target)
}
// Cube completeness check
if (target == GL_TEXTURE_CUBE_MAP)
if (target == GL_TEXTURE_CUBE_MAP && !texture->isCubeComplete())
{
TextureCubeMap *textureCube = static_cast<TextureCubeMap *>(texture);
if (!textureCube->isCubeComplete())
{
context->recordError(Error(GL_INVALID_OPERATION));
return;
}
context->recordError(Error(GL_INVALID_OPERATION));
return;
}
Error error = texture->generateMipmaps();
......@@ -3555,7 +3551,7 @@ void GL_APIENTRY TexImage2D(GLenum target, GLint level, GLint internalformat, GL
}
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(),
reinterpret_cast<const uint8_t *>(pixels));
if (error.isError())
......@@ -3696,7 +3692,7 @@ void GL_APIENTRY TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint
}
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(),
reinterpret_cast<const uint8_t *>(pixels));
if (error.isError())
......
......@@ -6,8 +6,9 @@
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "common/utilities.h"
#include "libANGLE/ImageIndex.h"
#include "libANGLE/Texture.h"
using namespace gl;
......@@ -55,7 +56,7 @@ TEST(ImageIndexTest, IteratorCube)
EXPECT_TRUE(iter.hasNext());
ImageIndex nextIndex = iter.next();
GLenum cubeTarget = TextureCubeMap::layerIndexToTarget(layer);
GLenum cubeTarget = LayerIndexToCubeMapTextureTarget(layer);
EXPECT_EQ(cubeTarget, nextIndex.type);
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