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