diff options
Diffstat (limited to 'src/libGLESv2/Texture.cpp')
-rw-r--r-- | src/libGLESv2/Texture.cpp | 203 |
1 files changed, 78 insertions, 125 deletions
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp index 67f9a090..87e03042 100644 --- a/src/libGLESv2/Texture.cpp +++ b/src/libGLESv2/Texture.cpp @@ -44,6 +44,7 @@ GLenum Texture::getTarget() const void Texture::setUsage(GLenum usage) { mUsage = usage; + getImplementation()->setUsage(usage); } void Texture::getSamplerStateWithNativeOffset(SamplerState *sampler) @@ -99,6 +100,11 @@ rx::TextureStorageInterface *Texture::getNativeTexture() return getImplementation()->getNativeTexture(); } +void Texture::generateMipmaps() +{ + getImplementation()->generateMipmaps(); +} + void Texture::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) { getImplementation()->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, source); @@ -125,6 +131,11 @@ int Texture::mipLevels() const return log2(std::max(std::max(getBaseLevelWidth(), getBaseLevelHeight()), getBaseLevelDepth())) + 1; } +const rx::Image *Texture::getBaseLevelImage() const +{ + return (getImplementation()->getLayerCount(0) > 0 ? getImplementation()->getImage(0, 0) : NULL); +} + Texture2D::Texture2D(rx::Texture2DImpl *impl, GLuint id) : Texture(id, GL_TEXTURE_2D), mTexture(impl) @@ -143,16 +154,10 @@ Texture2D::~Texture2D() } } -void Texture2D::setUsage(GLenum usage) -{ - mUsage = usage; - mTexture->setUsage(usage); -} - GLsizei Texture2D::getWidth(GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(level)->getWidth(); + return mTexture->getImage(level, 0)->getWidth(); else return 0; } @@ -160,7 +165,7 @@ GLsizei Texture2D::getWidth(GLint level) const GLsizei Texture2D::getHeight(GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(level)->getHeight(); + return mTexture->getImage(level, 0)->getHeight(); else return 0; } @@ -168,7 +173,7 @@ GLsizei Texture2D::getHeight(GLint level) const GLenum Texture2D::getInternalFormat(GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(level)->getInternalFormat(); + return mTexture->getImage(level, 0)->getInternalFormat(); else return GL_NONE; } @@ -176,25 +181,16 @@ GLenum Texture2D::getInternalFormat(GLint level) const GLenum Texture2D::getActualFormat(GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(level)->getActualFormat(); + return mTexture->getImage(level, 0)->getActualFormat(); else return GL_NONE; } -void Texture2D::redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height) -{ - releaseTexImage(); - - mTexture->redefineImage(level, internalformat, width, height); -} - void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - GLenum sizedInternalFormat = GetSizedInternalFormat(internalFormat, type); - - redefineImage(level, sizedInternalFormat, width, height); + releaseTexImage(); - mTexture->setImage(level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_2D, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void Texture2D::bindTexImage(egl::Surface *surface) @@ -220,36 +216,33 @@ void Texture2D::releaseTexImage() void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) { - // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly - redefineImage(level, format, width, height); + releaseTexImage(); - mTexture->setCompressedImage(level, format, width, height, imageSize, pixels); + mTexture->setCompressedImage(GL_TEXTURE_2D, level, format, width, height, 1, imageSize, pixels); } void Texture2D::subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->subImage(level, xoffset, yoffset, width, height, format, type, unpack, pixels); + mTexture->subImage(GL_TEXTURE_2D, level, xoffset, yoffset, 0, width, height, 1, format, type, unpack, pixels); } void Texture2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) { - mTexture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, pixels); + mTexture->subImageCompressed(GL_TEXTURE_2D, level, xoffset, yoffset, 0, width, height, 1, format, imageSize, pixels); } void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) { - GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE); - - redefineImage(level, sizedInternalFormat, width, height); + releaseTexImage(); - mTexture->copyImage(level, format, x, y, width, height, source); + mTexture->copyImage(GL_TEXTURE_2D, level, format, x, y, width, height, source); } void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { mImmutable = true; - mTexture->storage(levels, internalformat, width, height); + mTexture->storage(GL_TEXTURE_2D, levels, internalformat, width, height, 1); } bool Texture2D::isCompressed(GLint level) const @@ -264,36 +257,24 @@ bool Texture2D::isDepth(GLint level) const void Texture2D::generateMipmaps() { - // Purge array levels 1 through q and reset them to represent the generated mipmap levels. - int levelCount = mipLevels(); - for (int level = 1; level < levelCount; level++) - { - redefineImage(level, getBaseLevelInternalFormat(), - std::max(getBaseLevelWidth() >> level, 1), - std::max(getBaseLevelHeight() >> level, 1)); - } + releaseTexImage(); mTexture->generateMipmaps(); } -const rx::Image *Texture2D::getBaseLevelImage() const -{ - return mTexture->getImage(0); -} - unsigned int Texture2D::getRenderTargetSerial(GLint level) { - return mTexture->getRenderTargetSerial(level); + return mTexture->getRenderTargetSerial(level, 0); } rx::RenderTarget *Texture2D::getRenderTarget(GLint level) { - return mTexture->getRenderTarget(level); + return mTexture->getRenderTarget(level, 0); } -rx::RenderTarget *Texture2D::getDepthSencil(GLint level) +rx::RenderTarget *Texture2D::getDepthStencil(GLint level) { - return mTexture->getDepthSencil(level); + return mTexture->getDepthStencil(level, 0); } TextureCubeMap::TextureCubeMap(rx::TextureCubeImpl *impl, GLuint id) @@ -307,16 +288,10 @@ TextureCubeMap::~TextureCubeMap() SafeDelete(mTexture); } -void TextureCubeMap::setUsage(GLenum usage) -{ - mUsage = usage; - mTexture->setUsage(usage); -} - GLsizei TextureCubeMap::getWidth(GLenum target, GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(target, level)->getWidth(); + return mTexture->getImage(level, targetToLayerIndex(target))->getWidth(); else return 0; } @@ -324,7 +299,7 @@ GLsizei TextureCubeMap::getWidth(GLenum target, GLint level) const GLsizei TextureCubeMap::getHeight(GLenum target, GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(target, level)->getHeight(); + return mTexture->getImage(level, targetToLayerIndex(target))->getHeight(); else return 0; } @@ -332,7 +307,7 @@ GLsizei TextureCubeMap::getHeight(GLenum target, GLint level) const GLenum TextureCubeMap::getInternalFormat(GLenum target, GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(target, level)->getInternalFormat(); + return mTexture->getImage(level, targetToLayerIndex(target))->getInternalFormat(); else return GL_NONE; } @@ -340,54 +315,54 @@ GLenum TextureCubeMap::getInternalFormat(GLenum target, GLint level) const GLenum TextureCubeMap::getActualFormat(GLenum target, GLint level) const { if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mTexture->getImage(target, level)->getActualFormat(); + return mTexture->getImage(level, targetToLayerIndex(target))->getActualFormat(); else return GL_NONE; } void TextureCubeMap::setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(0, level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void TextureCubeMap::setImageNegX(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(1, level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void TextureCubeMap::setImagePosY(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(2, level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void TextureCubeMap::setImageNegY(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(3, level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void TextureCubeMap::setImagePosZ(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(4, level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void TextureCubeMap::setImageNegZ(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(5, level, width, height, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, level, width, height, 1, internalFormat, format, type, unpack, pixels); } void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) { - mTexture->setCompressedImage(target, level, format, width, height, imageSize, pixels); + mTexture->setCompressedImage(target, level, format, width, height, 1, imageSize, pixels); } void TextureCubeMap::subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->subImage(target, level, xoffset, yoffset, width, height, format, type, unpack, pixels); + mTexture->subImage(target, level, xoffset, yoffset, 0, width, height, 1, format, type, unpack, pixels); } void TextureCubeMap::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) { - mTexture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, pixels); + mTexture->subImageCompressed(target, level, xoffset, yoffset, 0, width, height, 1, format, imageSize, pixels); } // Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81. @@ -415,34 +390,44 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size { mImmutable = true; - mTexture->storage(levels, internalformat, size); + mTexture->storage(GL_TEXTURE_CUBE_MAP, levels, internalformat, size, size, 1); } -void TextureCubeMap::generateMipmaps() +unsigned int TextureCubeMap::getRenderTargetSerial(GLenum target, GLint level) { - mTexture->generateMipmaps(); + return mTexture->getRenderTargetSerial(level, targetToLayerIndex(target)); } -const rx::Image *TextureCubeMap::getBaseLevelImage() const +int TextureCubeMap::targetToLayerIndex(GLenum target) { - // Note: if we are not cube-complete, there is no single base level image that can describe all - // cube faces, so this method is only well-defined for a cube-complete base level. - return mTexture->getImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0); + 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; } -unsigned int TextureCubeMap::getRenderTargetSerial(GLenum target, GLint level) +GLenum TextureCubeMap::layerIndexToTarget(GLint layer) { - return mTexture->getRenderTargetSerial(target, level); + 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; } rx::RenderTarget *TextureCubeMap::getRenderTarget(GLenum target, GLint level) { - return mTexture->getRenderTarget(target, level); + return mTexture->getRenderTarget(level, targetToLayerIndex(target)); } rx::RenderTarget *TextureCubeMap::getDepthStencil(GLenum target, GLint level) { - return mTexture->getDepthStencil(target, level); + return mTexture->getDepthStencil(level, targetToLayerIndex(target)); } Texture3D::Texture3D(rx::Texture3DImpl *impl, GLuint id) @@ -456,35 +441,29 @@ Texture3D::~Texture3D() SafeDelete(mTexture); } -void Texture3D::setUsage(GLenum usage) -{ - mUsage = usage; - mTexture->setUsage(usage); -} - GLsizei Texture3D::getWidth(GLint level) const { - return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getWidth() : 0; + return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level, 0)->getWidth() : 0; } GLsizei Texture3D::getHeight(GLint level) const { - return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getHeight() : 0; + return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level, 0)->getHeight() : 0; } GLsizei Texture3D::getDepth(GLint level) const { - return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getDepth() : 0; + return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level, 0)->getDepth() : 0; } GLenum Texture3D::getInternalFormat(GLint level) const { - return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getInternalFormat() : GL_NONE; + return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level, 0)->getInternalFormat() : GL_NONE; } GLenum Texture3D::getActualFormat(GLint level) const { - return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level)->getActualFormat() : GL_NONE; + return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) ? mTexture->getImage(level, 0)->getActualFormat() : GL_NONE; } bool Texture3D::isCompressed(GLint level) const @@ -499,39 +478,29 @@ bool Texture3D::isDepth(GLint level) const void Texture3D::setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(level, width, height, depth, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_3D, level, width, height, depth, internalFormat, format, type, unpack, pixels); } void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) { - mTexture->setCompressedImage(level, format, width, height, depth, imageSize, pixels); + mTexture->setCompressedImage(GL_TEXTURE_3D, level, format, width, height, depth, imageSize, pixels); } void Texture3D::subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels); + mTexture->subImage(GL_TEXTURE_3D, level, xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels); } void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { - mTexture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); + mTexture->subImageCompressed(GL_TEXTURE_3D, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); } void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { mImmutable = true; - mTexture->storage(levels, internalformat, width, height, depth); -} - -void Texture3D::generateMipmaps() -{ - mTexture->generateMipmaps(); -} - -const rx::Image *Texture3D::getBaseLevelImage() const -{ - return mTexture->getImage(0); + mTexture->storage(GL_TEXTURE_3D, levels, internalformat, width, height, depth); } unsigned int Texture3D::getRenderTargetSerial(GLint level, GLint layer) @@ -561,12 +530,6 @@ Texture2DArray::~Texture2DArray() SafeDelete(mTexture); } -void Texture2DArray::setUsage(GLenum usage) -{ - mUsage = usage; - mTexture->setUsage(usage); -} - GLsizei Texture2DArray::getWidth(GLint level) const { return (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS && mTexture->getLayerCount(level) > 0) ? mTexture->getImage(level, 0)->getWidth() : 0; @@ -604,39 +567,29 @@ bool Texture2DArray::isDepth(GLint level) const void Texture2DArray::setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->setImage(level, width, height, depth, internalFormat, format, type, unpack, pixels); + mTexture->setImage(GL_TEXTURE_2D_ARRAY, level, width, height, depth, internalFormat, format, type, unpack, pixels); } void Texture2DArray::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) { - mTexture->setCompressedImage(level, format, width, height, depth, imageSize, pixels); + mTexture->setCompressedImage(GL_TEXTURE_2D_ARRAY, level, format, width, height, depth, imageSize, pixels); } void Texture2DArray::subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels) { - mTexture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels); + mTexture->subImage(GL_TEXTURE_2D_ARRAY, level, xoffset, yoffset, zoffset, width, height, depth, format, type, unpack, pixels); } void Texture2DArray::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { - mTexture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); + mTexture->subImageCompressed(GL_TEXTURE_2D_ARRAY, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); } void Texture2DArray::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { mImmutable = true; - mTexture->storage(levels, internalformat, width, height, depth); -} - -void Texture2DArray::generateMipmaps() -{ - mTexture->generateMipmaps(); -} - -const rx::Image *Texture2DArray::getBaseLevelImage() const -{ - return (mTexture->getLayerCount(0) > 0 ? mTexture->getImage(0, 0) : NULL); + mTexture->storage(GL_TEXTURE_2D_ARRAY, levels, internalformat, width, height, depth); } unsigned int Texture2DArray::getRenderTargetSerial(GLint level, GLint layer) |