1 // 2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // Texture.h: Defines the abstract gl::Texture class and its concrete derived 8 // classes Texture2D and TextureCubeMap. Implements GL texture objects and 9 // related functionality. [OpenGL ES 2.0.24] section 3.7 page 63. 10 11 #ifndef LIBGLESV2_TEXTURE_H_ 12 #define LIBGLESV2_TEXTURE_H_ 13 14 #include <vector> 15 16 #define GL_APICALL 17 #include <GLES2/gl2.h> 18 #include <d3d9.h> 19 20 #include "libGLESv2/Renderbuffer.h" 21 #include "libGLESv2/RefCountObject.h" 22 #include "libGLESv2/utilities.h" 23 #include "common/debug.h" 24 25 namespace gl 26 { 27 class Blit; 28 29 enum 30 { 31 // These are the maximums the implementation can support 32 // The actual GL caps are limited by the device caps 33 // and should be queried from the Context 34 IMPLEMENTATION_MAX_TEXTURE_SIZE = 16384, 35 IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 16384, 36 37 IMPLEMENTATION_MAX_TEXTURE_LEVELS = 15 // 1+log2 of MAX_TEXTURE_SIZE 38 }; 39 40 class Texture : public RefCountObject 41 { 42 public: 43 explicit Texture(GLuint id); 44 45 virtual ~Texture(); 46 47 virtual GLenum getTarget() const = 0; 48 49 bool setMinFilter(GLenum filter); 50 bool setMagFilter(GLenum filter); 51 bool setWrapS(GLenum wrap); 52 bool setWrapT(GLenum wrap); 53 54 GLenum getMinFilter() const; 55 GLenum getMagFilter() const; 56 GLenum getWrapS() const; 57 GLenum getWrapT() const; 58 59 GLuint getWidth() const; 60 GLuint getHeight() const; 61 62 virtual GLenum getFormat() const = 0; 63 virtual bool isComplete() const = 0; 64 virtual bool isCompressed() const = 0; 65 bool isFloatingPoint() const; 66 bool isRenderableFormat() const; 67 68 D3DFORMAT getD3DFormat() const; 69 IDirect3DBaseTexture9 *getTexture(); 70 virtual Renderbuffer *getColorbuffer(GLenum target) = 0; 71 72 virtual void generateMipmaps() = 0; 73 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source) = 0; 74 75 bool isDirty() const; 76 77 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. 78 79 protected: 80 class TextureColorbufferProxy; 81 friend class TextureColorbufferProxy; 82 class TextureColorbufferProxy : public Colorbuffer 83 { 84 public: 85 TextureColorbufferProxy(Texture *texture, GLenum target); 86 // target is a 2D-like texture target (GL_TEXTURE_2D or one of the cube face targets) 87 88 virtual void addRef() const; 89 virtual void release() const; 90 91 virtual IDirect3DSurface9 *getRenderTarget(); 92 93 virtual int getWidth() const; 94 virtual int getHeight() const; 95 virtual GLenum getFormat() const; 96 virtual bool isFloatingPoint() const; 97 98 private: 99 Texture *mTexture; 100 GLenum mTarget; 101 }; 102 103 // Helper structure representing a single image layer 104 struct Image 105 { 106 Image(); 107 ~Image(); 108 109 GLsizei width; 110 GLsizei height; 111 GLenum format; 112 113 bool dirty; 114 115 IDirect3DSurface9 *surface; 116 }; 117 118 static D3DFORMAT selectFormat(GLenum format, GLenum type); 119 120 void setImage(GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img); 121 bool subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img); 122 void setCompressedImage(GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *img); 123 bool subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *img); 124 void copyNonRenderable(Image *image, GLenum internalFormat, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, IDirect3DSurface9 *renderTarget); 125 126 void needRenderTarget(); 127 128 GLint creationLevels(GLsizei width, GLsizei height, GLint maxlevel) const; 129 GLint creationLevels(GLsizei size, GLint maxlevel) const; 130 131 // The pointer returned is weak and it is assumed the derived class will keep a strong pointer until the next createTexture() call. 132 virtual IDirect3DBaseTexture9 *createTexture() = 0; 133 virtual void updateTexture() = 0; 134 virtual IDirect3DBaseTexture9 *convertToRenderTarget() = 0; 135 virtual IDirect3DSurface9 *getRenderTarget(GLenum target) = 0; 136 137 virtual bool dirtyImageData() const = 0; 138 139 void dropTexture(); 140 void pushTexture(IDirect3DBaseTexture9 *newTexture, bool renderable); 141 void createSurface(GLsizei width, GLsizei height, GLenum format, GLenum type, Image *img); 142 143 Blit *getBlitter(); 144 145 int levelCount() const; 146 147 bool isRenderable() const; 148 149 unsigned int mWidth; 150 unsigned int mHeight; 151 GLenum mMinFilter; 152 GLenum mMagFilter; 153 GLenum mWrapS; 154 GLenum mWrapT; 155 GLenum mType; 156 157 bool mDirtyMetaData; 158 159 private: 160 DISALLOW_COPY_AND_ASSIGN(Texture); 161 162 void loadImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, 163 GLint unpackAlignment, const void *input, std::size_t outputPitch, void *output, D3DSURFACE_DESC *description) const; 164 165 void loadAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 166 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 167 void loadAlphaFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 168 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 169 void loadAlphaHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 170 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 171 void loadLuminanceImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 172 size_t inputPitch, const void *input, size_t outputPitch, void *output, bool native) const; 173 void loadLuminanceFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 174 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 175 void loadLuminanceHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 176 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 177 void loadLuminanceAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 178 size_t inputPitch, const void *input, size_t outputPitch, void *output, bool native) const; 179 void loadLuminanceAlphaFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 180 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 181 void loadLuminanceAlphaHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 182 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 183 void loadRGBUByteImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 184 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 185 void loadRGB565ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 186 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 187 void loadRGBFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 188 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 189 void loadRGBHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 190 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 191 void loadRGBAUByteImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 192 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 193 void loadRGBA4444ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 194 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 195 void loadRGBA5551ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 196 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 197 void loadRGBAFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 198 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 199 void loadRGBAHalfFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 200 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 201 void loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 202 size_t inputPitch, const void *input, size_t outputPitch, void *output) const; 203 204 IDirect3DBaseTexture9 *mBaseTexture; // This is a weak pointer. The derived class is assumed to own a strong pointer. 205 206 bool mDirty; 207 bool mIsRenderable; 208 }; 209 210 class Texture2D : public Texture 211 { 212 public: 213 explicit Texture2D(GLuint id); 214 215 ~Texture2D(); 216 217 GLenum getTarget() const; 218 GLenum getFormat() const; 219 220 void setImage(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 221 void setCompressedImage(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 222 void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 223 void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); 224 void copyImage(GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source); 225 void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source); 226 227 bool isComplete() const; 228 bool isCompressed() const; 229 230 virtual void generateMipmaps(); 231 232 virtual Renderbuffer *getColorbuffer(GLenum target); 233 234 private: 235 DISALLOW_COPY_AND_ASSIGN(Texture2D); 236 237 virtual IDirect3DBaseTexture9 *createTexture(); 238 virtual void updateTexture(); 239 virtual IDirect3DBaseTexture9 *convertToRenderTarget(); 240 virtual IDirect3DSurface9 *getRenderTarget(GLenum target); 241 242 virtual bool dirtyImageData() const; 243 244 bool redefineTexture(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum type); 245 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); 246 247 Image mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 248 249 IDirect3DTexture9 *mTexture; 250 251 BindingPointer<Renderbuffer> mColorbufferProxy; 252 }; 253 254 class TextureCubeMap : public Texture 255 { 256 public: 257 explicit TextureCubeMap(GLuint id); 258 259 ~TextureCubeMap(); 260 261 GLenum getTarget() const; 262 GLenum getFormat() const; 263 264 void setImagePosX(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 265 void setImageNegX(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 266 void setImagePosY(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 267 void setImageNegY(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 268 void setImagePosZ(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 269 void setImageNegZ(GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 270 271 void setCompressedImage(GLenum face, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 272 273 void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 274 void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); 275 void copyImage(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source); 276 void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderbufferStorage *source); 277 278 bool isComplete() const; 279 bool isCompressed() const; 280 281 virtual void generateMipmaps(); 282 283 virtual Renderbuffer *getColorbuffer(GLenum target); 284 285 private: 286 DISALLOW_COPY_AND_ASSIGN(TextureCubeMap); 287 288 virtual IDirect3DBaseTexture9 *createTexture(); 289 virtual void updateTexture(); 290 virtual IDirect3DBaseTexture9 *convertToRenderTarget(); 291 virtual IDirect3DSurface9 *getRenderTarget(GLenum target); 292 293 virtual bool dirtyImageData() const; 294 295 // faceIdentifier is 0-5 or one of the GL_TEXTURE_CUBE_MAP_* enumerants. 296 // Returns NULL if the call underlying Direct3D call fails. 297 IDirect3DSurface9 *getCubeMapSurface(unsigned int faceIdentifier, unsigned int level); 298 299 static unsigned int faceIndex(GLenum face); 300 301 bool isCubeComplete() const; 302 303 void setImage(int face, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 304 void commitRect(GLenum faceTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); 305 bool redefineTexture(GLint level, GLenum internalFormat, GLsizei width); 306 307 Image mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 308 309 IDirect3DCubeTexture9 *mTexture; 310 311 BindingPointer<Renderbuffer> mFaceProxies[6]; 312 }; 313 } 314 315 #endif // LIBGLESV2_TEXTURE_H_ 316