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