diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Texture.h')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Texture.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Texture.h b/src/3rdparty/angle/src/libANGLE/Texture.h new file mode 100644 index 0000000000..b5a0717713 --- /dev/null +++ b/src/3rdparty/angle/src/libANGLE/Texture.h @@ -0,0 +1,156 @@ +// +// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// 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_ + +#include "common/debug.h" +#include "libANGLE/RefCountObject.h" +#include "libANGLE/angletypes.h" +#include "libANGLE/Constants.h" +#include "libANGLE/renderer/TextureImpl.h" +#include "libANGLE/Caps.h" + +#include "angle_gl.h" + +#include <vector> +#include <map> + +namespace egl +{ +class Surface; +} + +namespace gl +{ +class Framebuffer; +struct Data; + +bool IsMipmapFiltered(const gl::SamplerState &samplerState); + +class Texture final : public RefCountObject +{ + public: + Texture(rx::TextureImpl *impl, GLuint id, GLenum target); + + virtual ~Texture(); + + GLenum getTarget() const; + + const SamplerState &getSamplerState() const { return mSamplerState; } + SamplerState &getSamplerState() { return mSamplerState; } + + void setUsage(GLenum usage); + GLenum getUsage() const; + + size_t getWidth(GLenum target, size_t level) const; + size_t getHeight(GLenum target, size_t level) const; + size_t getDepth(GLenum target, size_t level) const; + GLenum getInternalFormat(GLenum target, size_t level) const; + + 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); + virtual Error setSubImage(GLenum target, size_t level, const Box &area, GLenum format, GLenum type, + const PixelUnpackState &unpack, const uint8_t *pixels); + + virtual Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &size, + const PixelUnpackState &unpack, const uint8_t *pixels); + virtual Error setCompressedSubImage(GLenum target, size_t level, const Box &area, GLenum format, + const PixelUnpackState &unpack, const uint8_t *pixels); + + virtual Error copyImage(GLenum target, size_t level, const Rectangle &sourceArea, GLenum internalFormat, + const Framebuffer *source); + virtual Error copySubImage(GLenum target, size_t level, const Offset &destOffset, const Rectangle &sourceArea, + const Framebuffer *source); + + virtual Error setStorage(GLenum target, size_t levels, GLenum internalFormat, const Extents &size); + + virtual Error generateMipmaps(); + + // Texture serials provide a unique way of identifying a Texture that isn't a raw pointer. + // "id" is not good enough, as Textures can be deleted, then re-allocated with the same id. + unsigned int getTextureSerial() const; + + bool isImmutable() const; + GLsizei immutableLevelCount(); + + void bindTexImage(egl::Surface *surface); + void releaseTexImage(); + + rx::TextureImpl *getImplementation() { return mTexture; } + const rx::TextureImpl *getImplementation() const { return mTexture; } + + 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. + + private: + static unsigned int issueTextureSerial(); + + rx::TextureImpl *mTexture; + + SamplerState mSamplerState; + GLenum mUsage; + + GLsizei mImmutableLevelCount; + + GLenum mTarget; + + + struct ImageDesc + { + Extents size; + GLenum internalFormat; + + ImageDesc(); + ImageDesc(const Extents &size, GLenum internalFormat); + }; + + const unsigned int mTextureSerial; + static unsigned int mCurrentTextureSerial; + + GLenum getBaseImageTarget() const; + size_t getExpectedMipLevels() const; + + bool computeSamplerCompleteness(const SamplerState &samplerState, const Data &data) const; + bool computeMipmapCompleteness(const gl::SamplerState &samplerState) const; + bool computeLevelCompleteness(GLenum target, size_t level, const gl::SamplerState &samplerState) const; + + const ImageDesc &getImageDesc(GLenum target, size_t level) const; + void setImageDesc(GLenum target, size_t level, const ImageDesc &desc); + void setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInternalFormat); + void clearImageDesc(GLenum target, size_t level); + void clearImageDescs(); + + std::vector<ImageDesc> mImageDescs; + + struct SamplerCompletenessCache + { + SamplerCompletenessCache(); + + bool cacheValid; + + // All values that affect sampler completeness that are not stored within + // the texture itself + SamplerState samplerState; + bool filterable; + GLint clientVersion; + bool supportsNPOT; + + // Result of the sampler completeness with the above parameters + bool samplerComplete; + }; + mutable SamplerCompletenessCache mCompletenessCache; + + egl::Surface *mBoundSurface; +}; + +} + +#endif // LIBANGLE_TEXTURE_H_ |