TextureD3D.h (49896B)
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 LIBANGLE_RENDERER_D3D_TEXTURED3D_H_ 10 #define LIBANGLE_RENDERER_D3D_TEXTURED3D_H_ 11 12 #include "common/Color.h" 13 #include "libANGLE/Constants.h" 14 #include "libANGLE/Stream.h" 15 #include "libANGLE/angletypes.h" 16 #include "libANGLE/renderer/TextureImpl.h" 17 #include "libANGLE/renderer/d3d/RendererD3D.h" 18 #include "libANGLE/renderer/d3d/TextureStorage.h" 19 20 namespace gl 21 { 22 class Framebuffer; 23 } 24 25 namespace rx 26 { 27 class EGLImageD3D; 28 class ImageD3D; 29 class RendererD3D; 30 class RenderTargetD3D; 31 class TextureStorage; 32 33 class TextureD3D : public TextureImpl, public angle::ObserverInterface 34 { 35 public: 36 TextureD3D(const gl::TextureState &data, RendererD3D *renderer); 37 ~TextureD3D() override; 38 39 void onDestroy(const gl::Context *context) override; 40 41 angle::Result getNativeTexture(const gl::Context *context, TextureStorage **outStorage); 42 43 bool hasDirtyImages() const { return mDirtyImages; } 44 void resetDirty() { mDirtyImages = false; } 45 46 virtual ImageD3D *getImage(const gl::ImageIndex &index) const = 0; 47 virtual GLsizei getLayerCount(int level) const = 0; 48 49 angle::Result getImageAndSyncFromStorage(const gl::Context *context, 50 const gl::ImageIndex &index, 51 ImageD3D **outImage); 52 53 GLint getBaseLevelWidth() const; 54 GLint getBaseLevelHeight() const; 55 GLenum getBaseLevelInternalFormat() const; 56 57 angle::Result setStorage(const gl::Context *context, 58 gl::TextureType type, 59 size_t levels, 60 GLenum internalFormat, 61 const gl::Extents &size) override; 62 63 angle::Result setStorageMultisample(const gl::Context *context, 64 gl::TextureType type, 65 GLsizei samples, 66 GLint internalformat, 67 const gl::Extents &size, 68 bool fixedSampleLocations) override; 69 70 angle::Result setBuffer(const gl::Context *context, GLenum internalFormat) override; 71 72 angle::Result setStorageExternalMemory(const gl::Context *context, 73 gl::TextureType type, 74 size_t levels, 75 GLenum internalFormat, 76 const gl::Extents &size, 77 gl::MemoryObject *memoryObject, 78 GLuint64 offset, 79 GLbitfield createFlags, 80 GLbitfield usageFlags, 81 const void *imageCreateInfoPNext) override; 82 83 bool isImmutable() const { return mImmutable; } 84 85 virtual angle::Result getRenderTarget(const gl::Context *context, 86 const gl::ImageIndex &index, 87 GLsizei samples, 88 RenderTargetD3D **outRT) = 0; 89 90 // Returns an iterator over all "Images" for this particular Texture. 91 virtual gl::ImageIndexIterator imageIterator() const = 0; 92 93 // Returns an ImageIndex for a particular "Image". 3D Textures do not have images for 94 // slices of their depth texures, so 3D textures ignore the layer parameter. 95 virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0; 96 virtual bool isValidIndex(const gl::ImageIndex &index) const = 0; 97 98 angle::Result setImageExternal(const gl::Context *context, 99 gl::TextureType type, 100 egl::Stream *stream, 101 const egl::Stream::GLTextureDescription &desc) override; 102 angle::Result generateMipmap(const gl::Context *context) override; 103 bool hasStorage() const { return mTexStorage != nullptr; } 104 TextureStorage *getStorage(); 105 ImageD3D *getBaseLevelImage() const; 106 107 angle::Result getAttachmentRenderTarget(const gl::Context *context, 108 GLenum binding, 109 const gl::ImageIndex &imageIndex, 110 GLsizei samples, 111 FramebufferAttachmentRenderTarget **rtOut) override; 112 113 angle::Result setBaseLevel(const gl::Context *context, GLuint baseLevel) override; 114 115 angle::Result syncState(const gl::Context *context, 116 const gl::Texture::DirtyBits &dirtyBits, 117 gl::Command source) override; 118 119 angle::Result initializeContents(const gl::Context *context, 120 GLenum binding, 121 const gl::ImageIndex &imageIndex) override; 122 123 GLsizei getRenderToTextureSamples(); 124 125 angle::Result ensureUnorderedAccess(const gl::Context *context); 126 angle::Result onLabelUpdate(const gl::Context *context) override; 127 128 // ObserverInterface implementation. 129 void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; 130 131 protected: 132 angle::Result setImageImpl(const gl::Context *context, 133 const gl::ImageIndex &index, 134 GLenum type, 135 const gl::PixelUnpackState &unpack, 136 gl::Buffer *unpackBuffer, 137 const uint8_t *pixels, 138 ptrdiff_t layerOffset); 139 angle::Result subImage(const gl::Context *context, 140 const gl::ImageIndex &index, 141 const gl::Box &area, 142 GLenum format, 143 GLenum type, 144 const gl::PixelUnpackState &unpack, 145 gl::Buffer *unpackBuffer, 146 const uint8_t *pixels, 147 ptrdiff_t layerOffset); 148 angle::Result setCompressedImageImpl(const gl::Context *context, 149 const gl::ImageIndex &index, 150 const gl::PixelUnpackState &unpack, 151 const uint8_t *pixels, 152 ptrdiff_t layerOffset); 153 angle::Result subImageCompressed(const gl::Context *context, 154 const gl::ImageIndex &index, 155 const gl::Box &area, 156 GLenum format, 157 const gl::PixelUnpackState &unpack, 158 const uint8_t *pixels, 159 ptrdiff_t layerOffset); 160 bool isFastUnpackable(const gl::Buffer *unpackBuffer, 161 const gl::PixelUnpackState &unpack, 162 GLenum sizedInternalFormat); 163 angle::Result fastUnpackPixels(const gl::Context *context, 164 const gl::PixelUnpackState &unpack, 165 gl::Buffer *unpackBuffer, 166 const uint8_t *pixels, 167 const gl::Box &destArea, 168 GLenum sizedInternalFormat, 169 GLenum type, 170 RenderTargetD3D *destRenderTarget); 171 172 GLint getLevelZeroWidth() const; 173 GLint getLevelZeroHeight() const; 174 virtual GLint getLevelZeroDepth() const; 175 176 GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const; 177 virtual angle::Result initMipmapImages(const gl::Context *context) = 0; 178 bool isBaseImageZeroSize() const; 179 virtual bool isImageComplete(const gl::ImageIndex &index) const = 0; 180 181 bool canCreateRenderTargetForImage(const gl::ImageIndex &index) const; 182 angle::Result ensureBindFlags(const gl::Context *context, BindFlags bindFlags); 183 angle::Result ensureRenderTarget(const gl::Context *context); 184 185 virtual angle::Result createCompleteStorage(const gl::Context *context, 186 BindFlags bindFlags, 187 TexStoragePointer *outTexStorage) const = 0; 188 virtual angle::Result setCompleteTexStorage(const gl::Context *context, 189 TextureStorage *newCompleteTexStorage) = 0; 190 angle::Result commitRegion(const gl::Context *context, 191 const gl::ImageIndex &index, 192 const gl::Box ®ion); 193 194 angle::Result releaseTexStorage(const gl::Context *context, 195 const gl::TexLevelMask ©StorageToImagesMask); 196 197 GLuint getBaseLevel() const { return mBaseLevel; } 198 199 virtual void markAllImagesDirty() = 0; 200 201 GLint getBaseLevelDepth() const; 202 203 RendererD3D *mRenderer; 204 205 bool mDirtyImages; 206 207 bool mImmutable; 208 TextureStorage *mTexStorage; 209 angle::ObserverBinding mTexStorageObserverBinding; 210 211 private: 212 virtual angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) = 0; 213 214 virtual angle::Result updateStorage(const gl::Context *context) = 0; 215 216 bool couldUseSetData() const; 217 bool shouldUseSetData(const ImageD3D *image) const; 218 219 angle::Result generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel); 220 221 GLuint mBaseLevel; 222 }; 223 224 class TextureD3D_2D : public TextureD3D 225 { 226 public: 227 TextureD3D_2D(const gl::TextureState &data, RendererD3D *renderer); 228 ~TextureD3D_2D() override; 229 230 void onDestroy(const gl::Context *context) override; 231 232 ImageD3D *getImage(int level, int layer) const; 233 ImageD3D *getImage(const gl::ImageIndex &index) const override; 234 GLsizei getLayerCount(int level) const override; 235 236 GLsizei getWidth(GLint level) const; 237 GLsizei getHeight(GLint level) const; 238 GLenum getInternalFormat(GLint level) const; 239 bool isDepth(GLint level) const; 240 bool isSRGB(GLint level) const; 241 242 angle::Result setImage(const gl::Context *context, 243 const gl::ImageIndex &index, 244 GLenum internalFormat, 245 const gl::Extents &size, 246 GLenum format, 247 GLenum type, 248 const gl::PixelUnpackState &unpack, 249 gl::Buffer *unpackBuffer, 250 const uint8_t *pixels) override; 251 angle::Result setSubImage(const gl::Context *context, 252 const gl::ImageIndex &index, 253 const gl::Box &area, 254 GLenum format, 255 GLenum type, 256 const gl::PixelUnpackState &unpack, 257 gl::Buffer *unpackBuffer, 258 const uint8_t *pixels) override; 259 260 angle::Result setCompressedImage(const gl::Context *context, 261 const gl::ImageIndex &index, 262 GLenum internalFormat, 263 const gl::Extents &size, 264 const gl::PixelUnpackState &unpack, 265 size_t imageSize, 266 const uint8_t *pixels) override; 267 angle::Result setCompressedSubImage(const gl::Context *context, 268 const gl::ImageIndex &index, 269 const gl::Box &area, 270 GLenum format, 271 const gl::PixelUnpackState &unpack, 272 size_t imageSize, 273 const uint8_t *pixels) override; 274 275 angle::Result copyImage(const gl::Context *context, 276 const gl::ImageIndex &index, 277 const gl::Rectangle &sourceArea, 278 GLenum internalFormat, 279 gl::Framebuffer *source) override; 280 angle::Result copySubImage(const gl::Context *context, 281 const gl::ImageIndex &index, 282 const gl::Offset &destOffset, 283 const gl::Rectangle &sourceArea, 284 gl::Framebuffer *source) override; 285 286 angle::Result copyTexture(const gl::Context *context, 287 const gl::ImageIndex &index, 288 GLenum internalFormat, 289 GLenum type, 290 GLint sourceLevel, 291 bool unpackFlipY, 292 bool unpackPremultiplyAlpha, 293 bool unpackUnmultiplyAlpha, 294 const gl::Texture *source) override; 295 angle::Result copySubTexture(const gl::Context *context, 296 const gl::ImageIndex &index, 297 const gl::Offset &destOffset, 298 GLint sourceLevel, 299 const gl::Box &sourceBox, 300 bool unpackFlipY, 301 bool unpackPremultiplyAlpha, 302 bool unpackUnmultiplyAlpha, 303 const gl::Texture *source) override; 304 angle::Result copyCompressedTexture(const gl::Context *context, 305 const gl::Texture *source) override; 306 307 angle::Result setStorage(const gl::Context *context, 308 gl::TextureType type, 309 size_t levels, 310 GLenum internalFormat, 311 const gl::Extents &size) override; 312 313 angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; 314 angle::Result releaseTexImage(const gl::Context *context) override; 315 316 angle::Result setEGLImageTarget(const gl::Context *context, 317 gl::TextureType type, 318 egl::Image *image) override; 319 320 angle::Result getRenderTarget(const gl::Context *context, 321 const gl::ImageIndex &index, 322 GLsizei samples, 323 RenderTargetD3D **outRT) override; 324 325 gl::ImageIndexIterator imageIterator() const override; 326 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 327 bool isValidIndex(const gl::ImageIndex &index) const override; 328 329 protected: 330 void markAllImagesDirty() override; 331 332 private: 333 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 334 angle::Result createCompleteStorage(const gl::Context *context, 335 BindFlags bindFlags, 336 TexStoragePointer *outTexStorage) const override; 337 angle::Result setCompleteTexStorage(const gl::Context *context, 338 TextureStorage *newCompleteTexStorage) override; 339 340 angle::Result updateStorage(const gl::Context *context) override; 341 angle::Result initMipmapImages(const gl::Context *context) override; 342 343 bool isValidLevel(int level) const; 344 bool isLevelComplete(int level) const; 345 bool isImageComplete(const gl::ImageIndex &index) const override; 346 347 angle::Result updateStorageLevel(const gl::Context *context, int level); 348 349 angle::Result redefineImage(const gl::Context *context, 350 size_t level, 351 GLenum internalformat, 352 const gl::Extents &size, 353 bool forceRelease); 354 355 bool mEGLImageTarget; 356 gl::TexLevelArray<std::unique_ptr<ImageD3D>> mImageArray; 357 }; 358 359 class TextureD3D_Cube : public TextureD3D 360 { 361 public: 362 TextureD3D_Cube(const gl::TextureState &data, RendererD3D *renderer); 363 ~TextureD3D_Cube() override; 364 365 void onDestroy(const gl::Context *context) override; 366 367 ImageD3D *getImage(int level, int layer) const; 368 ImageD3D *getImage(const gl::ImageIndex &index) const override; 369 GLsizei getLayerCount(int level) const override; 370 371 GLenum getInternalFormat(GLint level, GLint layer) const; 372 bool isDepth(GLint level, GLint layer) const; 373 bool isSRGB(GLint level, GLint layer) const; 374 375 angle::Result setImage(const gl::Context *context, 376 const gl::ImageIndex &index, 377 GLenum internalFormat, 378 const gl::Extents &size, 379 GLenum format, 380 GLenum type, 381 const gl::PixelUnpackState &unpack, 382 gl::Buffer *unpackBuffer, 383 const uint8_t *pixels) override; 384 angle::Result setSubImage(const gl::Context *context, 385 const gl::ImageIndex &index, 386 const gl::Box &area, 387 GLenum format, 388 GLenum type, 389 const gl::PixelUnpackState &unpack, 390 gl::Buffer *unpackBuffer, 391 const uint8_t *pixels) override; 392 393 angle::Result setCompressedImage(const gl::Context *context, 394 const gl::ImageIndex &index, 395 GLenum internalFormat, 396 const gl::Extents &size, 397 const gl::PixelUnpackState &unpack, 398 size_t imageSize, 399 const uint8_t *pixels) override; 400 angle::Result setCompressedSubImage(const gl::Context *context, 401 const gl::ImageIndex &index, 402 const gl::Box &area, 403 GLenum format, 404 const gl::PixelUnpackState &unpack, 405 size_t imageSize, 406 const uint8_t *pixels) override; 407 408 angle::Result copyImage(const gl::Context *context, 409 const gl::ImageIndex &index, 410 const gl::Rectangle &sourceArea, 411 GLenum internalFormat, 412 gl::Framebuffer *source) override; 413 angle::Result copySubImage(const gl::Context *context, 414 const gl::ImageIndex &index, 415 const gl::Offset &destOffset, 416 const gl::Rectangle &sourceArea, 417 gl::Framebuffer *source) override; 418 419 angle::Result copyTexture(const gl::Context *context, 420 const gl::ImageIndex &index, 421 GLenum internalFormat, 422 GLenum type, 423 GLint sourceLevel, 424 bool unpackFlipY, 425 bool unpackPremultiplyAlpha, 426 bool unpackUnmultiplyAlpha, 427 const gl::Texture *source) override; 428 angle::Result copySubTexture(const gl::Context *context, 429 const gl::ImageIndex &index, 430 const gl::Offset &destOffset, 431 GLint sourceLevel, 432 const gl::Box &sourceBox, 433 bool unpackFlipY, 434 bool unpackPremultiplyAlpha, 435 bool unpackUnmultiplyAlpha, 436 const gl::Texture *source) override; 437 438 angle::Result setStorage(const gl::Context *context, 439 gl::TextureType type, 440 size_t levels, 441 GLenum internalFormat, 442 const gl::Extents &size) override; 443 444 angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; 445 angle::Result releaseTexImage(const gl::Context *context) override; 446 447 angle::Result setEGLImageTarget(const gl::Context *context, 448 gl::TextureType type, 449 egl::Image *image) override; 450 451 angle::Result getRenderTarget(const gl::Context *context, 452 const gl::ImageIndex &index, 453 GLsizei samples, 454 RenderTargetD3D **outRT) override; 455 456 gl::ImageIndexIterator imageIterator() const override; 457 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 458 bool isValidIndex(const gl::ImageIndex &index) const override; 459 460 protected: 461 void markAllImagesDirty() override; 462 463 private: 464 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 465 angle::Result createCompleteStorage(const gl::Context *context, 466 BindFlags bindFlags, 467 TexStoragePointer *outTexStorage) const override; 468 angle::Result setCompleteTexStorage(const gl::Context *context, 469 TextureStorage *newCompleteTexStorage) override; 470 471 angle::Result updateStorage(const gl::Context *context) override; 472 angle::Result initMipmapImages(const gl::Context *context) override; 473 474 bool isValidFaceLevel(int faceIndex, int level) const; 475 bool isFaceLevelComplete(int faceIndex, int level) const; 476 bool isCubeComplete() const; 477 bool isImageComplete(const gl::ImageIndex &index) const override; 478 angle::Result updateStorageFaceLevel(const gl::Context *context, int faceIndex, int level); 479 480 angle::Result redefineImage(const gl::Context *context, 481 int faceIndex, 482 GLint level, 483 GLenum internalformat, 484 const gl::Extents &size, 485 bool forceRelease); 486 487 std::array<gl::TexLevelArray<std::unique_ptr<ImageD3D>>, 6> mImageArray; 488 }; 489 490 class TextureD3D_3D : public TextureD3D 491 { 492 public: 493 TextureD3D_3D(const gl::TextureState &data, RendererD3D *renderer); 494 ~TextureD3D_3D() override; 495 496 void onDestroy(const gl::Context *context) override; 497 498 ImageD3D *getImage(int level, int layer) const; 499 ImageD3D *getImage(const gl::ImageIndex &index) const override; 500 GLsizei getLayerCount(int level) const override; 501 502 GLsizei getWidth(GLint level) const; 503 GLsizei getHeight(GLint level) const; 504 GLsizei getDepth(GLint level) const; 505 GLenum getInternalFormat(GLint level) const; 506 bool isDepth(GLint level) const; 507 bool isSRGB(GLint level) const; 508 509 angle::Result setImage(const gl::Context *context, 510 const gl::ImageIndex &index, 511 GLenum internalFormat, 512 const gl::Extents &size, 513 GLenum format, 514 GLenum type, 515 const gl::PixelUnpackState &unpack, 516 gl::Buffer *unpackBuffer, 517 const uint8_t *pixels) override; 518 angle::Result setSubImage(const gl::Context *context, 519 const gl::ImageIndex &index, 520 const gl::Box &area, 521 GLenum format, 522 GLenum type, 523 const gl::PixelUnpackState &unpack, 524 gl::Buffer *unpackBuffer, 525 const uint8_t *pixels) override; 526 527 angle::Result setCompressedImage(const gl::Context *context, 528 const gl::ImageIndex &index, 529 GLenum internalFormat, 530 const gl::Extents &size, 531 const gl::PixelUnpackState &unpack, 532 size_t imageSize, 533 const uint8_t *pixels) override; 534 angle::Result setCompressedSubImage(const gl::Context *context, 535 const gl::ImageIndex &index, 536 const gl::Box &area, 537 GLenum format, 538 const gl::PixelUnpackState &unpack, 539 size_t imageSize, 540 const uint8_t *pixels) override; 541 542 angle::Result copyImage(const gl::Context *context, 543 const gl::ImageIndex &index, 544 const gl::Rectangle &sourceArea, 545 GLenum internalFormat, 546 gl::Framebuffer *source) override; 547 angle::Result copySubImage(const gl::Context *context, 548 const gl::ImageIndex &index, 549 const gl::Offset &destOffset, 550 const gl::Rectangle &sourceArea, 551 gl::Framebuffer *source) override; 552 553 angle::Result copyTexture(const gl::Context *context, 554 const gl::ImageIndex &index, 555 GLenum internalFormat, 556 GLenum type, 557 GLint sourceLevel, 558 bool unpackFlipY, 559 bool unpackPremultiplyAlpha, 560 bool unpackUnmultiplyAlpha, 561 const gl::Texture *source) override; 562 angle::Result copySubTexture(const gl::Context *context, 563 const gl::ImageIndex &index, 564 const gl::Offset &destOffset, 565 GLint sourceLevel, 566 const gl::Box &sourceBox, 567 bool unpackFlipY, 568 bool unpackPremultiplyAlpha, 569 bool unpackUnmultiplyAlpha, 570 const gl::Texture *source) override; 571 572 angle::Result setStorage(const gl::Context *context, 573 gl::TextureType type, 574 size_t levels, 575 GLenum internalFormat, 576 const gl::Extents &size) override; 577 578 angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; 579 angle::Result releaseTexImage(const gl::Context *context) override; 580 581 angle::Result setEGLImageTarget(const gl::Context *context, 582 gl::TextureType type, 583 egl::Image *image) override; 584 585 angle::Result getRenderTarget(const gl::Context *context, 586 const gl::ImageIndex &index, 587 GLsizei samples, 588 RenderTargetD3D **outRT) override; 589 590 gl::ImageIndexIterator imageIterator() const override; 591 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 592 bool isValidIndex(const gl::ImageIndex &index) const override; 593 594 protected: 595 void markAllImagesDirty() override; 596 GLint getLevelZeroDepth() const override; 597 598 private: 599 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 600 angle::Result createCompleteStorage(const gl::Context *context, 601 BindFlags bindFlags, 602 TexStoragePointer *outStorage) const override; 603 angle::Result setCompleteTexStorage(const gl::Context *context, 604 TextureStorage *newCompleteTexStorage) override; 605 606 angle::Result updateStorage(const gl::Context *context) override; 607 angle::Result initMipmapImages(const gl::Context *context) override; 608 609 bool isValidLevel(int level) const; 610 bool isLevelComplete(int level) const; 611 bool isImageComplete(const gl::ImageIndex &index) const override; 612 angle::Result updateStorageLevel(const gl::Context *context, int level); 613 614 angle::Result redefineImage(const gl::Context *context, 615 GLint level, 616 GLenum internalformat, 617 const gl::Extents &size, 618 bool forceRelease); 619 620 gl::TexLevelArray<std::unique_ptr<ImageD3D>> mImageArray; 621 }; 622 623 class TextureD3D_2DArray : public TextureD3D 624 { 625 public: 626 TextureD3D_2DArray(const gl::TextureState &data, RendererD3D *renderer); 627 ~TextureD3D_2DArray() override; 628 629 void onDestroy(const gl::Context *context) override; 630 631 virtual ImageD3D *getImage(int level, int layer) const; 632 ImageD3D *getImage(const gl::ImageIndex &index) const override; 633 GLsizei getLayerCount(int level) const override; 634 635 GLsizei getWidth(GLint level) const; 636 GLsizei getHeight(GLint level) const; 637 GLenum getInternalFormat(GLint level) const; 638 bool isDepth(GLint level) const; 639 640 angle::Result setImage(const gl::Context *context, 641 const gl::ImageIndex &index, 642 GLenum internalFormat, 643 const gl::Extents &size, 644 GLenum format, 645 GLenum type, 646 const gl::PixelUnpackState &unpack, 647 gl::Buffer *unpackBuffer, 648 const uint8_t *pixels) override; 649 angle::Result setSubImage(const gl::Context *context, 650 const gl::ImageIndex &index, 651 const gl::Box &area, 652 GLenum format, 653 GLenum type, 654 const gl::PixelUnpackState &unpack, 655 gl::Buffer *unpackBuffer, 656 const uint8_t *pixels) override; 657 658 angle::Result setCompressedImage(const gl::Context *context, 659 const gl::ImageIndex &index, 660 GLenum internalFormat, 661 const gl::Extents &size, 662 const gl::PixelUnpackState &unpack, 663 size_t imageSize, 664 const uint8_t *pixels) override; 665 angle::Result setCompressedSubImage(const gl::Context *context, 666 const gl::ImageIndex &index, 667 const gl::Box &area, 668 GLenum format, 669 const gl::PixelUnpackState &unpack, 670 size_t imageSize, 671 const uint8_t *pixels) override; 672 673 angle::Result copyImage(const gl::Context *context, 674 const gl::ImageIndex &index, 675 const gl::Rectangle &sourceArea, 676 GLenum internalFormat, 677 gl::Framebuffer *source) override; 678 angle::Result copySubImage(const gl::Context *context, 679 const gl::ImageIndex &index, 680 const gl::Offset &destOffset, 681 const gl::Rectangle &sourceArea, 682 gl::Framebuffer *source) override; 683 684 angle::Result copyTexture(const gl::Context *context, 685 const gl::ImageIndex &index, 686 GLenum internalFormat, 687 GLenum type, 688 GLint sourceLevel, 689 bool unpackFlipY, 690 bool unpackPremultiplyAlpha, 691 bool unpackUnmultiplyAlpha, 692 const gl::Texture *source) override; 693 angle::Result copySubTexture(const gl::Context *context, 694 const gl::ImageIndex &index, 695 const gl::Offset &destOffset, 696 GLint sourceLevel, 697 const gl::Box &sourceBox, 698 bool unpackFlipY, 699 bool unpackPremultiplyAlpha, 700 bool unpackUnmultiplyAlpha, 701 const gl::Texture *source) override; 702 703 angle::Result setStorage(const gl::Context *context, 704 gl::TextureType type, 705 size_t levels, 706 GLenum internalFormat, 707 const gl::Extents &size) override; 708 709 angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; 710 angle::Result releaseTexImage(const gl::Context *context) override; 711 712 angle::Result setEGLImageTarget(const gl::Context *context, 713 gl::TextureType type, 714 egl::Image *image) override; 715 716 angle::Result getRenderTarget(const gl::Context *context, 717 const gl::ImageIndex &index, 718 GLsizei samples, 719 RenderTargetD3D **outRT) override; 720 721 gl::ImageIndexIterator imageIterator() const override; 722 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 723 bool isValidIndex(const gl::ImageIndex &index) const override; 724 725 protected: 726 void markAllImagesDirty() override; 727 728 private: 729 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 730 angle::Result createCompleteStorage(const gl::Context *context, 731 BindFlags bindFlags, 732 TexStoragePointer *outStorage) const override; 733 angle::Result setCompleteTexStorage(const gl::Context *context, 734 TextureStorage *newCompleteTexStorage) override; 735 736 angle::Result updateStorage(const gl::Context *context) override; 737 angle::Result initMipmapImages(const gl::Context *context) override; 738 739 bool isValidLevel(int level) const; 740 bool isLevelComplete(int level) const; 741 bool isImageComplete(const gl::ImageIndex &index) const override; 742 bool isSRGB(GLint level) const; 743 angle::Result updateStorageLevel(const gl::Context *context, int level); 744 745 void deleteImages(); 746 angle::Result redefineImage(const gl::Context *context, 747 GLint level, 748 GLenum internalformat, 749 const gl::Extents &size, 750 bool forceRelease); 751 752 // Storing images as an array of single depth textures since D3D11 treats each array level of a 753 // Texture2D object as a separate subresource. Each layer would have to be looped over 754 // to update all the texture layers since they cannot all be updated at once and it makes the 755 // most sense for the Image class to not have to worry about layer subresource as well as mip 756 // subresources. 757 GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 758 ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; 759 }; 760 761 // Base class for immutable textures. These don't support manipulation of individual texture images. 762 class TextureD3DImmutableBase : public TextureD3D 763 { 764 public: 765 TextureD3DImmutableBase(const gl::TextureState &data, RendererD3D *renderer); 766 ~TextureD3DImmutableBase() override; 767 768 ImageD3D *getImage(const gl::ImageIndex &index) const override; 769 angle::Result setImage(const gl::Context *context, 770 const gl::ImageIndex &index, 771 GLenum internalFormat, 772 const gl::Extents &size, 773 GLenum format, 774 GLenum type, 775 const gl::PixelUnpackState &unpack, 776 gl::Buffer *unpackBuffer, 777 const uint8_t *pixels) override; 778 angle::Result setSubImage(const gl::Context *context, 779 const gl::ImageIndex &index, 780 const gl::Box &area, 781 GLenum format, 782 GLenum type, 783 const gl::PixelUnpackState &unpack, 784 gl::Buffer *unpackBuffer, 785 const uint8_t *pixels) override; 786 787 angle::Result setCompressedImage(const gl::Context *context, 788 const gl::ImageIndex &index, 789 GLenum internalFormat, 790 const gl::Extents &size, 791 const gl::PixelUnpackState &unpack, 792 size_t imageSize, 793 const uint8_t *pixels) override; 794 angle::Result setCompressedSubImage(const gl::Context *context, 795 const gl::ImageIndex &index, 796 const gl::Box &area, 797 GLenum format, 798 const gl::PixelUnpackState &unpack, 799 size_t imageSize, 800 const uint8_t *pixels) override; 801 802 angle::Result copyImage(const gl::Context *context, 803 const gl::ImageIndex &index, 804 const gl::Rectangle &sourceArea, 805 GLenum internalFormat, 806 gl::Framebuffer *source) override; 807 angle::Result copySubImage(const gl::Context *context, 808 const gl::ImageIndex &index, 809 const gl::Offset &destOffset, 810 const gl::Rectangle &sourceArea, 811 gl::Framebuffer *source) override; 812 813 angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; 814 angle::Result releaseTexImage(const gl::Context *context) override; 815 }; 816 817 class TextureD3D_External : public TextureD3DImmutableBase 818 { 819 public: 820 TextureD3D_External(const gl::TextureState &data, RendererD3D *renderer); 821 ~TextureD3D_External() override; 822 823 GLsizei getLayerCount(int level) const override; 824 825 angle::Result setImageExternal(const gl::Context *context, 826 gl::TextureType type, 827 egl::Stream *stream, 828 const egl::Stream::GLTextureDescription &desc) override; 829 830 angle::Result setEGLImageTarget(const gl::Context *context, 831 gl::TextureType type, 832 egl::Image *image) override; 833 834 angle::Result getRenderTarget(const gl::Context *context, 835 const gl::ImageIndex &index, 836 GLsizei samples, 837 RenderTargetD3D **outRT) override; 838 839 gl::ImageIndexIterator imageIterator() const override; 840 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 841 bool isValidIndex(const gl::ImageIndex &index) const override; 842 843 protected: 844 void markAllImagesDirty() override; 845 846 private: 847 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 848 angle::Result createCompleteStorage(const gl::Context *context, 849 BindFlags bindFlags, 850 TexStoragePointer *outTexStorage) const override; 851 angle::Result setCompleteTexStorage(const gl::Context *context, 852 TextureStorage *newCompleteTexStorage) override; 853 854 angle::Result updateStorage(const gl::Context *context) override; 855 angle::Result initMipmapImages(const gl::Context *context) override; 856 857 bool isImageComplete(const gl::ImageIndex &index) const override; 858 }; 859 860 class TextureD3D_2DMultisample : public TextureD3DImmutableBase 861 { 862 public: 863 TextureD3D_2DMultisample(const gl::TextureState &data, RendererD3D *renderer); 864 ~TextureD3D_2DMultisample() override; 865 866 angle::Result setStorageMultisample(const gl::Context *context, 867 gl::TextureType type, 868 GLsizei samples, 869 GLint internalformat, 870 const gl::Extents &size, 871 bool fixedSampleLocations) override; 872 873 angle::Result setEGLImageTarget(const gl::Context *context, 874 gl::TextureType type, 875 egl::Image *image) override; 876 877 angle::Result getRenderTarget(const gl::Context *context, 878 const gl::ImageIndex &index, 879 GLsizei samples, 880 RenderTargetD3D **outRT) override; 881 882 gl::ImageIndexIterator imageIterator() const override; 883 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 884 bool isValidIndex(const gl::ImageIndex &index) const override; 885 886 GLsizei getLayerCount(int level) const override; 887 888 protected: 889 void markAllImagesDirty() override; 890 891 angle::Result setCompleteTexStorage(const gl::Context *context, 892 TextureStorage *newCompleteTexStorage) override; 893 894 angle::Result updateStorage(const gl::Context *context) override; 895 896 private: 897 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 898 angle::Result createCompleteStorage(const gl::Context *context, 899 BindFlags bindFlags, 900 TexStoragePointer *outTexStorage) const override; 901 angle::Result initMipmapImages(const gl::Context *context) override; 902 903 bool isImageComplete(const gl::ImageIndex &index) const override; 904 }; 905 906 class TextureD3D_2DMultisampleArray : public TextureD3DImmutableBase 907 { 908 public: 909 TextureD3D_2DMultisampleArray(const gl::TextureState &data, RendererD3D *renderer); 910 ~TextureD3D_2DMultisampleArray() override; 911 912 angle::Result setStorageMultisample(const gl::Context *context, 913 gl::TextureType type, 914 GLsizei samples, 915 GLint internalformat, 916 const gl::Extents &size, 917 bool fixedSampleLocations) override; 918 919 angle::Result setEGLImageTarget(const gl::Context *context, 920 gl::TextureType type, 921 egl::Image *image) override; 922 923 angle::Result getRenderTarget(const gl::Context *context, 924 const gl::ImageIndex &index, 925 GLsizei samples, 926 RenderTargetD3D **outRT) override; 927 928 gl::ImageIndexIterator imageIterator() const override; 929 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 930 bool isValidIndex(const gl::ImageIndex &index) const override; 931 932 GLsizei getLayerCount(int level) const override; 933 934 protected: 935 void markAllImagesDirty() override; 936 937 angle::Result setCompleteTexStorage(const gl::Context *context, 938 TextureStorage *newCompleteTexStorage) override; 939 940 angle::Result updateStorage(const gl::Context *context) override; 941 942 private: 943 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 944 angle::Result createCompleteStorage(const gl::Context *context, 945 BindFlags bindFlags, 946 TexStoragePointer *outTexStorage) const override; 947 angle::Result initMipmapImages(const gl::Context *context) override; 948 949 bool isImageComplete(const gl::ImageIndex &index) const override; 950 951 GLsizei mLayerCount; 952 }; 953 954 class TextureD3D_Buffer : public TextureD3D 955 { 956 public: 957 TextureD3D_Buffer(const gl::TextureState &data, RendererD3D *renderer); 958 ~TextureD3D_Buffer() override; 959 960 ImageD3D *getImage(const gl::ImageIndex &index) const override; 961 962 angle::Result setBuffer(const gl::Context *context, GLenum internalFormat) override; 963 964 angle::Result setImage(const gl::Context *context, 965 const gl::ImageIndex &index, 966 GLenum internalFormat, 967 const gl::Extents &size, 968 GLenum format, 969 GLenum type, 970 const gl::PixelUnpackState &unpack, 971 gl::Buffer *unpackBuffer, 972 const uint8_t *pixels) override; 973 angle::Result setSubImage(const gl::Context *context, 974 const gl::ImageIndex &index, 975 const gl::Box &area, 976 GLenum format, 977 GLenum type, 978 const gl::PixelUnpackState &unpack, 979 gl::Buffer *unpackBuffer, 980 const uint8_t *pixels) override; 981 982 angle::Result setCompressedImage(const gl::Context *context, 983 const gl::ImageIndex &index, 984 GLenum internalFormat, 985 const gl::Extents &size, 986 const gl::PixelUnpackState &unpack, 987 size_t imageSize, 988 const uint8_t *pixels) override; 989 angle::Result setCompressedSubImage(const gl::Context *context, 990 const gl::ImageIndex &index, 991 const gl::Box &area, 992 GLenum format, 993 const gl::PixelUnpackState &unpack, 994 size_t imageSize, 995 const uint8_t *pixels) override; 996 997 angle::Result copyImage(const gl::Context *context, 998 const gl::ImageIndex &index, 999 const gl::Rectangle &sourceArea, 1000 GLenum internalFormat, 1001 gl::Framebuffer *source) override; 1002 angle::Result copySubImage(const gl::Context *context, 1003 const gl::ImageIndex &index, 1004 const gl::Offset &destOffset, 1005 const gl::Rectangle &sourceArea, 1006 gl::Framebuffer *source) override; 1007 1008 angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override; 1009 angle::Result releaseTexImage(const gl::Context *context) override; 1010 1011 angle::Result setEGLImageTarget(const gl::Context *context, 1012 gl::TextureType type, 1013 egl::Image *image) override; 1014 1015 angle::Result getRenderTarget(const gl::Context *context, 1016 const gl::ImageIndex &index, 1017 GLsizei samples, 1018 RenderTargetD3D **outRT) override; 1019 1020 GLsizei getLayerCount(int level) const override; 1021 1022 angle::Result syncState(const gl::Context *context, 1023 const gl::Texture::DirtyBits &dirtyBits, 1024 gl::Command source) override; 1025 1026 gl::ImageIndexIterator imageIterator() const override; 1027 gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override; 1028 bool isValidIndex(const gl::ImageIndex &index) const override; 1029 1030 protected: 1031 void markAllImagesDirty() override; 1032 1033 private: 1034 angle::Result initializeStorage(const gl::Context *context, BindFlags bindFlags) override; 1035 angle::Result createCompleteStorage(const gl::Context *context, 1036 BindFlags bindFlags, 1037 TexStoragePointer *outTexStorage) const override; 1038 angle::Result setCompleteTexStorage(const gl::Context *context, 1039 TextureStorage *newCompleteTexStorage) override; 1040 1041 angle::Result updateStorage(const gl::Context *context) override; 1042 angle::Result initMipmapImages(const gl::Context *context) override; 1043 1044 bool isImageComplete(const gl::ImageIndex &index) const override; 1045 1046 GLenum mInternalFormat; 1047 }; 1048 } // namespace rx 1049 1050 #endif // LIBANGLE_RENDERER_D3D_TEXTURED3D_H_