1 // 2 // Copyright 2012 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 // TextureStorage9.h: Defines the abstract rx::TextureStorage9 class and its concrete derived 8 // classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the 9 // D3D9 texture. 10 11 #ifndef LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_ 12 #define LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_ 13 14 #include "common/debug.h" 15 #include "libANGLE/renderer/d3d/TextureStorage.h" 16 17 namespace rx 18 { 19 class EGLImageD3D; 20 class Renderer9; 21 class SwapChain9; 22 class RenderTargetD3D; 23 class RenderTarget9; 24 25 class TextureStorage9 : public TextureStorage 26 { 27 public: 28 ~TextureStorage9() override; 29 30 static DWORD GetTextureUsage(GLenum internalformat, bool renderTarget); 31 32 D3DPOOL getPool() const; 33 DWORD getUsage() const; 34 35 virtual angle::Result getSurfaceLevel(const gl::Context *context, 36 gl::TextureTarget target, 37 int level, 38 bool dirty, 39 IDirect3DSurface9 **outSurface) = 0; 40 virtual angle::Result getBaseTexture(const gl::Context *context, 41 IDirect3DBaseTexture9 **outTexture) = 0; 42 43 int getTopLevel() const override; 44 bool isRenderTarget() const override; isUnorderedAccess()45 bool isUnorderedAccess() const override { return false; } 46 bool isManaged() const override; 47 bool supportsNativeMipmapFunction() const override; 48 int getLevelCount() const override; 49 bool isMultiplanar(const gl::Context *context) override; 50 51 angle::Result setData(const gl::Context *context, 52 const gl::ImageIndex &index, 53 ImageD3D *image, 54 const gl::Box *destBox, 55 GLenum type, 56 const gl::PixelUnpackState &unpack, 57 const uint8_t *pixelData) override; 58 59 protected: 60 int mTopLevel; 61 size_t mMipLevels; 62 size_t mTextureWidth; 63 size_t mTextureHeight; 64 GLenum mInternalFormat; 65 D3DFORMAT mTextureFormat; 66 67 Renderer9 *mRenderer; 68 69 TextureStorage9(Renderer9 *renderer, DWORD usage, const std::string &label); 70 71 private: 72 const DWORD mD3DUsage; 73 const D3DPOOL mD3DPool; 74 }; 75 76 class TextureStorage9_2D : public TextureStorage9 77 { 78 public: 79 TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain, const std::string &label); 80 TextureStorage9_2D(Renderer9 *renderer, 81 GLenum internalformat, 82 bool renderTarget, 83 GLsizei width, 84 GLsizei height, 85 int levels, 86 const std::string &label); 87 ~TextureStorage9_2D() override; 88 89 angle::Result getSurfaceLevel(const gl::Context *context, 90 gl::TextureTarget target, 91 int level, 92 bool dirty, 93 IDirect3DSurface9 **outSurface) override; 94 angle::Result findRenderTarget(const gl::Context *context, 95 const gl::ImageIndex &index, 96 GLsizei samples, 97 RenderTargetD3D **outRT) const override; 98 angle::Result getRenderTarget(const gl::Context *context, 99 const gl::ImageIndex &index, 100 GLsizei samples, 101 RenderTargetD3D **outRT) override; 102 angle::Result getBaseTexture(const gl::Context *context, 103 IDirect3DBaseTexture9 **outTexture) override; 104 angle::Result generateMipmap(const gl::Context *context, 105 const gl::ImageIndex &sourceIndex, 106 const gl::ImageIndex &destIndex) override; 107 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 108 109 private: 110 IDirect3DTexture9 *mTexture; 111 std::vector<RenderTarget9 *> mRenderTargets; 112 }; 113 114 class TextureStorage9_EGLImage final : public TextureStorage9 115 { 116 public: 117 TextureStorage9_EGLImage(Renderer9 *renderer, 118 EGLImageD3D *image, 119 RenderTarget9 *renderTarget9, 120 const std::string &label); 121 ~TextureStorage9_EGLImage() override; 122 123 angle::Result getSurfaceLevel(const gl::Context *context, 124 gl::TextureTarget target, 125 int level, 126 bool dirty, 127 IDirect3DSurface9 **outSurface) override; 128 angle::Result findRenderTarget(const gl::Context *context, 129 const gl::ImageIndex &index, 130 GLsizei samples, 131 RenderTargetD3D **outRT) const override; 132 angle::Result getRenderTarget(const gl::Context *context, 133 const gl::ImageIndex &index, 134 GLsizei samples, 135 RenderTargetD3D **outRT) override; 136 angle::Result getBaseTexture(const gl::Context *context, 137 IDirect3DBaseTexture9 **outTexture) override; 138 angle::Result generateMipmap(const gl::Context *context, 139 const gl::ImageIndex &sourceIndex, 140 const gl::ImageIndex &destIndex) override; 141 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 142 143 private: 144 EGLImageD3D *mImage; 145 }; 146 147 class TextureStorage9_Cube : public TextureStorage9 148 { 149 public: 150 TextureStorage9_Cube(Renderer9 *renderer, 151 GLenum internalformat, 152 bool renderTarget, 153 int size, 154 int levels, 155 bool hintLevelZeroOnly, 156 const std::string &label); 157 158 ~TextureStorage9_Cube() override; 159 160 angle::Result getSurfaceLevel(const gl::Context *context, 161 gl::TextureTarget target, 162 int level, 163 bool dirty, 164 IDirect3DSurface9 **outSurface) override; 165 angle::Result findRenderTarget(const gl::Context *context, 166 const gl::ImageIndex &index, 167 GLsizei samples, 168 RenderTargetD3D **outRT) const override; 169 angle::Result getRenderTarget(const gl::Context *context, 170 const gl::ImageIndex &index, 171 GLsizei samples, 172 RenderTargetD3D **outRT) override; 173 angle::Result getBaseTexture(const gl::Context *context, 174 IDirect3DBaseTexture9 **outTexture) override; 175 angle::Result generateMipmap(const gl::Context *context, 176 const gl::ImageIndex &sourceIndex, 177 const gl::ImageIndex &destIndex) override; 178 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 179 180 private: 181 IDirect3DCubeTexture9 *mTexture; 182 RenderTarget9 *mRenderTarget[gl::kCubeFaceCount]; 183 }; 184 185 } // namespace rx 186 187 #endif // LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_ 188