1 // 2 // Copyright (c) 2012-2013 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 // TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived 8 // classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture. 9 10 #ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ 11 #define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ 12 13 #include "libANGLE/Error.h" 14 #include "libANGLE/Texture.h" 15 #include "libANGLE/renderer/d3d/TextureStorage.h" 16 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" 17 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" 18 19 #include <array> 20 #include <map> 21 22 namespace gl 23 { 24 struct ImageIndex; 25 } 26 27 namespace rx 28 { 29 class EGLImageD3D; 30 class RenderTargetD3D; 31 class RenderTarget11; 32 class Renderer11; 33 class SwapChain11; 34 class Image11; 35 struct Renderer11DeviceCaps; 36 37 template <typename T> 38 using TexLevelArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>; 39 40 template <typename T> 41 using CubeFaceArray = std::array<T, gl::CUBE_FACE_COUNT>; 42 43 class TextureStorage11 : public TextureStorage 44 { 45 public: 46 ~TextureStorage11() override; 47 48 static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget); 49 static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels); 50 51 UINT getBindFlags() const; 52 UINT getMiscFlags() const; 53 const d3d11::Format &getFormatSet() const; 54 gl::Error getSRVLevels(const gl::Context *context, 55 GLint baseLevel, 56 GLint maxLevel, 57 const d3d11::SharedSRV **outSRV); 58 gl::Error generateSwizzles(const gl::Context *context, const gl::SwizzleState &swizzleTarget); 59 void markLevelDirty(int mipLevel); 60 void markDirty(); 61 62 gl::Error updateSubresourceLevel(const gl::Context *context, 63 const TextureHelper11 &texture, 64 unsigned int sourceSubresource, 65 const gl::ImageIndex &index, 66 const gl::Box ©Area); 67 68 gl::Error copySubresourceLevel(const gl::Context *context, 69 const TextureHelper11 &dstTexture, 70 unsigned int dstSubresource, 71 const gl::ImageIndex &index, 72 const gl::Box ®ion); 73 74 // TextureStorage virtual functions 75 int getTopLevel() const override; 76 bool isRenderTarget() const override; 77 bool isManaged() const override; 78 bool supportsNativeMipmapFunction() const override; 79 int getLevelCount() const override; 80 gl::Error generateMipmap(const gl::Context *context, 81 const gl::ImageIndex &sourceIndex, 82 const gl::ImageIndex &destIndex) override; 83 gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 84 gl::Error setData(const gl::Context *context, 85 const gl::ImageIndex &index, 86 ImageD3D *image, 87 const gl::Box *destBox, 88 GLenum type, 89 const gl::PixelUnpackState &unpack, 90 const uint8_t *pixelData) override; 91 92 virtual gl::Error getSRV(const gl::Context *context, 93 const gl::TextureState &textureState, 94 const d3d11::SharedSRV **outSRV); 95 virtual UINT getSubresourceIndex(const gl::ImageIndex &index) const; 96 virtual gl::Error getResource(const gl::Context *context, 97 const TextureHelper11 **outResource) = 0; 98 virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0; 99 virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage) = 0; 100 virtual void verifyAssociatedImageValid(const gl::ImageIndex &index, 101 Image11 *expectedImage) = 0; 102 virtual gl::Error releaseAssociatedImage(const gl::Context *context, 103 const gl::ImageIndex &index, 104 Image11 *incomingImage) = 0; 105 106 protected: 107 TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags, GLenum internalFormat); 108 int getLevelWidth(int mipLevel) const; 109 int getLevelHeight(int mipLevel) const; 110 int getLevelDepth(int mipLevel) const; 111 112 // Some classes (e.g. TextureStorage11_2D) will override getMippedResource. 113 virtual gl::Error getMippedResource(const gl::Context *context, 114 const TextureHelper11 **outResource); 115 116 virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0; 117 virtual gl::Error getSwizzleRenderTarget(int mipLevel, 118 const d3d11::RenderTargetView **outRTV) = 0; 119 gl::Error getSRVLevel(const gl::Context *context, 120 int mipLevel, 121 bool blitSRV, 122 const d3d11::SharedSRV **outSRV); 123 124 // Get a version of a depth texture with only depth information, not stencil. 125 enum DropStencil 126 { 127 CREATED, 128 ALREADY_EXISTS 129 }; 130 virtual gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context); 131 gl::Error initDropStencilTexture(const gl::Context *context, const gl::ImageIndexIterator &it); 132 133 // The baseLevel parameter should *not* have mTopLevel applied. 134 virtual gl::Error createSRV(const gl::Context *context, 135 int baseLevel, 136 int mipLevels, 137 DXGI_FORMAT format, 138 const TextureHelper11 &texture, 139 d3d11::SharedSRV *outSRV) = 0; 140 141 void verifySwizzleExists(const gl::SwizzleState &swizzleState); 142 143 // Clear all cached non-swizzle SRVs and invalidate the swizzle cache. 144 void clearSRVCache(); 145 146 Renderer11 *mRenderer; 147 int mTopLevel; 148 unsigned int mMipLevels; 149 150 const d3d11::Format &mFormatInfo; 151 unsigned int mTextureWidth; 152 unsigned int mTextureHeight; 153 unsigned int mTextureDepth; 154 155 TexLevelArray<gl::SwizzleState> mSwizzleCache; 156 TextureHelper11 mDropStencilTexture; 157 158 private: 159 const UINT mBindFlags; 160 const UINT mMiscFlags; 161 162 struct SRVKey 163 { 164 SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil); 165 166 bool operator<(const SRVKey &rhs) const; 167 168 int baseLevel = 0; // Without mTopLevel applied. 169 int mipLevels = 0; 170 bool swizzle = false; 171 bool dropStencil = false; 172 }; 173 typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache; 174 175 gl::Error getCachedOrCreateSRV(const gl::Context *context, 176 const SRVKey &key, 177 const d3d11::SharedSRV **outSRV); 178 179 SRVCache mSrvCache; 180 TexLevelArray<d3d11::SharedSRV> mLevelSRVs; 181 TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs; 182 }; 183 184 class TextureStorage11_2D : public TextureStorage11 185 { 186 public: 187 TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain); 188 TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly = false); 189 ~TextureStorage11_2D() override; 190 191 gl::Error onDestroy(const gl::Context *context) override; 192 193 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 194 gl::Error getMippedResource(const gl::Context *context, 195 const TextureHelper11 **outResource) override; 196 gl::Error getRenderTarget(const gl::Context *context, 197 const gl::ImageIndex &index, 198 RenderTargetD3D **outRT) override; 199 200 gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 201 202 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 203 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 204 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 205 gl::Error releaseAssociatedImage(const gl::Context *context, 206 const gl::ImageIndex &index, 207 Image11 *incomingImage) override; 208 209 gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, 210 bool useLevelZeroTexture) override; 211 212 protected: 213 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 214 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 215 216 gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; 217 218 gl::Error ensureTextureExists(int mipLevels); 219 220 private: 221 gl::Error createSRV(const gl::Context *context, 222 int baseLevel, 223 int mipLevels, 224 DXGI_FORMAT format, 225 const TextureHelper11 &texture, 226 d3d11::SharedSRV *outSRV) override; 227 228 TextureHelper11 mTexture; 229 TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget; 230 bool mHasKeyedMutex; 231 232 // These are members related to the zero max-LOD workaround. 233 // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero). 234 // These members are used to work around this limitation. 235 // Usually only mTexture XOR mLevelZeroTexture will exist. 236 // For example, if an app creates a texture with only one level, then 9_3 will only create mLevelZeroTexture. 237 // However, in some scenarios, both textures have to be created. This incurs additional memory overhead. 238 // One example of this is an application that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture. 239 // A more likely example is an app that creates an empty texture, renders to it, and then calls glGenerateMipmap 240 // TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been created to save memory. 241 TextureHelper11 mLevelZeroTexture; 242 std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget; 243 bool mUseLevelZeroTexture; 244 245 // Swizzle-related variables 246 TextureHelper11 mSwizzleTexture; 247 TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 248 249 TexLevelArray<Image11 *> mAssociatedImages; 250 }; 251 252 class TextureStorage11_External : public TextureStorage11 253 { 254 public: 255 TextureStorage11_External(Renderer11 *renderer, 256 egl::Stream *stream, 257 const egl::Stream::GLTextureDescription &glDesc); 258 ~TextureStorage11_External() override; 259 260 gl::Error onDestroy(const gl::Context *context) override; 261 262 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 263 gl::Error getMippedResource(const gl::Context *context, 264 const TextureHelper11 **outResource) override; 265 gl::Error getRenderTarget(const gl::Context *context, 266 const gl::ImageIndex &index, 267 RenderTargetD3D **outRT) override; 268 269 gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 270 271 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 272 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 273 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 274 gl::Error releaseAssociatedImage(const gl::Context *context, 275 const gl::ImageIndex &index, 276 Image11 *incomingImage) override; 277 278 protected: 279 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 280 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 281 282 private: 283 gl::Error createSRV(const gl::Context *context, 284 int baseLevel, 285 int mipLevels, 286 DXGI_FORMAT format, 287 const TextureHelper11 &texture, 288 d3d11::SharedSRV *outSRV) override; 289 290 TextureHelper11 mTexture; 291 int mSubresourceIndex; 292 bool mHasKeyedMutex; 293 294 Image11 *mAssociatedImage; 295 }; 296 297 class TextureStorage11_EGLImage final : public TextureStorage11 298 { 299 public: 300 TextureStorage11_EGLImage(Renderer11 *renderer, 301 EGLImageD3D *eglImage, 302 RenderTarget11 *renderTarget11); 303 ~TextureStorage11_EGLImage() override; 304 305 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 306 gl::Error getSRV(const gl::Context *context, 307 const gl::TextureState &textureState, 308 const d3d11::SharedSRV **outSRV) override; 309 gl::Error getMippedResource(const gl::Context *context, 310 const TextureHelper11 **outResource) override; 311 gl::Error getRenderTarget(const gl::Context *context, 312 const gl::ImageIndex &index, 313 RenderTargetD3D **outRT) override; 314 315 gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 316 317 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 318 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 319 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 320 gl::Error releaseAssociatedImage(const gl::Context *context, 321 const gl::ImageIndex &index, 322 Image11 *incomingImage) override; 323 324 gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, 325 bool useLevelZeroTexture) override; 326 327 protected: 328 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 329 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 330 331 private: 332 // Check if the EGL image's render target has been updated due to orphaning and delete 333 // any SRVs and other resources based on the image's old render target. 334 gl::Error checkForUpdatedRenderTarget(const gl::Context *context); 335 336 gl::Error createSRV(const gl::Context *context, 337 int baseLevel, 338 int mipLevels, 339 DXGI_FORMAT format, 340 const TextureHelper11 &texture, 341 d3d11::SharedSRV *outSRV) override; 342 343 gl::Error getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const; 344 345 EGLImageD3D *mImage; 346 uintptr_t mCurrentRenderTarget; 347 348 // Swizzle-related variables 349 TextureHelper11 mSwizzleTexture; 350 std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets; 351 }; 352 353 class TextureStorage11_Cube : public TextureStorage11 354 { 355 public: 356 TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly); 357 ~TextureStorage11_Cube() override; 358 359 gl::Error onDestroy(const gl::Context *context) override; 360 361 UINT getSubresourceIndex(const gl::ImageIndex &index) const override; 362 363 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 364 gl::Error getMippedResource(const gl::Context *context, 365 const TextureHelper11 **outResource) override; 366 gl::Error getRenderTarget(const gl::Context *context, 367 const gl::ImageIndex &index, 368 RenderTargetD3D **outRT) override; 369 370 gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 371 372 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 373 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 374 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 375 gl::Error releaseAssociatedImage(const gl::Context *context, 376 const gl::ImageIndex &index, 377 Image11 *incomingImage) override; 378 379 gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context, 380 bool useLevelZeroTexture) override; 381 382 protected: 383 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 384 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 385 386 gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; 387 388 gl::Error ensureTextureExists(int mipLevels); 389 390 private: 391 gl::Error createSRV(const gl::Context *context, 392 int baseLevel, 393 int mipLevels, 394 DXGI_FORMAT format, 395 const TextureHelper11 &texture, 396 d3d11::SharedSRV *outSRV) override; 397 gl::Error createRenderTargetSRV(const TextureHelper11 &texture, 398 const gl::ImageIndex &index, 399 DXGI_FORMAT resourceFormat, 400 d3d11::SharedSRV *srv) const; 401 402 TextureHelper11 mTexture; 403 CubeFaceArray<TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget; 404 405 // Level-zero workaround members. See TextureStorage11_2D's workaround members for a description. 406 TextureHelper11 mLevelZeroTexture; 407 CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget; 408 bool mUseLevelZeroTexture; 409 410 TextureHelper11 mSwizzleTexture; 411 TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 412 413 CubeFaceArray<TexLevelArray<Image11 *>> mAssociatedImages; 414 }; 415 416 class TextureStorage11_3D : public TextureStorage11 417 { 418 public: 419 TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, 420 GLsizei width, GLsizei height, GLsizei depth, int levels); 421 ~TextureStorage11_3D() override; 422 423 gl::Error onDestroy(const gl::Context *context) override; 424 425 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 426 427 // Handles both layer and non-layer RTs 428 gl::Error getRenderTarget(const gl::Context *context, 429 const gl::ImageIndex &index, 430 RenderTargetD3D **outRT) override; 431 432 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 433 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 434 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 435 gl::Error releaseAssociatedImage(const gl::Context *context, 436 const gl::ImageIndex &index, 437 Image11 *incomingImage) override; 438 439 protected: 440 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 441 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 442 443 private: 444 gl::Error createSRV(const gl::Context *context, 445 int baseLevel, 446 int mipLevels, 447 DXGI_FORMAT format, 448 const TextureHelper11 &texture, 449 d3d11::SharedSRV *outSRV) override; 450 451 typedef std::pair<int, int> LevelLayerKey; 452 std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets; 453 454 TexLevelArray<std::unique_ptr<RenderTarget11>> mLevelRenderTargets; 455 456 TextureHelper11 mTexture; 457 TextureHelper11 mSwizzleTexture; 458 TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 459 460 TexLevelArray<Image11 *> mAssociatedImages; 461 }; 462 463 class TextureStorage11_2DArray : public TextureStorage11 464 { 465 public: 466 TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget, 467 GLsizei width, GLsizei height, GLsizei depth, int levels); 468 ~TextureStorage11_2DArray() override; 469 470 gl::Error onDestroy(const gl::Context *context) override; 471 472 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 473 gl::Error getRenderTarget(const gl::Context *context, 474 const gl::ImageIndex &index, 475 RenderTargetD3D **outRT) override; 476 477 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 478 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 479 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 480 gl::Error releaseAssociatedImage(const gl::Context *context, 481 const gl::ImageIndex &index, 482 Image11 *incomingImage) override; 483 484 protected: 485 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 486 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 487 488 gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; 489 490 private: 491 struct LevelLayerRangeKey 492 { LevelLayerRangeKeyLevelLayerRangeKey493 LevelLayerRangeKey(int mipLevelIn, int layerIn, int numLayersIn) 494 : mipLevel(mipLevelIn), layer(layerIn), numLayers(numLayersIn) 495 { 496 } 497 bool operator<(const LevelLayerRangeKey &other) const 498 { 499 if (mipLevel != other.mipLevel) 500 { 501 return mipLevel < other.mipLevel; 502 } 503 if (layer != other.layer) 504 { 505 return layer < other.layer; 506 } 507 return numLayers < other.numLayers; 508 } 509 int mipLevel; 510 int layer; 511 int numLayers; 512 }; 513 514 private: 515 gl::Error createSRV(const gl::Context *context, 516 int baseLevel, 517 int mipLevels, 518 DXGI_FORMAT format, 519 const TextureHelper11 &texture, 520 d3d11::SharedSRV *outSRV) override; 521 gl::Error createRenderTargetSRV(const TextureHelper11 &texture, 522 const gl::ImageIndex &index, 523 DXGI_FORMAT resourceFormat, 524 d3d11::SharedSRV *srv) const; 525 526 std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets; 527 528 TextureHelper11 mTexture; 529 530 TextureHelper11 mSwizzleTexture; 531 TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 532 533 typedef std::map<LevelLayerRangeKey, Image11 *> ImageMap; 534 ImageMap mAssociatedImages; 535 }; 536 537 class TextureStorage11_2DMultisample : public TextureStorage11 538 { 539 public: 540 TextureStorage11_2DMultisample(Renderer11 *renderer, 541 GLenum internalformat, 542 GLsizei width, 543 GLsizei height, 544 int levels, 545 int samples, 546 bool fixedSampleLocations); 547 ~TextureStorage11_2DMultisample() override; 548 549 gl::Error onDestroy(const gl::Context *context) override; 550 551 gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override; 552 gl::Error getRenderTarget(const gl::Context *context, 553 const gl::ImageIndex &index, 554 RenderTargetD3D **outRT) override; 555 556 gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 557 558 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 559 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 560 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 561 gl::Error releaseAssociatedImage(const gl::Context *context, 562 const gl::ImageIndex &index, 563 Image11 *incomingImage) override; 564 565 protected: 566 gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override; 567 gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override; 568 569 gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override; 570 571 gl::Error ensureTextureExists(int mipLevels); 572 573 private: 574 gl::Error createSRV(const gl::Context *context, 575 int baseLevel, 576 int mipLevels, 577 DXGI_FORMAT format, 578 const TextureHelper11 &texture, 579 d3d11::SharedSRV *outSRV) override; 580 581 TextureHelper11 mTexture; 582 std::unique_ptr<RenderTarget11> mRenderTarget; 583 584 unsigned int mSamples; 585 GLboolean mFixedSampleLocations; 586 }; 587 } 588 589 #endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ 590