1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Texture.h: Defines the abstract Texture class and its concrete derived 16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// classes Texture2D and TextureCubeMap. Implements GL texture objects and 17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// related functionality. [OpenGL ES 2.0.24] section 3.7 page 63. 18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef LIBGLESV2_TEXTURE_H_ 20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define LIBGLESV2_TEXTURE_H_ 21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Renderbuffer.h" 23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "common/Object.hpp" 24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "utilities.h" 25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "libEGL/Texture.hpp" 26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "common/debug.h" 27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <GLES2/gl2.h> 29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <vector> 31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace egl 33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Surface; 35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Config; 36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens} 37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace es2 39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Framebuffer; 41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensenum 43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS, 45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1), 46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1), 47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION, 48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture : public egl::Texture 51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic: 53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens explicit Texture(GLuint name); 54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual sw::Resource *getResource() const; 56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void addProxyRef(const Renderbuffer *proxy) = 0; 58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void releaseProxy(const Renderbuffer *proxy) = 0; 59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getTarget() const = 0; 61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setMinFilter(GLenum filter); 63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setMagFilter(GLenum filter); 64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setWrapS(GLenum wrap); 65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setWrapT(GLenum wrap); 66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setWrapR(GLenum wrap); 67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setMaxAnisotropy(GLfloat textureMaxAnisotropy); 68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setBaseLevel(GLint baseLevel); 69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setCompareFunc(GLenum compareFunc); 70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setCompareMode(GLenum compareMode); 71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void makeImmutable(GLsizei levels); 72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setMaxLevel(GLint maxLevel); 73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setMaxLOD(GLfloat maxLOD); 74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setMinLOD(GLfloat minLOD); 75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setSwizzleR(GLenum swizzleR); 76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setSwizzleG(GLenum swizzleG); 77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setSwizzleB(GLenum swizzleB); 78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool setSwizzleA(GLenum swizzleA); 79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getMinFilter() const; 81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getMagFilter() const; 82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getWrapS() const; 83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getWrapT() const; 84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getWrapR() const; 85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLfloat getMaxAnisotropy() const; 86d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLint getBaseLevel() const; 87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getCompareFunc() const; 88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getCompareMode() const; 89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLboolean getImmutableFormat() const; 90d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLsizei getImmutableLevels() const; 91d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLint getMaxLevel() const; 92d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLfloat getMaxLOD() const; 93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLfloat getMinLOD() const; 94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getSwizzleR() const; 95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getSwizzleG() const; 96d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getSwizzleB() const; 97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum getSwizzleA() const; 98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 99d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getWidth(GLenum target, GLint level) const = 0; 100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getHeight(GLenum target, GLint level) const = 0; 101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getDepth(GLenum target, GLint level) const; 102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getFormat(GLenum target, GLint level) const = 0; 103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getType(GLenum target, GLint level) const = 0; 104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual sw::Format getInternalFormat(GLenum target, GLint level) const = 0; 105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual int getLevelCount() const = 0; 106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isSamplerComplete() const = 0; 108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isCompressed(GLenum target, GLint level) const = 0; 109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isDepth(GLenum target, GLint level) const = 0; 110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer) = 0; 112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual egl::Image *getRenderTarget(GLenum target, unsigned int level) = 0; 113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual egl::Image *createSharedImage(GLenum target, unsigned int level); 114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isShared(GLenum target, unsigned int level) const = 0; 115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void generateMipmaps() = 0; 117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0; 118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected: 120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual ~Texture(); 121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setImage(GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image); 123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image); 124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image); 125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image); 126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool copy(egl::Image *source, const sw::SliceRect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, GLint zoffset, egl::Image *dest); 128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isMipmapFiltered() const; 130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mMinFilter; 132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mMagFilter; 133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mWrapS; 134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mWrapT; 135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mWrapR; 136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLfloat mMaxAnisotropy; 137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLint mBaseLevel; 138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mCompareFunc; 139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mCompareMode; 140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLboolean mImmutableFormat; 141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLsizei mImmutableLevels; 142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLint mMaxLevel; 143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLfloat mMaxLOD; 144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLfloat mMinLOD; 145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mSwizzleR; 146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mSwizzleG; 147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mSwizzleB; 148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens GLenum mSwizzleA; 149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens sw::Resource *resource; 151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture2D : public Texture 154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic: 156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens explicit Texture2D(GLuint name); 157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void addProxyRef(const Renderbuffer *proxy) override; 159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void releaseProxy(const Renderbuffer *proxy) override; 160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void sweep() override; 161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getTarget() const; 163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getWidth(GLenum target, GLint level) const; 165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getHeight(GLenum target, GLint level) const; 166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getFormat(GLenum target, GLint level) const; 167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getType(GLenum target, GLint level) const; 168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual sw::Format getInternalFormat(GLenum target, GLint level) const; 169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual int getLevelCount() const; 170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); 172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); 174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); 175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setImage(egl::Image *image); 179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isSamplerComplete() const; 181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isCompressed(GLenum target, GLint level) const; 182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isDepth(GLenum target, GLint level) const; 183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void bindTexImage(egl::Surface *surface); 184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void releaseTexImage(); 185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void generateMipmaps(); 187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer); 189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual egl::Image *getRenderTarget(GLenum target, unsigned int level); 190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isShared(GLenum target, unsigned int level) const; 191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *getImage(unsigned int level); 193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected: 195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual ~Texture2D(); 196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isMipmapComplete() const; 198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Surface *mSurface; 202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // A specific internal reference count is kept for colorbuffer proxy references, 204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // because, as the renderbuffer acting as proxy will maintain a binding pointer 205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // back to this texture, there would be a circular reference if we used a binding 206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // pointer here. This reference count will cause the pointer to be set to null if 207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // the count drops to zero, but will not cause deletion of the Renderbuffer. 208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Renderbuffer *mColorbufferProxy; 209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens unsigned int mProxyRefs; 210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass TextureCubeMap : public Texture 213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic: 215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens explicit TextureCubeMap(GLuint name); 216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void addProxyRef(const Renderbuffer *proxy) override; 218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void releaseProxy(const Renderbuffer *proxy) override; 219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void sweep() override; 220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getTarget() const; 222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getWidth(GLenum target, GLint level) const; 224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getHeight(GLenum target, GLint level) const; 225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getFormat(GLenum target, GLint level) const; 226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getType(GLenum target, GLint level) const; 227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual sw::Format getInternalFormat(GLenum target, GLint level) const; 228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual int getLevelCount() const; 229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); 231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); 234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); 235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isSamplerComplete() const; 239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isCompressed(GLenum target, GLint level) const; 240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isDepth(GLenum target, GLint level) const; 241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void releaseTexImage(); 242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void generateMipmaps(); 244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer); 246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual egl::Image *getRenderTarget(GLenum target, unsigned int level); 247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isShared(GLenum target, unsigned int level) const; 248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *getImage(int face, unsigned int level); 250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected: 252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual ~TextureCubeMap(); 253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprivate: 255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isCubeComplete() const; 256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isMipmapCubeComplete() const; 257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // face is one of the GL_TEXTURE_CUBE_MAP_* enumerants. Returns nullptr on failure. 259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *getImage(GLenum face, unsigned int level); 260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *image[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // A specific internal reference count is kept for colorbuffer proxy references, 264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // because, as the renderbuffer acting as proxy will maintain a binding pointer 265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // back to this texture, there would be a circular reference if we used a binding 266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // pointer here. This reference count will cause the pointer to be set to null if 267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // the count drops to zero, but will not cause deletion of the Renderbuffer. 268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Renderbuffer *mFaceProxies[6]; 269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens unsigned int mFaceProxyRefs[6]; 270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture3D : public Texture 273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic: 275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens explicit Texture3D(GLuint name); 276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void addProxyRef(const Renderbuffer *proxy) override; 278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void releaseProxy(const Renderbuffer *proxy) override; 279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void sweep() override; 280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getTarget() const; 282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getWidth(GLenum target, GLint level) const; 284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getHeight(GLenum target, GLint level) const; 285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLsizei getDepth(GLenum target, GLint level) const; 286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getFormat(GLenum target, GLint level) const; 287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getType(GLenum target, GLint level) const; 288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual sw::Format getInternalFormat(GLenum target, GLint level) const; 289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual int getLevelCount() const; 290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); 292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); 293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); 294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); 295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Framebuffer *source); 296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void setImage(egl::Image *image); 299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isSamplerComplete() const; 301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isCompressed(GLenum target, GLint level) const; 302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isDepth(GLenum target, GLint level) const; 303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void bindTexImage(egl::Surface *surface); 304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void releaseTexImage(); 305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void generateMipmaps(); 307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer); 309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual egl::Image *getRenderTarget(GLenum target, unsigned int level); 310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual bool isShared(GLenum target, unsigned int level) const; 311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *getImage(unsigned int level); 313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected: 315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual ~Texture3D(); 316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isMipmapComplete() const; 318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens egl::Surface *mSurface; 322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // A specific internal reference count is kept for colorbuffer proxy references, 324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // because, as the renderbuffer acting as proxy will maintain a binding pointer 325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // back to this texture, there would be a circular reference if we used a binding 326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // pointer here. This reference count will cause the pointer to be set to null if 327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // the count drops to zero, but will not cause deletion of the Renderbuffer. 328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Renderbuffer *mColorbufferProxy; 329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens unsigned int mProxyRefs; 330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Texture2DArray : public Texture3D 333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic: 335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens explicit Texture2DArray(GLuint name); 336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getTarget() const; 338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual void generateMipmaps(); 339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected: 341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual ~Texture2DArray(); 342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass TextureExternal : public Texture2D 345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic: 347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens explicit TextureExternal(GLuint name); 348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual GLenum getTarget() const; 350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprotected: 352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens virtual ~TextureExternal(); 353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}; 354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens} 355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif // LIBGLESV2_TEXTURE_H_ 357