TextureStorage11.h (47868B)
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 // 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 9 // texture. 10 11 #ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ 12 #define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_ 13 14 #include "libANGLE/Error.h" 15 #include "libANGLE/Texture.h" 16 #include "libANGLE/renderer/d3d/TextureStorage.h" 17 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" 18 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" 19 20 #include <array> 21 #include <map> 22 23 namespace gl 24 { 25 class ImageIndex; 26 } // namespace gl 27 28 namespace rx 29 { 30 class EGLImageD3D; 31 class RenderTargetD3D; 32 class RenderTarget11; 33 class Renderer11; 34 class SwapChain11; 35 class Image11; 36 struct Renderer11DeviceCaps; 37 class TextureStorage11_2DMultisample; 38 39 template <typename T> 40 using CubeFaceArray = std::array<T, gl::kCubeFaceCount>; 41 42 struct MultisampledRenderToTextureInfo 43 { 44 MultisampledRenderToTextureInfo(const GLsizei samples, 45 const gl::ImageIndex &indexSS, 46 const gl::ImageIndex &indexMS); 47 ~MultisampledRenderToTextureInfo(); 48 49 // How many samples the multisampled texture contains 50 GLsizei samples; 51 // This is the image index for the single sampled texture 52 // This will hold the relevant level information 53 gl::ImageIndex indexSS; 54 // This is the image index for the multisampled texture 55 // For multisampled indexes, there is no level Index since they should 56 // account for the entire level. 57 gl::ImageIndex indexMS; 58 // True when multisampled texture has been written to and needs to be 59 // resolved to the single sampled texture 60 bool msTextureNeedsResolve; 61 std::unique_ptr<TextureStorage11_2DMultisample> msTex; 62 }; 63 64 class TextureStorage11 : public TextureStorage 65 { 66 public: 67 ~TextureStorage11() override; 68 69 static DWORD GetTextureBindFlags(GLenum internalFormat, 70 const Renderer11DeviceCaps &renderer11DeviceCaps, 71 BindFlags flags); 72 static DWORD GetTextureMiscFlags(GLenum internalFormat, 73 const Renderer11DeviceCaps &renderer11DeviceCaps, 74 BindFlags flags, 75 int levels); 76 77 UINT getBindFlags() const; 78 UINT getMiscFlags() const; 79 const d3d11::Format &getFormatSet() const; 80 angle::Result getSRVLevels(const gl::Context *context, 81 GLint baseLevel, 82 GLint maxLevel, 83 const d3d11::SharedSRV **outSRV); 84 angle::Result generateSwizzles(const gl::Context *context, 85 const gl::TextureState &textureState); 86 void markLevelDirty(int mipLevel); 87 void markDirty(); 88 89 angle::Result updateSubresourceLevel(const gl::Context *context, 90 const TextureHelper11 &texture, 91 unsigned int sourceSubresource, 92 const gl::ImageIndex &index, 93 const gl::Box ©Area); 94 95 angle::Result copySubresourceLevel(const gl::Context *context, 96 const TextureHelper11 &dstTexture, 97 unsigned int dstSubresource, 98 const gl::ImageIndex &index, 99 const gl::Box ®ion); 100 101 // TextureStorage virtual functions 102 int getTopLevel() const override; 103 bool isRenderTarget() const override; 104 bool isManaged() const override; 105 bool supportsNativeMipmapFunction() const override; 106 int getLevelCount() const override; 107 bool isUnorderedAccess() const override { return mBindFlags & D3D11_BIND_UNORDERED_ACCESS; } 108 angle::Result generateMipmap(const gl::Context *context, 109 const gl::ImageIndex &sourceIndex, 110 const gl::ImageIndex &destIndex) override; 111 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 112 angle::Result setData(const gl::Context *context, 113 const gl::ImageIndex &index, 114 ImageD3D *image, 115 const gl::Box *destBox, 116 GLenum type, 117 const gl::PixelUnpackState &unpack, 118 const uint8_t *pixelData) override; 119 void invalidateTextures() override; 120 121 virtual angle::Result getSRVForSampler(const gl::Context *context, 122 const gl::TextureState &textureState, 123 const gl::SamplerState &sampler, 124 const d3d11::SharedSRV **outSRV); 125 angle::Result getSRVForImage(const gl::Context *context, 126 const gl::ImageUnit &imageUnit, 127 const d3d11::SharedSRV **outSRV); 128 angle::Result getUAVForImage(const gl::Context *context, 129 const gl::ImageUnit &imageUnit, 130 const d3d11::SharedUAV **outUAV); 131 virtual angle::Result getSubresourceIndex(const gl::Context *context, 132 const gl::ImageIndex &index, 133 UINT *outSubresourceIndex) const; 134 virtual angle::Result getResource(const gl::Context *context, 135 const TextureHelper11 **outResource) = 0; 136 virtual void associateImage(Image11 *image, const gl::ImageIndex &index) = 0; 137 virtual void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) = 0; 138 virtual void verifyAssociatedImageValid(const gl::ImageIndex &index, 139 Image11 *expectedImage) = 0; 140 virtual angle::Result releaseAssociatedImage(const gl::Context *context, 141 const gl::ImageIndex &index, 142 Image11 *incomingImage) = 0; 143 144 GLsizei getRenderToTextureSamples() const override; 145 146 protected: 147 TextureStorage11(Renderer11 *renderer, 148 UINT bindFlags, 149 UINT miscFlags, 150 GLenum internalFormat, 151 const std::string &label); 152 int getLevelWidth(int mipLevel) const; 153 int getLevelHeight(int mipLevel) const; 154 int getLevelDepth(int mipLevel) const; 155 156 // Some classes (e.g. TextureStorage11_2D) will override getMippedResource. 157 virtual angle::Result getMippedResource(const gl::Context *context, 158 const TextureHelper11 **outResource); 159 160 virtual angle::Result getSwizzleTexture(const gl::Context *context, 161 const TextureHelper11 **outTexture) = 0; 162 virtual angle::Result getSwizzleRenderTarget(const gl::Context *context, 163 int mipLevel, 164 const d3d11::RenderTargetView **outRTV) = 0; 165 166 enum class SRVType 167 { 168 Sample, 169 Blit, 170 Stencil 171 }; 172 angle::Result getSRVLevel(const gl::Context *context, 173 int mipLevel, 174 SRVType srvType, 175 const d3d11::SharedSRV **outSRV); 176 177 // Get a version of a depth texture with only depth information, not stencil. 178 enum DropStencil 179 { 180 CREATED, 181 ALREADY_EXISTS 182 }; 183 virtual angle::Result ensureDropStencilTexture(const gl::Context *context, 184 DropStencil *dropStencilOut); 185 angle::Result initDropStencilTexture(const gl::Context *context, 186 const gl::ImageIndexIterator &it); 187 188 // The baseLevel parameter should *not* have mTopLevel applied. 189 virtual angle::Result createSRVForSampler(const gl::Context *context, 190 int baseLevel, 191 int mipLevels, 192 DXGI_FORMAT format, 193 const TextureHelper11 &texture, 194 d3d11::SharedSRV *outSRV) = 0; 195 virtual angle::Result createSRVForImage(const gl::Context *context, 196 int level, 197 DXGI_FORMAT format, 198 const TextureHelper11 &texture, 199 d3d11::SharedSRV *outSRV) = 0; 200 virtual angle::Result createUAVForImage(const gl::Context *context, 201 int level, 202 DXGI_FORMAT format, 203 const TextureHelper11 &texture, 204 d3d11::SharedUAV *outUAV) = 0; 205 206 void verifySwizzleExists(const gl::SwizzleState &swizzleState); 207 208 // Clear all cached non-swizzle SRVs and invalidate the swizzle cache. 209 void clearSRVCache(); 210 211 // Helper for resolving MS shadowed texture 212 angle::Result resolveTextureHelper(const gl::Context *context, const TextureHelper11 &texture); 213 angle::Result releaseMultisampledTexStorageForLevel(size_t level) override; 214 angle::Result findMultisampledRenderTarget(const gl::Context *context, 215 const gl::ImageIndex &index, 216 GLsizei samples, 217 RenderTargetD3D **outRT) const; 218 angle::Result getMultisampledRenderTarget(const gl::Context *context, 219 const gl::ImageIndex &index, 220 GLsizei samples, 221 RenderTargetD3D **outRT); 222 223 Renderer11 *mRenderer; 224 int mTopLevel; 225 unsigned int mMipLevels; 226 227 const d3d11::Format &mFormatInfo; 228 unsigned int mTextureWidth; 229 unsigned int mTextureHeight; 230 unsigned int mTextureDepth; 231 232 gl::TexLevelArray<gl::SwizzleState> mSwizzleCache; 233 TextureHelper11 mDropStencilTexture; 234 235 std::unique_ptr<MultisampledRenderToTextureInfo> mMSTexInfo; 236 237 private: 238 const UINT mBindFlags; 239 const UINT mMiscFlags; 240 241 struct SamplerKey 242 { 243 SamplerKey(); 244 SamplerKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil); 245 246 bool operator<(const SamplerKey &rhs) const; 247 248 int baseLevel; 249 int mipLevels; 250 bool swizzle; 251 bool dropStencil; 252 }; 253 254 angle::Result getCachedOrCreateSRVForSampler(const gl::Context *context, 255 const SamplerKey &key, 256 const d3d11::SharedSRV **outSRV); 257 258 using SRVCacheForSampler = std::map<SamplerKey, d3d11::SharedSRV>; 259 SRVCacheForSampler mSrvCacheForSampler; 260 261 struct ImageKey 262 { 263 ImageKey(); 264 ImageKey(int level, bool layered, int layer, GLenum access, GLenum format); 265 bool operator<(const ImageKey &rhs) const; 266 int level; 267 bool layered; 268 int layer; 269 GLenum access; 270 GLenum format; 271 }; 272 273 angle::Result getCachedOrCreateSRVForImage(const gl::Context *context, 274 const ImageKey &key, 275 const d3d11::SharedSRV **outSRV); 276 angle::Result getCachedOrCreateUAVForImage(const gl::Context *context, 277 const ImageKey &key, 278 const d3d11::SharedUAV **outUAV); 279 280 using SRVCacheForImage = std::map<ImageKey, d3d11::SharedSRV>; 281 SRVCacheForImage mSrvCacheForImage; 282 using UAVCacheForImage = std::map<ImageKey, d3d11::SharedUAV>; 283 UAVCacheForImage mUavCacheForImage; 284 285 gl::TexLevelArray<d3d11::SharedSRV> mLevelSRVs; 286 gl::TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs; 287 gl::TexLevelArray<d3d11::SharedSRV> mLevelStencilSRVs; 288 }; 289 290 class TextureStorage11_2D : public TextureStorage11 291 { 292 public: 293 TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain, const std::string &label); 294 TextureStorage11_2D(Renderer11 *renderer, 295 GLenum internalformat, 296 BindFlags bindFlags, 297 GLsizei width, 298 GLsizei height, 299 int levels, 300 const std::string &label, 301 bool hintLevelZeroOnly = false); 302 ~TextureStorage11_2D() override; 303 304 angle::Result onDestroy(const gl::Context *context) override; 305 306 angle::Result getResource(const gl::Context *context, 307 const TextureHelper11 **outResource) override; 308 angle::Result getMippedResource(const gl::Context *context, 309 const TextureHelper11 **outResource) override; 310 angle::Result findRenderTarget(const gl::Context *context, 311 const gl::ImageIndex &index, 312 GLsizei samples, 313 RenderTargetD3D **outRT) const override; 314 angle::Result getRenderTarget(const gl::Context *context, 315 const gl::ImageIndex &index, 316 GLsizei samples, 317 RenderTargetD3D **outRT) override; 318 319 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 320 321 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 322 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 323 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 324 angle::Result releaseAssociatedImage(const gl::Context *context, 325 const gl::ImageIndex &index, 326 Image11 *incomingImage) override; 327 328 angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context, 329 bool useLevelZeroTexture) override; 330 void onLabelUpdate() override; 331 332 protected: 333 angle::Result getSwizzleTexture(const gl::Context *context, 334 const TextureHelper11 **outTexture) override; 335 angle::Result getSwizzleRenderTarget(const gl::Context *context, 336 int mipLevel, 337 const d3d11::RenderTargetView **outRTV) override; 338 339 angle::Result ensureDropStencilTexture(const gl::Context *context, 340 DropStencil *dropStencilOut) override; 341 342 angle::Result ensureTextureExists(const gl::Context *context, int mipLevels); 343 344 angle::Result resolveTexture(const gl::Context *context) override; 345 346 private: 347 angle::Result createSRVForSampler(const gl::Context *context, 348 int baseLevel, 349 int mipLevels, 350 DXGI_FORMAT format, 351 const TextureHelper11 &texture, 352 d3d11::SharedSRV *outSRV) override; 353 angle::Result createSRVForImage(const gl::Context *context, 354 int level, 355 DXGI_FORMAT format, 356 const TextureHelper11 &texture, 357 d3d11::SharedSRV *outSRV) override; 358 angle::Result createUAVForImage(const gl::Context *context, 359 int level, 360 DXGI_FORMAT format, 361 const TextureHelper11 &texture, 362 d3d11::SharedUAV *outUAV) override; 363 364 TextureHelper11 mTexture; 365 gl::TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget; 366 bool mHasKeyedMutex; 367 368 // These are members related to the zero max-LOD workaround. 369 // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from 370 // level zero). These members are used to work around this limitation. Usually only mTexture XOR 371 // mLevelZeroTexture will exist. For example, if an app creates a texture with only one level, 372 // then 9_3 will only create mLevelZeroTexture. However, in some scenarios, both textures have 373 // to be created. This incurs additional memory overhead. One example of this is an application 374 // that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture. A 375 // more likely example is an app that creates an empty texture, renders to it, and then calls 376 // glGenerateMipmap 377 // TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been 378 // created to save memory. 379 TextureHelper11 mLevelZeroTexture; 380 std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget; 381 bool mUseLevelZeroTexture; 382 383 // Swizzle-related variables 384 TextureHelper11 mSwizzleTexture; 385 gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 386 387 gl::TexLevelArray<Image11 *> mAssociatedImages; 388 }; 389 390 class TextureStorage11_External : public TextureStorage11 391 { 392 public: 393 TextureStorage11_External(Renderer11 *renderer, 394 egl::Stream *stream, 395 const egl::Stream::GLTextureDescription &glDesc, 396 const std::string &label); 397 ~TextureStorage11_External() override; 398 399 angle::Result onDestroy(const gl::Context *context) override; 400 401 angle::Result getResource(const gl::Context *context, 402 const TextureHelper11 **outResource) override; 403 angle::Result getMippedResource(const gl::Context *context, 404 const TextureHelper11 **outResource) override; 405 angle::Result findRenderTarget(const gl::Context *context, 406 const gl::ImageIndex &index, 407 GLsizei samples, 408 RenderTargetD3D **outRT) const override; 409 angle::Result getRenderTarget(const gl::Context *context, 410 const gl::ImageIndex &index, 411 GLsizei samples, 412 RenderTargetD3D **outRT) override; 413 414 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 415 416 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 417 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 418 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 419 angle::Result releaseAssociatedImage(const gl::Context *context, 420 const gl::ImageIndex &index, 421 Image11 *incomingImage) override; 422 void onLabelUpdate() override; 423 424 protected: 425 angle::Result getSwizzleTexture(const gl::Context *context, 426 const TextureHelper11 **outTexture) override; 427 angle::Result getSwizzleRenderTarget(const gl::Context *context, 428 int mipLevel, 429 const d3d11::RenderTargetView **outRTV) override; 430 431 private: 432 angle::Result createSRVForSampler(const gl::Context *context, 433 int baseLevel, 434 int mipLevels, 435 DXGI_FORMAT format, 436 const TextureHelper11 &texture, 437 d3d11::SharedSRV *outSRV) override; 438 angle::Result createSRVForImage(const gl::Context *context, 439 int level, 440 DXGI_FORMAT format, 441 const TextureHelper11 &texture, 442 d3d11::SharedSRV *outSRV) override; 443 angle::Result createUAVForImage(const gl::Context *context, 444 int level, 445 DXGI_FORMAT format, 446 const TextureHelper11 &texture, 447 d3d11::SharedUAV *outUAV) override; 448 449 TextureHelper11 mTexture; 450 int mSubresourceIndex; 451 bool mHasKeyedMutex; 452 453 Image11 *mAssociatedImage; 454 }; 455 456 // A base class for texture storage classes where the associated images are not changed, nor are 457 // they accessible as images in GLES3.1+ shaders. 458 class TextureStorage11ImmutableBase : public TextureStorage11 459 { 460 public: 461 TextureStorage11ImmutableBase(Renderer11 *renderer, 462 UINT bindFlags, 463 UINT miscFlags, 464 GLenum internalFormat, 465 const std::string &label); 466 467 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 468 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 469 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 470 angle::Result releaseAssociatedImage(const gl::Context *context, 471 const gl::ImageIndex &index, 472 Image11 *incomingImage) override; 473 474 angle::Result createSRVForImage(const gl::Context *context, 475 int level, 476 DXGI_FORMAT format, 477 const TextureHelper11 &texture, 478 d3d11::SharedSRV *outSRV) override; 479 angle::Result createUAVForImage(const gl::Context *context, 480 int level, 481 DXGI_FORMAT format, 482 const TextureHelper11 &texture, 483 d3d11::SharedUAV *outUAV) override; 484 }; 485 486 class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase 487 { 488 public: 489 TextureStorage11_EGLImage(Renderer11 *renderer, 490 EGLImageD3D *eglImage, 491 RenderTarget11 *renderTarget11, 492 const std::string &label); 493 ~TextureStorage11_EGLImage() override; 494 495 angle::Result getSubresourceIndex(const gl::Context *context, 496 const gl::ImageIndex &index, 497 UINT *outSubresourceIndex) const override; 498 angle::Result getResource(const gl::Context *context, 499 const TextureHelper11 **outResource) override; 500 angle::Result getSRVForSampler(const gl::Context *context, 501 const gl::TextureState &textureState, 502 const gl::SamplerState &sampler, 503 const d3d11::SharedSRV **outSRV) override; 504 angle::Result getMippedResource(const gl::Context *context, 505 const TextureHelper11 **outResource) override; 506 angle::Result findRenderTarget(const gl::Context *context, 507 const gl::ImageIndex &index, 508 GLsizei samples, 509 RenderTargetD3D **outRT) const override; 510 angle::Result getRenderTarget(const gl::Context *context, 511 const gl::ImageIndex &index, 512 GLsizei samples, 513 RenderTargetD3D **outRT) override; 514 515 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 516 517 angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context, 518 bool useLevelZeroTexture) override; 519 void onLabelUpdate() override; 520 521 protected: 522 angle::Result getSwizzleTexture(const gl::Context *context, 523 const TextureHelper11 **outTexture) override; 524 angle::Result getSwizzleRenderTarget(const gl::Context *context, 525 int mipLevel, 526 const d3d11::RenderTargetView **outRTV) override; 527 528 private: 529 // Check if the EGL image's render target has been updated due to orphaning and delete 530 // any SRVs and other resources based on the image's old render target. 531 angle::Result checkForUpdatedRenderTarget(const gl::Context *context); 532 533 angle::Result createSRVForSampler(const gl::Context *context, 534 int baseLevel, 535 int mipLevels, 536 DXGI_FORMAT format, 537 const TextureHelper11 &texture, 538 d3d11::SharedSRV *outSRV) override; 539 540 angle::Result getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const; 541 542 EGLImageD3D *mImage; 543 uintptr_t mCurrentRenderTarget; 544 545 // Swizzle-related variables 546 TextureHelper11 mSwizzleTexture; 547 std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets; 548 }; 549 550 class TextureStorage11_Cube : public TextureStorage11 551 { 552 public: 553 TextureStorage11_Cube(Renderer11 *renderer, 554 GLenum internalformat, 555 BindFlags bindFlags, 556 int size, 557 int levels, 558 bool hintLevelZeroOnly, 559 const std::string &label); 560 ~TextureStorage11_Cube() override; 561 562 angle::Result onDestroy(const gl::Context *context) override; 563 564 angle::Result getSubresourceIndex(const gl::Context *context, 565 const gl::ImageIndex &index, 566 UINT *outSubresourceIndex) const override; 567 568 angle::Result getResource(const gl::Context *context, 569 const TextureHelper11 **outResource) override; 570 angle::Result getMippedResource(const gl::Context *context, 571 const TextureHelper11 **outResource) override; 572 angle::Result findRenderTarget(const gl::Context *context, 573 const gl::ImageIndex &index, 574 GLsizei samples, 575 RenderTargetD3D **outRT) const override; 576 angle::Result getRenderTarget(const gl::Context *context, 577 const gl::ImageIndex &index, 578 GLsizei samples, 579 RenderTargetD3D **outRT) override; 580 581 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 582 583 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 584 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 585 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 586 angle::Result releaseAssociatedImage(const gl::Context *context, 587 const gl::ImageIndex &index, 588 Image11 *incomingImage) override; 589 590 angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context, 591 bool useLevelZeroTexture) override; 592 void onLabelUpdate() override; 593 594 protected: 595 angle::Result getSwizzleTexture(const gl::Context *context, 596 const TextureHelper11 **outTexture) override; 597 angle::Result getSwizzleRenderTarget(const gl::Context *context, 598 int mipLevel, 599 const d3d11::RenderTargetView **outRTV) override; 600 601 angle::Result ensureDropStencilTexture(const gl::Context *context, 602 DropStencil *dropStencilOut) override; 603 604 angle::Result ensureTextureExists(const gl::Context *context, int mipLevels); 605 606 angle::Result resolveTexture(const gl::Context *context) override; 607 608 private: 609 angle::Result createSRVForSampler(const gl::Context *context, 610 int baseLevel, 611 int mipLevels, 612 DXGI_FORMAT format, 613 const TextureHelper11 &texture, 614 d3d11::SharedSRV *outSRV) override; 615 angle::Result createSRVForImage(const gl::Context *context, 616 int level, 617 DXGI_FORMAT format, 618 const TextureHelper11 &texture, 619 d3d11::SharedSRV *outSRV) override; 620 angle::Result createUAVForImage(const gl::Context *context, 621 int level, 622 DXGI_FORMAT format, 623 const TextureHelper11 &texture, 624 d3d11::SharedUAV *outUAV) override; 625 angle::Result createRenderTargetSRV(const gl::Context *context, 626 const TextureHelper11 &texture, 627 const gl::ImageIndex &index, 628 DXGI_FORMAT resourceFormat, 629 d3d11::SharedSRV *srv) const; 630 631 TextureHelper11 mTexture; 632 CubeFaceArray<gl::TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget; 633 634 // Level-zero workaround members. See TextureStorage11_2D's workaround members for a 635 // description. 636 TextureHelper11 mLevelZeroTexture; 637 CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget; 638 bool mUseLevelZeroTexture; 639 640 TextureHelper11 mSwizzleTexture; 641 gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 642 643 CubeFaceArray<gl::TexLevelArray<Image11 *>> mAssociatedImages; 644 }; 645 646 class TextureStorage11_3D : public TextureStorage11 647 { 648 public: 649 TextureStorage11_3D(Renderer11 *renderer, 650 GLenum internalformat, 651 BindFlags bindFlags, 652 GLsizei width, 653 GLsizei height, 654 GLsizei depth, 655 int levels, 656 const std::string &label); 657 ~TextureStorage11_3D() override; 658 659 angle::Result onDestroy(const gl::Context *context) override; 660 661 angle::Result getResource(const gl::Context *context, 662 const TextureHelper11 **outResource) override; 663 664 // Handles both layer and non-layer RTs 665 angle::Result findRenderTarget(const gl::Context *context, 666 const gl::ImageIndex &index, 667 GLsizei samples, 668 RenderTargetD3D **outRT) const override; 669 angle::Result getRenderTarget(const gl::Context *context, 670 const gl::ImageIndex &index, 671 GLsizei samples, 672 RenderTargetD3D **outRT) override; 673 674 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 675 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 676 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 677 angle::Result releaseAssociatedImage(const gl::Context *context, 678 const gl::ImageIndex &index, 679 Image11 *incomingImage) override; 680 void onLabelUpdate() override; 681 682 protected: 683 angle::Result getSwizzleTexture(const gl::Context *context, 684 const TextureHelper11 **outTexture) override; 685 angle::Result getSwizzleRenderTarget(const gl::Context *context, 686 int mipLevel, 687 const d3d11::RenderTargetView **outRTV) override; 688 689 private: 690 angle::Result createSRVForSampler(const gl::Context *context, 691 int baseLevel, 692 int mipLevels, 693 DXGI_FORMAT format, 694 const TextureHelper11 &texture, 695 d3d11::SharedSRV *outSRV) override; 696 angle::Result createSRVForImage(const gl::Context *context, 697 int level, 698 DXGI_FORMAT format, 699 const TextureHelper11 &texture, 700 d3d11::SharedSRV *outSRV) override; 701 angle::Result createUAVForImage(const gl::Context *context, 702 int level, 703 DXGI_FORMAT format, 704 const TextureHelper11 &texture, 705 d3d11::SharedUAV *outUAV) override; 706 707 typedef std::pair<int, int> LevelLayerKey; 708 std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets; 709 710 gl::TexLevelArray<std::unique_ptr<RenderTarget11>> mLevelRenderTargets; 711 712 TextureHelper11 mTexture; 713 TextureHelper11 mSwizzleTexture; 714 gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 715 716 gl::TexLevelArray<Image11 *> mAssociatedImages; 717 }; 718 719 class TextureStorage11_2DArray : public TextureStorage11 720 { 721 public: 722 TextureStorage11_2DArray(Renderer11 *renderer, 723 GLenum internalformat, 724 BindFlags bindFlags, 725 GLsizei width, 726 GLsizei height, 727 GLsizei depth, 728 int levels, 729 const std::string &label); 730 ~TextureStorage11_2DArray() override; 731 732 angle::Result onDestroy(const gl::Context *context) override; 733 734 angle::Result getResource(const gl::Context *context, 735 const TextureHelper11 **outResource) override; 736 angle::Result findRenderTarget(const gl::Context *context, 737 const gl::ImageIndex &index, 738 GLsizei samples, 739 RenderTargetD3D **outRT) const override; 740 angle::Result getRenderTarget(const gl::Context *context, 741 const gl::ImageIndex &index, 742 GLsizei samples, 743 RenderTargetD3D **outRT) override; 744 745 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 746 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 747 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 748 angle::Result releaseAssociatedImage(const gl::Context *context, 749 const gl::ImageIndex &index, 750 Image11 *incomingImage) override; 751 void onLabelUpdate() override; 752 753 struct LevelLayerRangeKey 754 { 755 LevelLayerRangeKey(int mipLevelIn, int layerIn, int numLayersIn) 756 : mipLevel(mipLevelIn), layer(layerIn), numLayers(numLayersIn) 757 {} 758 bool operator<(const LevelLayerRangeKey &other) const 759 { 760 if (mipLevel != other.mipLevel) 761 { 762 return mipLevel < other.mipLevel; 763 } 764 if (layer != other.layer) 765 { 766 return layer < other.layer; 767 } 768 return numLayers < other.numLayers; 769 } 770 int mipLevel; 771 int layer; 772 int numLayers; 773 }; 774 775 protected: 776 angle::Result getSwizzleTexture(const gl::Context *context, 777 const TextureHelper11 **outTexture) override; 778 angle::Result getSwizzleRenderTarget(const gl::Context *context, 779 int mipLevel, 780 const d3d11::RenderTargetView **outRTV) override; 781 782 angle::Result ensureDropStencilTexture(const gl::Context *context, 783 DropStencil *dropStencilOut) override; 784 785 private: 786 angle::Result createSRVForSampler(const gl::Context *context, 787 int baseLevel, 788 int mipLevels, 789 DXGI_FORMAT format, 790 const TextureHelper11 &texture, 791 d3d11::SharedSRV *outSRV) override; 792 angle::Result createSRVForImage(const gl::Context *context, 793 int level, 794 DXGI_FORMAT format, 795 const TextureHelper11 &texture, 796 d3d11::SharedSRV *outSRV) override; 797 angle::Result createUAVForImage(const gl::Context *context, 798 int level, 799 DXGI_FORMAT format, 800 const TextureHelper11 &texture, 801 d3d11::SharedUAV *outUAV) override; 802 angle::Result createRenderTargetSRV(const gl::Context *context, 803 const TextureHelper11 &texture, 804 const gl::ImageIndex &index, 805 DXGI_FORMAT resourceFormat, 806 d3d11::SharedSRV *srv) const; 807 808 std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets; 809 810 TextureHelper11 mTexture; 811 812 TextureHelper11 mSwizzleTexture; 813 gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets; 814 815 typedef std::map<LevelLayerRangeKey, Image11 *> ImageMap; 816 ImageMap mAssociatedImages; 817 }; 818 819 class TextureStorage11_2DMultisample final : public TextureStorage11ImmutableBase 820 { 821 public: 822 TextureStorage11_2DMultisample(Renderer11 *renderer, 823 GLenum internalformat, 824 GLsizei width, 825 GLsizei height, 826 int levels, 827 int samples, 828 bool fixedSampleLocations, 829 const std::string &label); 830 ~TextureStorage11_2DMultisample() override; 831 832 angle::Result onDestroy(const gl::Context *context) override; 833 834 angle::Result getResource(const gl::Context *context, 835 const TextureHelper11 **outResource) override; 836 angle::Result findRenderTarget(const gl::Context *context, 837 const gl::ImageIndex &index, 838 GLsizei samples, 839 RenderTargetD3D **outRT) const override; 840 angle::Result getRenderTarget(const gl::Context *context, 841 const gl::ImageIndex &index, 842 GLsizei samples, 843 RenderTargetD3D **outRT) override; 844 845 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 846 void onLabelUpdate() override; 847 848 protected: 849 angle::Result getSwizzleTexture(const gl::Context *context, 850 const TextureHelper11 **outTexture) override; 851 angle::Result getSwizzleRenderTarget(const gl::Context *context, 852 int mipLevel, 853 const d3d11::RenderTargetView **outRTV) override; 854 855 angle::Result ensureDropStencilTexture(const gl::Context *context, 856 DropStencil *dropStencilOut) override; 857 858 angle::Result ensureTextureExists(const gl::Context *context, int mipLevels); 859 860 private: 861 angle::Result createSRVForSampler(const gl::Context *context, 862 int baseLevel, 863 int mipLevels, 864 DXGI_FORMAT format, 865 const TextureHelper11 &texture, 866 d3d11::SharedSRV *outSRV) override; 867 868 TextureHelper11 mTexture; 869 std::unique_ptr<RenderTarget11> mRenderTarget; 870 871 unsigned int mSamples; 872 GLboolean mFixedSampleLocations; 873 }; 874 875 class TextureStorage11_2DMultisampleArray final : public TextureStorage11ImmutableBase 876 { 877 public: 878 TextureStorage11_2DMultisampleArray(Renderer11 *renderer, 879 GLenum internalformat, 880 GLsizei width, 881 GLsizei height, 882 GLsizei depth, 883 int levels, 884 int samples, 885 bool fixedSampleLocations, 886 const std::string &label); 887 ~TextureStorage11_2DMultisampleArray() override; 888 889 angle::Result onDestroy(const gl::Context *context) override; 890 891 angle::Result getResource(const gl::Context *context, 892 const TextureHelper11 **outResource) override; 893 angle::Result findRenderTarget(const gl::Context *context, 894 const gl::ImageIndex &index, 895 GLsizei samples, 896 RenderTargetD3D **outRT) const override; 897 angle::Result getRenderTarget(const gl::Context *context, 898 const gl::ImageIndex &index, 899 GLsizei samples, 900 RenderTargetD3D **outRT) override; 901 902 angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override; 903 void onLabelUpdate() override; 904 905 protected: 906 angle::Result getSwizzleTexture(const gl::Context *context, 907 const TextureHelper11 **outTexture) override; 908 angle::Result getSwizzleRenderTarget(const gl::Context *context, 909 int mipLevel, 910 const d3d11::RenderTargetView **outRTV) override; 911 912 angle::Result ensureDropStencilTexture(const gl::Context *context, 913 DropStencil *dropStencilOut) override; 914 915 angle::Result ensureTextureExists(const gl::Context *context, int mipLevels); 916 917 private: 918 angle::Result createRenderTargetSRV(const gl::Context *context, 919 const TextureHelper11 &texture, 920 const gl::ImageIndex &index, 921 DXGI_FORMAT resourceFormat, 922 d3d11::SharedSRV *srv) const; 923 924 angle::Result createSRVForSampler(const gl::Context *context, 925 int baseLevel, 926 int mipLevels, 927 DXGI_FORMAT format, 928 const TextureHelper11 &texture, 929 d3d11::SharedSRV *outSRV) override; 930 931 TextureHelper11 mTexture; 932 std::map<TextureStorage11_2DArray::LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> 933 mRenderTargets; 934 935 unsigned int mSamples; 936 GLboolean mFixedSampleLocations; 937 }; 938 939 class TextureStorage11_Buffer : public TextureStorage11 940 { 941 public: 942 TextureStorage11_Buffer(Renderer11 *renderer, 943 const gl::OffsetBindingPointer<gl::Buffer> &buffer, 944 GLenum internalFormat, 945 const std::string &label); 946 ~TextureStorage11_Buffer() override; 947 948 angle::Result getResource(const gl::Context *context, 949 const TextureHelper11 **outResource) override; 950 angle::Result getMippedResource(const gl::Context *context, 951 const TextureHelper11 **outResource) override; 952 angle::Result findRenderTarget(const gl::Context *context, 953 const gl::ImageIndex &index, 954 GLsizei samples, 955 RenderTargetD3D **outRT) const override; 956 angle::Result getRenderTarget(const gl::Context *context, 957 const gl::ImageIndex &index, 958 GLsizei samples, 959 RenderTargetD3D **outRT) override; 960 961 void onLabelUpdate() override; 962 963 void associateImage(Image11 *image, const gl::ImageIndex &index) override; 964 void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; 965 void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; 966 angle::Result releaseAssociatedImage(const gl::Context *context, 967 const gl::ImageIndex &index, 968 Image11 *incomingImage) override; 969 970 protected: 971 angle::Result getSwizzleTexture(const gl::Context *context, 972 const TextureHelper11 **outTexture) override; 973 angle::Result getSwizzleRenderTarget(const gl::Context *context, 974 int mipLevel, 975 const d3d11::RenderTargetView **outRTV) override; 976 977 private: 978 angle::Result createSRVForSampler(const gl::Context *context, 979 int baseLevel, 980 int mipLevels, 981 DXGI_FORMAT format, 982 const TextureHelper11 &texture, 983 d3d11::SharedSRV *outSRV) override; 984 angle::Result createSRVForImage(const gl::Context *context, 985 int level, 986 DXGI_FORMAT format, 987 const TextureHelper11 &texture, 988 d3d11::SharedSRV *outSRV) override; 989 angle::Result createUAVForImage(const gl::Context *context, 990 int level, 991 DXGI_FORMAT format, 992 const TextureHelper11 &texture, 993 d3d11::SharedUAV *outUAV) override; 994 995 angle::Result initTexture(const gl::Context *context); 996 997 TextureHelper11 mTexture; 998 const gl::OffsetBindingPointer<gl::Buffer> &mBuffer; 999 GLint64 mDataSize; 1000 }; 1001 } // namespace rx 1002 1003 #endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_