Home | History | Annotate | Download | only in d3d
      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