1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Texture.h: Defines the abstract Texture class and its concrete derived 16 // classes Texture2D and TextureCubeMap. Implements GL texture objects and 17 // related functionality. 18 19 #ifndef LIBGL_TEXTURE_H_ 20 #define LIBGL_TEXTURE_H_ 21 22 #include "Renderbuffer.h" 23 #include "common/Object.hpp" 24 #include "utilities.h" 25 #include "common/debug.h" 26 27 #define _GDI32_ 28 #include <windows.h> 29 #include <GL/GL.h> 30 #include <GL/glext.h> 31 32 #include <vector> 33 34 namespace gl 35 { 36 class Surface; 37 class Config; 38 class Framebuffer; 39 40 enum 41 { 42 IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS, 43 IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1), 44 IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1), 45 IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION, 46 }; 47 48 class Texture : public NamedObject 49 { 50 public: 51 explicit Texture(GLuint name); 52 53 virtual ~Texture(); 54 55 sw::Resource *getResource() const; 56 57 virtual void addProxyRef(const Renderbuffer *proxy) = 0; 58 virtual void releaseProxy(const Renderbuffer *proxy) = 0; 59 60 virtual GLenum getTarget() const = 0; 61 62 bool setMinFilter(GLenum filter); 63 bool setMagFilter(GLenum filter); 64 bool setWrapS(GLenum wrap); 65 bool setWrapT(GLenum wrap); 66 bool setMaxAnisotropy(GLfloat textureMaxAnisotropy); 67 bool setMaxLevel(int level); 68 69 GLenum getMinFilter() const; 70 GLenum getMagFilter() const; 71 GLenum getWrapS() const; 72 GLenum getWrapT() const; 73 GLfloat getMaxAnisotropy() const; 74 75 virtual GLsizei getWidth(GLenum target, GLint level) const = 0; 76 virtual GLsizei getHeight(GLenum target, GLint level) const = 0; 77 virtual GLenum getFormat(GLenum target, GLint level) const = 0; 78 virtual GLenum getType(GLenum target, GLint level) const = 0; 79 virtual sw::Format getInternalFormat(GLenum target, GLint level) const = 0; 80 virtual int getLevelCount() const = 0; 81 82 virtual bool isSamplerComplete() const = 0; 83 virtual bool isCompressed(GLenum target, GLint level) const = 0; 84 virtual bool isDepth(GLenum target, GLint level) const = 0; 85 86 virtual Renderbuffer *getRenderbuffer(GLenum target) = 0; 87 virtual Image *getRenderTarget(GLenum target, unsigned int level) = 0; 88 89 virtual void generateMipmaps() = 0; 90 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0; 91 92 protected: 93 void setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image); 94 void subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image); 95 void setCompressedImage(GLsizei imageSize, const void *pixels, Image *image); 96 void subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *image); 97 98 bool copy(Image *source, const sw::Rect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, Image *dest); 99 100 bool isMipmapFiltered() const; 101 102 GLenum mMinFilter; 103 GLenum mMagFilter; 104 GLenum mWrapS; 105 GLenum mWrapT; 106 GLfloat mMaxAnisotropy; 107 GLint mMaxLevel; 108 109 sw::Resource *resource; 110 }; 111 112 class Texture2D : public Texture 113 { 114 public: 115 explicit Texture2D(GLuint name); 116 117 virtual ~Texture2D(); 118 119 void addProxyRef(const Renderbuffer *proxy); 120 void releaseProxy(const Renderbuffer *proxy); 121 122 virtual GLenum getTarget() const; 123 124 virtual GLsizei getWidth(GLenum target, GLint level) const; 125 virtual GLsizei getHeight(GLenum target, GLint level) const; 126 virtual GLenum getFormat(GLenum target, GLint level) const; 127 virtual GLenum getType(GLenum target, GLint level) const; 128 virtual sw::Format getInternalFormat(GLenum target, GLint level) const; 129 virtual int getLevelCount() const; 130 131 void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 132 void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 133 void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 134 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); 135 void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 136 void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 137 138 void setImage(Image *image); 139 140 virtual bool isSamplerComplete() const; 141 virtual bool isCompressed(GLenum target, GLint level) const; 142 virtual bool isDepth(GLenum target, GLint level) const; 143 144 virtual void generateMipmaps(); 145 146 virtual Renderbuffer *getRenderbuffer(GLenum target); 147 virtual Image *getRenderTarget(GLenum target, unsigned int level); 148 149 Image *getImage(unsigned int level); 150 151 protected: 152 bool isMipmapComplete() const; 153 154 Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 155 156 // A specific internal reference count is kept for colorbuffer proxy references, 157 // because, as the renderbuffer acting as proxy will maintain a binding pointer 158 // back to this texture, there would be a circular reference if we used a binding 159 // pointer here. This reference count will cause the pointer to be set to null if 160 // the count drops to zero, but will not cause deletion of the Renderbuffer. 161 Renderbuffer *mColorbufferProxy; 162 unsigned int mProxyRefs; 163 }; 164 165 class TextureCubeMap : public Texture 166 { 167 public: 168 explicit TextureCubeMap(GLuint name); 169 170 virtual ~TextureCubeMap(); 171 172 void addProxyRef(const Renderbuffer *proxy); 173 void releaseProxy(const Renderbuffer *proxy); 174 175 virtual GLenum getTarget() const; 176 177 virtual GLsizei getWidth(GLenum target, GLint level) const; 178 virtual GLsizei getHeight(GLenum target, GLint level) const; 179 virtual GLenum getFormat(GLenum target, GLint level) const; 180 virtual GLenum getType(GLenum target, GLint level) const; 181 virtual sw::Format getInternalFormat(GLenum target, GLint level) const; 182 virtual int getLevelCount() const; 183 184 void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 185 void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 186 187 void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 188 void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); 189 void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 190 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); 191 192 virtual bool isSamplerComplete() const; 193 virtual bool isCompressed(GLenum target, GLint level) const; 194 virtual bool isDepth(GLenum target, GLint level) const; 195 196 virtual void generateMipmaps(); 197 198 virtual Renderbuffer *getRenderbuffer(GLenum target); 199 virtual Image *getRenderTarget(GLenum target, unsigned int level); 200 201 Image *getImage(int face, unsigned int level); 202 203 private: 204 bool isCubeComplete() const; 205 bool isMipmapCubeComplete() const; 206 207 // face is one of the GL_TEXTURE_CUBE_MAP_* enumerants. Returns nullptr on failure. 208 Image *getImage(GLenum face, unsigned int level); 209 210 Image *image[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 211 212 // A specific internal reference count is kept for colorbuffer proxy references, 213 // because, as the renderbuffer acting as proxy will maintain a binding pointer 214 // back to this texture, there would be a circular reference if we used a binding 215 // pointer here. This reference count will cause the pointer to be set to null if 216 // the count drops to zero, but will not cause deletion of the Renderbuffer. 217 Renderbuffer *mFaceProxies[6]; 218 unsigned int mFaceProxyRefs[6]; 219 }; 220 221 } 222 223 #endif // LIBGL_TEXTURE_H_ 224