1 // 2 // Copyright 2014 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 // TextureD3D.h: Implementations of the Texture interfaces shared betweeen the D3D backends. 8 9 #ifndef LIBGLESV2_RENDERER_TEXTURED3D_H_ 10 #define LIBGLESV2_RENDERER_TEXTURED3D_H_ 11 12 #include "libGLESv2/renderer/TextureImpl.h" 13 #include "libGLESv2/angletypes.h" 14 #include "libGLESv2/constants.h" 15 16 namespace gl 17 { 18 class Framebuffer; 19 } 20 21 namespace rx 22 { 23 24 class Image; 25 class ImageD3D; 26 class Renderer; 27 class RenderTarget; 28 class TextureStorage; 29 30 class TextureD3D : public TextureImpl 31 { 32 public: 33 TextureD3D(Renderer *renderer); 34 virtual ~TextureD3D(); 35 36 static TextureD3D *makeTextureD3D(TextureImpl *texture); 37 38 virtual TextureStorage *getNativeTexture(); 39 40 virtual void setUsage(GLenum usage) { mUsage = usage; } 41 bool hasDirtyImages() const { return mDirtyImages; } 42 void resetDirty() { mDirtyImages = false; } 43 44 GLint getBaseLevelWidth() const; 45 GLint getBaseLevelHeight() const; 46 GLint getBaseLevelDepth() const; 47 GLenum getBaseLevelInternalFormat() const; 48 49 bool isImmutable() const { return mImmutable; } 50 51 virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0; 52 virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index) = 0; 53 54 protected: 55 void setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, Image *image); 56 bool subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, 57 GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels, const gl::ImageIndex &index); 58 void setCompressedImage(GLsizei imageSize, const void *pixels, Image *image); 59 bool subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, 60 GLenum format, GLsizei imageSize, const void *pixels, Image *image); 61 bool isFastUnpackable(const gl::PixelUnpackState &unpack, GLenum sizedInternalFormat); 62 bool fastUnpackPixels(const gl::PixelUnpackState &unpack, const void *pixels, const gl::Box &destArea, 63 GLenum sizedInternalFormat, GLenum type, RenderTarget *destRenderTarget); 64 65 GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const; 66 int mipLevels() const; 67 68 Renderer *mRenderer; 69 70 GLenum mUsage; 71 72 bool mDirtyImages; 73 74 bool mImmutable; 75 76 private: 77 DISALLOW_COPY_AND_ASSIGN(TextureD3D); 78 79 virtual void initializeStorage(bool renderTarget) = 0; 80 81 virtual void updateStorage() = 0; 82 virtual TextureStorage *getBaseLevelStorage() = 0; 83 virtual const ImageD3D *getBaseLevelImage() const = 0; 84 }; 85 86 class TextureD3D_2D : public TextureD3D 87 { 88 public: 89 TextureD3D_2D(Renderer *renderer); 90 virtual ~TextureD3D_2D(); 91 92 virtual Image *getImage(int level, int layer) const; 93 virtual Image *getImage(const gl::ImageIndex &index) const; 94 virtual GLsizei getLayerCount(int level) const; 95 96 GLsizei getWidth(GLint level) const; 97 GLsizei getHeight(GLint level) const; 98 GLenum getInternalFormat(GLint level) const; 99 GLenum getActualFormat(GLint level) const; 100 bool isDepth(GLint level) const; 101 102 virtual void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 103 virtual void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); 104 virtual void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 105 virtual void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); 106 virtual void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 107 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 108 virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); 109 110 virtual void bindTexImage(egl::Surface *surface); 111 virtual void releaseTexImage(); 112 113 virtual void generateMipmaps(); 114 115 virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); 116 virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); 117 118 private: 119 DISALLOW_COPY_AND_ASSIGN(TextureD3D_2D); 120 121 virtual void initializeStorage(bool renderTarget); 122 TextureStorage *createCompleteStorage(bool renderTarget) const; 123 void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); 124 125 virtual void updateStorage(); 126 bool ensureRenderTarget(); 127 virtual TextureStorage *getBaseLevelStorage(); 128 virtual const ImageD3D *getBaseLevelImage() const; 129 130 bool isValidLevel(int level) const; 131 bool isLevelComplete(int level) const; 132 133 void updateStorageLevel(int level); 134 135 void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height); 136 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); 137 138 TextureStorage *mTexStorage; 139 ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 140 }; 141 142 class TextureD3D_Cube : public TextureD3D 143 { 144 public: 145 TextureD3D_Cube(Renderer *renderer); 146 virtual ~TextureD3D_Cube(); 147 148 virtual Image *getImage(int level, int layer) const; 149 virtual Image *getImage(const gl::ImageIndex &index) const; 150 virtual GLsizei getLayerCount(int level) const; 151 152 virtual bool hasDirtyImages() const { return mDirtyImages; } 153 virtual void resetDirty() { mDirtyImages = false; } 154 virtual void setUsage(GLenum usage) { mUsage = usage; } 155 156 GLenum getInternalFormat(GLint level, GLint layer) const; 157 bool isDepth(GLint level, GLint layer) const; 158 159 virtual void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 160 virtual void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); 161 virtual void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 162 virtual void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); 163 virtual void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 164 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 165 virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); 166 167 virtual void bindTexImage(egl::Surface *surface); 168 virtual void releaseTexImage(); 169 170 virtual void generateMipmaps(); 171 172 virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); 173 virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); 174 175 private: 176 DISALLOW_COPY_AND_ASSIGN(TextureD3D_Cube); 177 178 virtual void initializeStorage(bool renderTarget); 179 TextureStorage *createCompleteStorage(bool renderTarget) const; 180 void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); 181 182 virtual void updateStorage(); 183 bool ensureRenderTarget(); 184 virtual TextureStorage *getBaseLevelStorage(); 185 virtual const ImageD3D *getBaseLevelImage() const; 186 187 bool isValidFaceLevel(int faceIndex, int level) const; 188 bool isFaceLevelComplete(int faceIndex, int level) const; 189 bool isCubeComplete() const; 190 void updateStorageFaceLevel(int faceIndex, int level); 191 192 void redefineImage(int faceIndex, GLint level, GLenum internalformat, GLsizei width, GLsizei height); 193 void commitRect(int faceIndex, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); 194 195 ImageD3D *mImageArray[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 196 197 TextureStorage *mTexStorage; 198 }; 199 200 class TextureD3D_3D : public TextureD3D 201 { 202 public: 203 TextureD3D_3D(Renderer *renderer); 204 virtual ~TextureD3D_3D(); 205 206 virtual Image *getImage(int level, int layer) const; 207 virtual Image *getImage(const gl::ImageIndex &index) const; 208 virtual GLsizei getLayerCount(int level) const; 209 210 GLsizei getWidth(GLint level) const; 211 GLsizei getHeight(GLint level) const; 212 GLsizei getDepth(GLint level) const; 213 GLenum getInternalFormat(GLint level) const; 214 bool isDepth(GLint level) const; 215 216 virtual void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 217 virtual void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); 218 virtual void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 219 virtual void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); 220 virtual void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 221 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 222 virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); 223 224 virtual void bindTexImage(egl::Surface *surface); 225 virtual void releaseTexImage(); 226 227 virtual void generateMipmaps(); 228 229 virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); 230 virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); 231 232 private: 233 DISALLOW_COPY_AND_ASSIGN(TextureD3D_3D); 234 235 virtual void initializeStorage(bool renderTarget); 236 TextureStorage *createCompleteStorage(bool renderTarget) const; 237 void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); 238 239 virtual void updateStorage(); 240 bool ensureRenderTarget(); 241 virtual TextureStorage *getBaseLevelStorage(); 242 virtual const ImageD3D *getBaseLevelImage() const; 243 244 bool isValidLevel(int level) const; 245 bool isLevelComplete(int level) const; 246 void updateStorageLevel(int level); 247 248 void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); 249 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); 250 251 ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 252 253 TextureStorage *mTexStorage; 254 }; 255 256 class TextureD3D_2DArray : public TextureD3D 257 { 258 public: 259 TextureD3D_2DArray(Renderer *renderer); 260 virtual ~TextureD3D_2DArray(); 261 262 virtual Image *getImage(int level, int layer) const; 263 virtual Image *getImage(const gl::ImageIndex &index) const; 264 virtual GLsizei getLayerCount(int level) const; 265 266 GLsizei getWidth(GLint level) const; 267 GLsizei getHeight(GLint level) const; 268 GLsizei getLayers(GLint level) const; 269 GLenum getInternalFormat(GLint level) const; 270 bool isDepth(GLint level) const; 271 272 virtual void setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 273 virtual void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); 274 virtual void subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels); 275 virtual void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); 276 virtual void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 277 virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source); 278 virtual void storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); 279 280 virtual void bindTexImage(egl::Surface *surface); 281 virtual void releaseTexImage(); 282 283 virtual void generateMipmaps(); 284 285 virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index); 286 virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &index); 287 288 private: 289 DISALLOW_COPY_AND_ASSIGN(TextureD3D_2DArray); 290 291 virtual void initializeStorage(bool renderTarget); 292 TextureStorage *createCompleteStorage(bool renderTarget) const; 293 void setCompleteTexStorage(TextureStorage *newCompleteTexStorage); 294 295 virtual void updateStorage(); 296 bool ensureRenderTarget(); 297 virtual TextureStorage *getBaseLevelStorage(); 298 virtual const ImageD3D *getBaseLevelImage() const; 299 300 bool isValidLevel(int level) const; 301 bool isLevelComplete(int level) const; 302 void updateStorageLevel(int level); 303 304 void deleteImages(); 305 void redefineImage(GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); 306 void commitRect(GLint level, GLint xoffset, GLint yoffset, GLint layerTarget, GLsizei width, GLsizei height); 307 308 // Storing images as an array of single depth textures since D3D11 treats each array level of a 309 // Texture2D object as a separate subresource. Each layer would have to be looped over 310 // to update all the texture layers since they cannot all be updated at once and it makes the most 311 // sense for the Image class to not have to worry about layer subresource as well as mip subresources. 312 GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 313 ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 314 315 TextureStorage *mTexStorage; 316 }; 317 318 } 319 320 #endif // LIBGLESV2_RENDERER_TEXTURED3D_H_ 321