| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/texture_manager.h" | 5 #include "gpu/command_buffer/service/texture_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 memory_tracking_ref_ = *refs_.begin(); | 415 memory_tracking_ref_ = *refs_.begin(); |
| 416 GetMemTracker()->TrackMemAlloc(estimated_size()); | 416 GetMemTracker()->TrackMemAlloc(estimated_size()); |
| 417 } | 417 } |
| 418 } | 418 } |
| 419 | 419 |
| 420 MemoryTypeTracker* Texture::GetMemTracker() { | 420 MemoryTypeTracker* Texture::GetMemTracker() { |
| 421 DCHECK(memory_tracking_ref_); | 421 DCHECK(memory_tracking_ref_); |
| 422 return memory_tracking_ref_->manager()->GetMemTracker(); | 422 return memory_tracking_ref_->manager()->GetMemTracker(); |
| 423 } | 423 } |
| 424 | 424 |
| 425 Texture::LayerInfo::LayerInfo() |
| 426 : image_state(UNBOUND), |
| 427 layer(0) {} |
| 428 |
| 429 Texture::LayerInfo::LayerInfo(const LayerInfo& rhs) |
| 430 : image(rhs.image), |
| 431 image_state(rhs.image_state), |
| 432 layer(rhs.layer) {} |
| 433 |
| 434 Texture::LayerInfo::~LayerInfo() { |
| 435 } |
| 436 |
| 425 Texture::LevelInfo::LevelInfo() | 437 Texture::LevelInfo::LevelInfo() |
| 426 : target(0), | 438 : target(0), |
| 427 level(-1), | 439 level(-1), |
| 428 internal_format(0), | 440 internal_format(0), |
| 429 width(0), | 441 width(0), |
| 430 height(0), | 442 height(0), |
| 431 depth(0), | 443 depth(0), |
| 432 border(0), | 444 border(0), |
| 433 format(0), | 445 format(0), |
| 434 type(0), | 446 type(0), |
| 435 image_state(UNBOUND), | |
| 436 estimated_size(0), | 447 estimated_size(0), |
| 437 internal_workaround(false) {} | 448 internal_workaround(false), |
| 449 num_uncleared_layers(0) {} |
| 438 | 450 |
| 439 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) | 451 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) |
| 440 : cleared_rect(rhs.cleared_rect), | 452 : target(rhs.target), |
| 441 target(rhs.target), | |
| 442 level(rhs.level), | 453 level(rhs.level), |
| 443 internal_format(rhs.internal_format), | 454 internal_format(rhs.internal_format), |
| 444 width(rhs.width), | 455 width(rhs.width), |
| 445 height(rhs.height), | 456 height(rhs.height), |
| 446 depth(rhs.depth), | 457 depth(rhs.depth), |
| 447 border(rhs.border), | 458 border(rhs.border), |
| 448 format(rhs.format), | 459 format(rhs.format), |
| 449 type(rhs.type), | 460 type(rhs.type), |
| 450 image(rhs.image), | |
| 451 image_state(rhs.image_state), | |
| 452 estimated_size(rhs.estimated_size), | 461 estimated_size(rhs.estimated_size), |
| 453 internal_workaround(rhs.internal_workaround) {} | 462 internal_workaround(rhs.internal_workaround), |
| 463 num_uncleared_layers(rhs.num_uncleared_layers) { |
| 464 GLint layers = rhs.layer_infos.size(); |
| 465 layer_infos.resize(layers); |
| 466 for (int jj = 0; jj < layers; ++jj) { |
| 467 layer_infos[jj].cleared_rect = rhs.layer_infos[jj].cleared_rect; |
| 468 layer_infos[jj].image = rhs.layer_infos[jj].image; |
| 469 layer_infos[jj].image_state = rhs.layer_infos[jj].image_state; |
| 470 } |
| 471 } |
| 454 | 472 |
| 455 Texture::LevelInfo::~LevelInfo() { | 473 Texture::LevelInfo::~LevelInfo() { |
| 456 } | 474 } |
| 457 | 475 |
| 458 Texture::FaceInfo::FaceInfo() | 476 Texture::FaceInfo::FaceInfo() |
| 459 : num_mip_levels(0) { | 477 : num_mip_levels(0) { |
| 460 } | 478 } |
| 461 | 479 |
| 462 Texture::FaceInfo::FaceInfo(const FaceInfo& other) = default; | 480 Texture::FaceInfo::FaceInfo(const FaceInfo& other) = default; |
| 463 | 481 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 } | 575 } |
| 558 } | 576 } |
| 559 | 577 |
| 560 return true; | 578 return true; |
| 561 } | 579 } |
| 562 | 580 |
| 563 void Texture::AddToSignature( | 581 void Texture::AddToSignature( |
| 564 const FeatureInfo* feature_info, | 582 const FeatureInfo* feature_info, |
| 565 GLenum target, | 583 GLenum target, |
| 566 GLint level, | 584 GLint level, |
| 585 GLint layer, |
| 567 std::string* signature) const { | 586 std::string* signature) const { |
| 568 DCHECK(feature_info); | 587 DCHECK(feature_info); |
| 569 DCHECK(signature); | 588 DCHECK(signature); |
| 570 DCHECK_GE(level, 0); | 589 DCHECK_GE(level, 0); |
| 571 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 590 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 572 DCHECK_LT(static_cast<size_t>(face_index), | 591 DCHECK_LT(static_cast<size_t>(face_index), |
| 573 face_infos_.size()); | 592 face_infos_.size()); |
| 574 DCHECK_LT(static_cast<size_t>(level), | 593 DCHECK_LT(static_cast<size_t>(level), |
| 575 face_infos_[face_index].level_infos.size()); | 594 face_infos_[face_index].level_infos.size()); |
| 595 DCHECK_LT(static_cast<size_t>(layer), |
| 596 face_infos_[face_index].level_infos[level].layer_infos.size()); |
| 576 | 597 |
| 577 const Texture::LevelInfo& info = | 598 const Texture::LevelInfo& level_info = |
| 578 face_infos_[face_index].level_infos[level]; | 599 face_infos_[face_index].level_infos[level]; |
| 600 const Texture::LayerInfo& layer_info = level_info.layer_infos[layer]; |
| 579 | 601 |
| 580 TextureSignature signature_data(target, | 602 TextureSignature signature_data(target, |
| 581 level, | 603 level, |
| 582 sampler_state_, | 604 sampler_state_, |
| 583 usage_, | 605 usage_, |
| 584 info.internal_format, | 606 level_info.internal_format, |
| 585 info.width, | 607 level_info.width, |
| 586 info.height, | 608 level_info.height, |
| 587 info.depth, | 609 level_info.depth, |
| 588 base_level_, | 610 base_level_, |
| 589 info.border, | 611 level_info.border, |
| 590 max_level_, | 612 max_level_, |
| 591 info.format, | 613 level_info.format, |
| 592 info.type, | 614 level_info.type, |
| 593 info.image.get() != NULL, | 615 layer_info.image.get() != NULL, |
| 594 CanRender(feature_info), | 616 CanRender(feature_info), |
| 595 CanRenderTo(feature_info, level), | 617 CanRenderTo(feature_info, level), |
| 596 npot_, | 618 npot_, |
| 597 emulating_rgb_); | 619 emulating_rgb_); |
| 598 | 620 |
| 599 signature->append(TextureTag, sizeof(TextureTag)); | 621 signature->append(TextureTag, sizeof(TextureTag)); |
| 600 signature->append(reinterpret_cast<const char*>(&signature_data), | 622 signature->append(reinterpret_cast<const char*>(&signature_data), |
| 601 sizeof(signature_data)); | 623 sizeof(signature_data)); |
| 602 } | 624 } |
| 603 | 625 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 622 width = std::max(1, width >> 1); | 644 width = std::max(1, width >> 1); |
| 623 height = std::max(1, height >> 1); | 645 height = std::max(1, height >> 1); |
| 624 depth = target == GL_TEXTURE_2D_ARRAY ? depth : std::max(1, depth >> 1); | 646 depth = target == GL_TEXTURE_2D_ARRAY ? depth : std::max(1, depth >> 1); |
| 625 SetLevelInfo(target, level, level0_info.internal_format, | 647 SetLevelInfo(target, level, level0_info.internal_format, |
| 626 width, height, depth, level0_info.border, level0_info.format, | 648 width, height, depth, level0_info.border, level0_info.format, |
| 627 level0_info.type, gfx::Rect(width, height)); | 649 level0_info.type, gfx::Rect(width, height)); |
| 628 } | 650 } |
| 629 } | 651 } |
| 630 } | 652 } |
| 631 | 653 |
| 632 void Texture::SetTarget(GLenum target, GLint max_levels) { | 654 void Texture::SetTarget(GLenum target, GLint max_levels, GLint layers) { |
| 633 DCHECK_EQ(0u, target_); // you can only set this once. | 655 DCHECK_EQ(0u, target_); // you can only set this once. |
| 634 target_ = target; | 656 target_ = target; |
| 635 size_t num_faces = (target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; | 657 size_t num_faces = (target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; |
| 636 face_infos_.resize(num_faces); | 658 face_infos_.resize(num_faces); |
| 637 for (size_t ii = 0; ii < num_faces; ++ii) { | 659 for (size_t ii = 0; ii < num_faces; ++ii) { |
| 638 face_infos_[ii].level_infos.resize(max_levels); | 660 face_infos_[ii].level_infos.resize(max_levels); |
| 661 for (int jj = 0; jj < max_levels; ++jj) { |
| 662 Texture::LevelInfo& level_info = face_infos_[ii].level_infos[jj]; |
| 663 level_info.layer_infos.resize(layers); |
| 664 level_info.num_uncleared_layers = 0; |
| 665 for (int kk = 0; kk < layers; ++kk) |
| 666 level_info.layer_infos[kk].image_state = UNBOUND; |
| 667 } |
| 639 } | 668 } |
| 640 | 669 |
| 641 if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ARB) { | 670 if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ARB) { |
| 642 sampler_state_.min_filter = GL_LINEAR; | 671 sampler_state_.min_filter = GL_LINEAR; |
| 643 sampler_state_.wrap_s = sampler_state_.wrap_t = GL_CLAMP_TO_EDGE; | 672 sampler_state_.wrap_s = sampler_state_.wrap_t = GL_CLAMP_TO_EDGE; |
| 644 } | 673 } |
| 645 | 674 |
| 646 if (target == GL_TEXTURE_EXTERNAL_OES) { | 675 if (target == GL_TEXTURE_EXTERNAL_OES) { |
| 647 immutable_ = true; | 676 immutable_ = true; |
| 648 } | 677 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 669 return false; | 698 return false; |
| 670 } | 699 } |
| 671 | 700 |
| 672 if (!Texture::ColorRenderable(feature_info, base.internal_format) || | 701 if (!Texture::ColorRenderable(feature_info, base.internal_format) || |
| 673 !Texture::TextureFilterable( | 702 !Texture::TextureFilterable( |
| 674 feature_info, base.internal_format, base.type)) { | 703 feature_info, base.internal_format, base.type)) { |
| 675 return false; | 704 return false; |
| 676 } | 705 } |
| 677 | 706 |
| 678 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { | 707 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { |
| 679 const LevelInfo& info = face_infos_[ii].level_infos[base_level_]; | 708 const LevelInfo& level_info = face_infos_[ii].level_infos[base_level_]; |
| 680 if ((info.target == 0) || | 709 if ((level_info.target == 0) || |
| 681 feature_info->validators()->compressed_texture_format.IsValid( | 710 feature_info->validators()->compressed_texture_format.IsValid( |
| 682 info.internal_format) || | 711 level_info.internal_format)) { |
| 683 info.image.get()) { | |
| 684 return false; | 712 return false; |
| 685 } | 713 } |
| 714 for (size_t jj = 0; jj < level_info.layer_infos.size(); ++jj) { |
| 715 if ( level_info.layer_infos[jj].image.get()) { |
| 716 return false; |
| 717 } |
| 718 } |
| 686 } | 719 } |
| 687 if (face_infos_.size() == 6 && !cube_complete_) { | 720 if (face_infos_.size() == 6 && !cube_complete_) { |
| 688 return false; | 721 return false; |
| 689 } | 722 } |
| 690 return true; | 723 return true; |
| 691 } | 724 } |
| 692 | 725 |
| 693 bool Texture::TextureIsNPOT(GLsizei width, | 726 bool Texture::TextureIsNPOT(GLsizei width, |
| 694 GLsizei height, | 727 GLsizei height, |
| 695 GLsizei depth) { | 728 GLsizei depth) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 // GL_HALF_FLOAT is ES3 only and should only be used with sized formats. | 805 // GL_HALF_FLOAT is ES3 only and should only be used with sized formats. |
| 773 return true; | 806 return true; |
| 774 } | 807 } |
| 775 } | 808 } |
| 776 return feature_info->validators()-> | 809 return feature_info->validators()-> |
| 777 texture_sized_texture_filterable_internal_format.IsValid(internal_format); | 810 texture_sized_texture_filterable_internal_format.IsValid(internal_format); |
| 778 } | 811 } |
| 779 | 812 |
| 780 void Texture::SetLevelClearedRect(GLenum target, | 813 void Texture::SetLevelClearedRect(GLenum target, |
| 781 GLint level, | 814 GLint level, |
| 815 GLint layer, |
| 782 const gfx::Rect& cleared_rect) { | 816 const gfx::Rect& cleared_rect) { |
| 783 DCHECK_GE(level, 0); | 817 DCHECK_GE(level, 0); |
| 818 DCHECK_GE(layer, 0); |
| 784 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 819 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 785 DCHECK_LT(static_cast<size_t>(face_index), | 820 DCHECK_LT(static_cast<size_t>(face_index), |
| 786 face_infos_.size()); | 821 face_infos_.size()); |
| 787 DCHECK_LT(static_cast<size_t>(level), | 822 DCHECK_LT(static_cast<size_t>(level), |
| 788 face_infos_[face_index].level_infos.size()); | 823 face_infos_[face_index].level_infos.size()); |
| 824 DCHECK_LT(static_cast<size_t>(layer), |
| 825 face_infos_[face_index].level_infos[level].layer_infos.size()); |
| 789 Texture::LevelInfo& info = | 826 Texture::LevelInfo& info = |
| 790 face_infos_[face_index].level_infos[level]; | 827 face_infos_[face_index].level_infos[level]; |
| 791 UpdateMipCleared(&info, info.width, info.height, cleared_rect); | 828 UpdateMipCleared(&info, info.width, info.height, cleared_rect, layer); |
| 792 UpdateCleared(); | 829 UpdateCleared(); |
| 793 } | 830 } |
| 794 | 831 |
| 795 void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) { | 832 void Texture::SetLevelCleared(GLenum target, |
| 833 GLint level, |
| 834 GLint layer, |
| 835 bool cleared) { |
| 796 DCHECK_GE(level, 0); | 836 DCHECK_GE(level, 0); |
| 837 DCHECK_GE(layer, 0); |
| 797 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 838 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 798 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); | 839 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); |
| 799 DCHECK_LT(static_cast<size_t>(level), | 840 DCHECK_LT(static_cast<size_t>(level), |
| 800 face_infos_[face_index].level_infos.size()); | 841 face_infos_[face_index].level_infos.size()); |
| 801 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 842 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; |
| 802 UpdateMipCleared(&info, info.width, info.height, | 843 UpdateMipCleared(&info, info.width, info.height, |
| 803 cleared ? gfx::Rect(info.width, info.height) : gfx::Rect()); | 844 cleared ? gfx::Rect(info.width, info.height) : gfx::Rect(), |
| 845 layer); |
| 804 UpdateCleared(); | 846 UpdateCleared(); |
| 805 } | 847 } |
| 806 | 848 |
| 807 void Texture::UpdateCleared() { | 849 void Texture::UpdateCleared() { |
| 808 if (face_infos_.empty()) { | 850 if (face_infos_.empty()) { |
| 809 return; | 851 return; |
| 810 } | 852 } |
| 811 | 853 |
| 812 const bool cleared = (num_uncleared_mips_ == 0); | 854 const bool cleared = (num_uncleared_mips_ == 0); |
| 813 | 855 |
| 814 // If texture is uncleared and is attached to a framebuffer, | 856 // If texture is uncleared and is attached to a framebuffer, |
| 815 // that framebuffer must be marked possibly incomplete. | 857 // that framebuffer must be marked possibly incomplete. |
| 816 if (!cleared && IsAttachedToFramebuffer()) { | 858 if (!cleared && IsAttachedToFramebuffer()) { |
| 817 IncAllFramebufferStateChangeCount(); | 859 IncAllFramebufferStateChangeCount(); |
| 818 } | 860 } |
| 819 | 861 |
| 820 UpdateSafeToRenderFrom(cleared); | 862 UpdateSafeToRenderFrom(cleared); |
| 821 } | 863 } |
| 822 | 864 |
| 823 void Texture::UpdateSafeToRenderFrom(bool cleared) { | 865 void Texture::UpdateSafeToRenderFrom(bool cleared) { |
| 824 if (cleared_ == cleared) | 866 if (cleared_ == cleared) |
| 825 return; | 867 return; |
| 826 cleared_ = cleared; | 868 cleared_ = cleared; |
| 827 int delta = cleared ? -1 : +1; | 869 int delta = cleared ? -1 : +1; |
| 828 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 870 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
| 829 (*it)->manager()->UpdateSafeToRenderFrom(delta); | 871 (*it)->manager()->UpdateSafeToRenderFrom(delta); |
| 830 } | 872 } |
| 831 | 873 |
| 874 void Texture::UpdateMipClearedHelper(LevelInfo* info) { |
| 875 int layers = info->layer_infos.size(); |
| 876 const gfx::Rect cleared_rect = info->layer_infos[0].cleared_rect; |
| 877 for (int ii = 1; ii < layers; ++ii) { |
| 878 info->layer_infos[ii].cleared_rect = cleared_rect; |
| 879 } |
| 880 } |
| 881 |
| 832 void Texture::UpdateMipCleared(LevelInfo* info, | 882 void Texture::UpdateMipCleared(LevelInfo* info, |
| 833 GLsizei width, | 883 GLsizei width, |
| 834 GLsizei height, | 884 GLsizei height, |
| 835 const gfx::Rect& cleared_rect) { | 885 const gfx::Rect& cleared_rect, |
| 836 bool was_cleared = info->cleared_rect == gfx::Rect(info->width, info->height); | 886 GLint layer) { |
| 887 bool was_cleared = info->layer_infos[layer].cleared_rect == |
| 888 gfx::Rect(info->width, info->height); |
| 837 info->width = width; | 889 info->width = width; |
| 838 info->height = height; | 890 info->height = height; |
| 839 info->cleared_rect = cleared_rect; | 891 info->layer_infos[layer].cleared_rect = cleared_rect; |
| 840 bool cleared = info->cleared_rect == gfx::Rect(info->width, info->height); | 892 bool cleared = info->layer_infos[layer].cleared_rect == |
| 893 gfx::Rect(info->width, info->height); |
| 841 if (cleared == was_cleared) | 894 if (cleared == was_cleared) |
| 842 return; | 895 return; |
| 843 int delta = cleared ? -1 : +1; | 896 int delta = cleared ? -1 : +1; |
| 844 num_uncleared_mips_ += delta; | 897 if (info->num_uncleared_layers == 0 || |
| 845 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 898 info->num_uncleared_layers + delta == 0) { |
| 846 (*it)->manager()->UpdateUnclearedMips(delta); | 899 num_uncleared_mips_ += delta; |
| 900 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
| 901 (*it)->manager()->UpdateUnclearedMips(delta); |
| 902 } |
| 903 info->num_uncleared_layers += delta; |
| 847 } | 904 } |
| 848 | 905 |
| 849 void Texture::UpdateCanRenderCondition() { | 906 void Texture::UpdateCanRenderCondition() { |
| 850 can_render_condition_ = GetCanRenderCondition(); | 907 can_render_condition_ = GetCanRenderCondition(); |
| 851 } | 908 } |
| 852 | 909 |
| 853 void Texture::UpdateHasImages() { | 910 void Texture::UpdateHasImages() { |
| 854 if (face_infos_.empty()) | 911 if (face_infos_.empty()) |
| 855 return; | 912 return; |
| 856 | 913 |
| 857 bool has_images = false; | 914 bool has_images = false; |
| 858 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { | 915 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { |
| 859 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) { | 916 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) { |
| 860 const Texture::LevelInfo& info = face_infos_[ii].level_infos[jj]; | 917 const Texture::LevelInfo& level_info = face_infos_[ii].level_infos[jj]; |
| 861 if (info.image.get() != NULL) { | 918 for (size_t kk = 0; kk < level_info.layer_infos.size(); ++kk) { |
| 862 has_images = true; | 919 if (level_info.layer_infos[kk].image.get() != NULL) { |
| 863 break; | 920 has_images = true; |
| 921 break; |
| 922 } |
| 864 } | 923 } |
| 865 } | 924 } |
| 866 } | 925 } |
| 867 | 926 |
| 868 if (has_images_ == has_images) | 927 if (has_images_ == has_images) |
| 869 return; | 928 return; |
| 870 has_images_ = has_images; | 929 has_images_ = has_images; |
| 871 int delta = has_images ? +1 : -1; | 930 int delta = has_images ? +1 : -1; |
| 872 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 931 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
| 873 (*it)->manager()->UpdateNumImages(delta); | 932 (*it)->manager()->UpdateNumImages(delta); |
| 874 } | 933 } |
| 875 | 934 |
| 876 void Texture::UpdateEmulatingRGB() { | 935 void Texture::UpdateEmulatingRGB() { |
| 877 for (const FaceInfo& face_info : face_infos_) { | 936 for (const FaceInfo& face_info : face_infos_) { |
| 878 for (const LevelInfo& level_info : face_info.level_infos) { | 937 for (const LevelInfo& level_info : face_info.level_infos) { |
| 879 if (level_info.image && level_info.image->EmulatingRGB()) { | 938 for (const LayerInfo& layer_info : level_info.layer_infos) { |
| 880 emulating_rgb_ = true; | 939 if (layer_info.image && layer_info.image->EmulatingRGB()) { |
| 881 return; | 940 emulating_rgb_ = true; |
| 941 return; |
| 942 } |
| 882 } | 943 } |
| 883 } | 944 } |
| 884 } | 945 } |
| 885 emulating_rgb_ = false; | 946 emulating_rgb_ = false; |
| 886 } | 947 } |
| 887 | 948 |
| 888 | 949 |
| 889 void Texture::IncAllFramebufferStateChangeCount() { | 950 void Texture::IncAllFramebufferStateChangeCount() { |
| 890 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 951 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
| 891 (*it)->manager()->IncFramebufferStateChangeCount(); | 952 (*it)->manager()->IncFramebufferStateChangeCount(); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 GLint border, | 996 GLint border, |
| 936 GLenum format, | 997 GLenum format, |
| 937 GLenum type, | 998 GLenum type, |
| 938 const gfx::Rect& cleared_rect) { | 999 const gfx::Rect& cleared_rect) { |
| 939 DCHECK_GE(level, 0); | 1000 DCHECK_GE(level, 0); |
| 940 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1001 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 941 DCHECK_LT(static_cast<size_t>(face_index), | 1002 DCHECK_LT(static_cast<size_t>(face_index), |
| 942 face_infos_.size()); | 1003 face_infos_.size()); |
| 943 DCHECK_LT(static_cast<size_t>(level), | 1004 DCHECK_LT(static_cast<size_t>(level), |
| 944 face_infos_[face_index].level_infos.size()); | 1005 face_infos_[face_index].level_infos.size()); |
| 1006 DCHECK_LE(static_cast<size_t>(depth), |
| 1007 face_infos_[face_index].level_infos[level].layer_infos.size()); |
| 945 DCHECK_GE(width, 0); | 1008 DCHECK_GE(width, 0); |
| 946 DCHECK_GE(height, 0); | 1009 DCHECK_GE(height, 0); |
| 947 DCHECK_GE(depth, 0); | 1010 DCHECK_GE(depth, 0); |
| 948 Texture::LevelInfo& info = | 1011 Texture::LevelInfo& info = |
| 949 face_infos_[face_index].level_infos[level]; | 1012 face_infos_[face_index].level_infos[level]; |
| 950 | 1013 |
| 951 // Update counters only if any attributes have changed. Counters are | 1014 // Update counters only if any attributes have changed. Counters are |
| 952 // comparisons between the old and new values so it must be done before any | 1015 // comparisons between the old and new values so it must be done before any |
| 953 // assignment has been done to the LevelInfo. | 1016 // assignment has been done to the LevelInfo. |
| 954 if (info.target != target || | 1017 if (info.target != target || |
| (...skipping 20 matching lines...) Expand all Loading... |
| 975 texture_mips_dirty_ = true; | 1038 texture_mips_dirty_ = true; |
| 976 } | 1039 } |
| 977 | 1040 |
| 978 info.target = target; | 1041 info.target = target; |
| 979 info.level = level; | 1042 info.level = level; |
| 980 info.internal_format = internal_format; | 1043 info.internal_format = internal_format; |
| 981 info.depth = depth; | 1044 info.depth = depth; |
| 982 info.border = border; | 1045 info.border = border; |
| 983 info.format = format; | 1046 info.format = format; |
| 984 info.type = type; | 1047 info.type = type; |
| 985 info.image = 0; | 1048 info.layer_infos[depth - 1].image = 0; |
| 986 info.stream_texture_image = 0; | 1049 info.layer_infos[depth - 1].stream_texture_image = 0; |
| 987 info.image_state = UNBOUND; | 1050 info.layer_infos[depth - 1].image_state = UNBOUND; |
| 988 info.internal_workaround = false; | 1051 info.internal_workaround = false; |
| 989 | 1052 |
| 990 UpdateMipCleared(&info, width, height, cleared_rect); | 1053 // UpdateMipCleared(&info, width, height, cleared_rect, depth - 1); |
| 1054 UpdateMipCleared(&info, width, height, cleared_rect, 0); |
| 1055 if (target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) { |
| 1056 // UpdateMipClearedHelper(&info); |
| 1057 for (int i = 1; i < depth; ++i) { |
| 1058 UpdateMipCleared(&info, width, height, cleared_rect, i); |
| 1059 } |
| 1060 } |
| 991 | 1061 |
| 992 estimated_size_ -= info.estimated_size; | 1062 estimated_size_ -= info.estimated_size; |
| 993 GLES2Util::ComputeImageDataSizes( | 1063 GLES2Util::ComputeImageDataSizes( |
| 994 width, height, depth, format, type, 4, &info.estimated_size, NULL, NULL); | 1064 width, height, depth, format, type, 4, &info.estimated_size, NULL, NULL); |
| 995 estimated_size_ += info.estimated_size; | 1065 estimated_size_ += info.estimated_size; |
| 996 | 1066 |
| 997 max_level_set_ = std::max(max_level_set_, level); | 1067 max_level_set_ = std::max(max_level_set_, level); |
| 998 Update(); | 1068 Update(); |
| 999 UpdateCleared(); | 1069 UpdateCleared(); |
| 1000 UpdateCanRenderCondition(); | 1070 UpdateCanRenderCondition(); |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1349 if (cleared_) { | 1419 if (cleared_) { |
| 1350 return true; | 1420 return true; |
| 1351 } | 1421 } |
| 1352 | 1422 |
| 1353 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { | 1423 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { |
| 1354 const Texture::FaceInfo& face_info = face_infos_[ii]; | 1424 const Texture::FaceInfo& face_info = face_infos_[ii]; |
| 1355 for (GLint jj = base_level_; | 1425 for (GLint jj = base_level_; |
| 1356 jj < base_level_ + face_info.num_mip_levels; ++jj) { | 1426 jj < base_level_ + face_info.num_mip_levels; ++jj) { |
| 1357 const Texture::LevelInfo& info = face_info.level_infos[jj]; | 1427 const Texture::LevelInfo& info = face_info.level_infos[jj]; |
| 1358 if (info.target != 0) { | 1428 if (info.target != 0) { |
| 1359 if (!ClearLevel(decoder, info.target, jj)) { | 1429 if (!ClearLevel(decoder, info.target, jj, 0)) { |
| 1360 return false; | 1430 return false; |
| 1361 } | 1431 } |
| 1362 } | 1432 } |
| 1363 } | 1433 } |
| 1364 } | 1434 } |
| 1365 UpdateSafeToRenderFrom(true); | 1435 UpdateSafeToRenderFrom(true); |
| 1366 return true; | 1436 return true; |
| 1367 } | 1437 } |
| 1368 | 1438 |
| 1369 GLint Texture::GetImmutableLevels() const { | 1439 GLint Texture::GetImmutableLevels() const { |
| 1370 if (!immutable_) | 1440 if (!immutable_) |
| 1371 return 0; | 1441 return 0; |
| 1372 GLint levels = 0; | 1442 GLint levels = 0; |
| 1373 if (immutable_) { | 1443 if (immutable_) { |
| 1374 DCHECK(face_infos_.size() > 0); | 1444 DCHECK(face_infos_.size() > 0); |
| 1375 for (size_t ii = 0; ii < face_infos_[0].level_infos.size(); ++ii) { | 1445 for (size_t ii = 0; ii < face_infos_[0].level_infos.size(); ++ii) { |
| 1376 const Texture::LevelInfo& info = face_infos_[0].level_infos[ii]; | 1446 const Texture::LevelInfo& info = face_infos_[0].level_infos[ii]; |
| 1377 if (info.target != 0) | 1447 if (info.target != 0) |
| 1378 levels++; | 1448 levels++; |
| 1379 } | 1449 } |
| 1380 } | 1450 } |
| 1381 return levels; | 1451 return levels; |
| 1382 } | 1452 } |
| 1383 | 1453 |
| 1384 gfx::Rect Texture::GetLevelClearedRect(GLenum target, GLint level) const { | 1454 gfx::Rect Texture::GetLevelClearedRect(GLenum target, |
| 1455 GLint level, |
| 1456 GLint layer) const { |
| 1385 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1457 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1386 if (face_index >= face_infos_.size() || | 1458 if (face_index >= face_infos_.size() || |
| 1387 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | 1459 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size()) || |
| 1460 layer >= static_cast<GLint>(face_infos_[face_index]. |
| 1461 level_infos[level].layer_infos.size())) { |
| 1388 return gfx::Rect(); | 1462 return gfx::Rect(); |
| 1389 } | 1463 } |
| 1390 | 1464 |
| 1391 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1465 const Texture::LayerInfo& layer_info = |
| 1466 face_infos_[face_index].level_infos[level].layer_infos[layer]; |
| 1392 | 1467 |
| 1393 return info.cleared_rect; | 1468 return layer_info.cleared_rect; |
| 1394 } | 1469 } |
| 1395 | 1470 |
| 1396 bool Texture::IsLevelCleared(GLenum target, GLint level) const { | 1471 bool Texture::IsLevelCleared(GLenum target, GLint level, GLint layer) const { |
| 1397 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1472 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1398 if (face_index >= face_infos_.size() || | 1473 if (face_index >= face_infos_.size() || |
| 1399 level < 0 || | 1474 level < 0 || |
| 1400 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | 1475 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { |
| 1401 return true; | 1476 return true; |
| 1402 } | 1477 } |
| 1403 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1478 const Texture::LevelInfo& level_info = |
| 1404 return info.cleared_rect == gfx::Rect(info.width, info.height); | 1479 face_infos_[face_index].level_infos[level]; |
| 1480 const Texture::LayerInfo& layer_info = level_info.layer_infos[layer]; |
| 1481 return layer_info.cleared_rect == |
| 1482 gfx::Rect(level_info.width, level_info.height); |
| 1405 } | 1483 } |
| 1406 | 1484 |
| 1407 bool Texture::IsLevelPartiallyCleared(GLenum target, GLint level) const { | 1485 bool Texture::IsLevelPartiallyCleared(GLenum target, |
| 1486 GLint level, |
| 1487 GLint layer) const { |
| 1408 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1488 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1409 if (face_index >= face_infos_.size() || | 1489 if (face_index >= face_infos_.size() || |
| 1410 level < 0 || | 1490 level < 0 || |
| 1411 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | 1491 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { |
| 1412 return false; | 1492 return false; |
| 1413 } | 1493 } |
| 1414 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1494 const Texture::LevelInfo& level_info = |
| 1415 return (info.cleared_rect != gfx::Rect(info.width, info.height) && | 1495 face_infos_[face_index].level_infos[level]; |
| 1416 info.cleared_rect != gfx::Rect()); | 1496 const Texture::LayerInfo& layer_info = level_info.layer_infos[layer]; |
| 1497 return (layer_info.cleared_rect != |
| 1498 gfx::Rect(level_info.width, level_info.height) && |
| 1499 layer_info.cleared_rect != gfx::Rect()); |
| 1417 } | 1500 } |
| 1418 | 1501 |
| 1419 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { | 1502 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { |
| 1420 if (texture_max_anisotropy_initialized_) | 1503 if (texture_max_anisotropy_initialized_) |
| 1421 return; | 1504 return; |
| 1422 texture_max_anisotropy_initialized_ = true; | 1505 texture_max_anisotropy_initialized_ = true; |
| 1423 GLfloat params[] = { 1.0f }; | 1506 GLfloat params[] = { 1.0f }; |
| 1424 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); | 1507 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); |
| 1425 } | 1508 } |
| 1426 | 1509 |
| 1427 bool Texture::ClearLevel( | 1510 bool Texture::ClearLevel( |
| 1428 GLES2Decoder* decoder, GLenum target, GLint level) { | 1511 GLES2Decoder* decoder, GLenum target, GLint level, GLint layer) { |
| 1429 DCHECK(decoder); | 1512 DCHECK(decoder); |
| 1430 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1513 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1431 if (face_index >= face_infos_.size() || level < 0 || | 1514 if (face_index >= face_infos_.size() || level < 0 || |
| 1432 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | 1515 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { |
| 1433 return true; | 1516 return true; |
| 1434 } | 1517 } |
| 1435 | 1518 |
| 1436 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1519 Texture::LevelInfo& level_info = face_infos_[face_index].level_infos[level]; |
| 1520 Texture::LayerInfo& layer_info = level_info.layer_infos[layer]; |
| 1437 | 1521 |
| 1438 DCHECK(target == info.target); | 1522 DCHECK(target == level_info.target); |
| 1439 | 1523 |
| 1440 if (info.target == 0 || | 1524 if (level_info.target == 0 || |
| 1441 info.cleared_rect == gfx::Rect(info.width, info.height) || | 1525 layer_info.cleared_rect == |
| 1442 info.width == 0 || info.height == 0 || info.depth == 0) { | 1526 gfx::Rect(level_info.width, level_info.height) || |
| 1527 level_info.width == 0 || |
| 1528 level_info.height == 0 || |
| 1529 level_info.depth == 0) { |
| 1443 return true; | 1530 return true; |
| 1444 } | 1531 } |
| 1445 | 1532 |
| 1446 if (info.target == GL_TEXTURE_3D || info.target == GL_TEXTURE_2D_ARRAY) { | 1533 if (level_info.target == GL_TEXTURE_3D || |
| 1534 level_info.target == GL_TEXTURE_2D_ARRAY) { |
| 1447 // For 3D textures, we always clear the entire texture. | 1535 // For 3D textures, we always clear the entire texture. |
| 1448 DCHECK(info.cleared_rect == gfx::Rect()); | 1536 DCHECK(layer_info.cleared_rect == gfx::Rect()); |
| 1449 bool cleared = decoder->ClearLevel3D( | 1537 bool cleared = decoder->ClearLevel3D( |
| 1450 this, info.target, info.level, info.format, info.type, | 1538 this, level_info.target, level_info.level, level_info.format, |
| 1451 info.width, info.height, info.depth); | 1539 level_info.type, level_info.width, level_info.height, level_info.depth); |
| 1452 if (!cleared) | 1540 if (!cleared) |
| 1453 return false; | 1541 return false; |
| 1454 } else { | 1542 } else { |
| 1455 if (decoder->IsCompressedTextureFormat(info.internal_format)) { | 1543 if (decoder->IsCompressedTextureFormat(level_info.internal_format)) { |
| 1456 // An uncleared level of a compressed texture can only occur when | 1544 // An uncleared level of a compressed texture can only occur when |
| 1457 // allocating the texture with TexStorage2D. In this case the level | 1545 // allocating the texture with TexStorage2D. In this case the level |
| 1458 // is cleared just before a call to CompressedTexSubImage2D, to avoid | 1546 // is cleared just before a call to CompressedTexSubImage2D, to avoid |
| 1459 // having to clear a sub-rectangle of a compressed texture, which | 1547 // having to clear a sub-rectangle of a compressed texture, which |
| 1460 // would be problematic. | 1548 // would be problematic. |
| 1461 DCHECK(IsImmutable()); | 1549 DCHECK(IsImmutable()); |
| 1462 DCHECK(info.cleared_rect == gfx::Rect()); | 1550 DCHECK(layer_info.cleared_rect == gfx::Rect()); |
| 1463 bool cleared = decoder->ClearCompressedTextureLevel( | 1551 bool cleared = decoder->ClearCompressedTextureLevel( |
| 1464 this, info.target, info.level, info.internal_format, | 1552 this, level_info.target, level_info.level, level_info.internal_format, |
| 1465 info.width, info.height); | 1553 level_info.width, level_info.height); |
| 1466 if (!cleared) | 1554 if (!cleared) |
| 1467 return false; | 1555 return false; |
| 1468 } else { | 1556 } else { |
| 1469 // Clear all remaining sub regions. | 1557 // Clear all remaining sub regions. |
| 1470 const int x[] = { | 1558 const int x[] = { |
| 1471 0, info.cleared_rect.x(), info.cleared_rect.right(), info.width}; | 1559 0, layer_info.cleared_rect.x(), |
| 1560 layer_info.cleared_rect.right(), level_info.width}; |
| 1472 const int y[] = { | 1561 const int y[] = { |
| 1473 0, info.cleared_rect.y(), info.cleared_rect.bottom(), info.height}; | 1562 0, layer_info.cleared_rect.y(), |
| 1563 layer_info.cleared_rect.bottom(), level_info.height}; |
| 1474 | 1564 |
| 1475 for (size_t j = 0; j < 3; ++j) { | 1565 for (size_t j = 0; j < 3; ++j) { |
| 1476 for (size_t i = 0; i < 3; ++i) { | 1566 for (size_t i = 0; i < 3; ++i) { |
| 1477 // Center of nine patch is already cleared. | 1567 // Center of nine patch is already cleared. |
| 1478 if (j == 1 && i == 1) | 1568 if (j == 1 && i == 1) |
| 1479 continue; | 1569 continue; |
| 1480 | 1570 |
| 1481 gfx::Rect rect(x[i], y[j], x[i + 1] - x[i], y[j + 1] - y[j]); | 1571 gfx::Rect rect(x[i], y[j], x[i + 1] - x[i], y[j + 1] - y[j]); |
| 1482 if (rect.IsEmpty()) | 1572 if (rect.IsEmpty()) |
| 1483 continue; | 1573 continue; |
| 1484 | 1574 |
| 1485 // NOTE: It seems kind of gross to call back into the decoder for this | 1575 // NOTE: It seems kind of gross to call back into the decoder for this |
| 1486 // but only the decoder knows all the state (like unpack_alignment_) | 1576 // but only the decoder knows all the state (like unpack_alignment_) |
| 1487 // that's needed to be able to call GL correctly. | 1577 // that's needed to be able to call GL correctly. |
| 1488 bool cleared = decoder->ClearLevel( | 1578 bool cleared = decoder->ClearLevel( |
| 1489 this, info.target, info.level, info.format, info.type, | 1579 this, level_info.target, level_info.level, level_info.format, |
| 1490 rect.x(), rect.y(), rect.width(), rect.height()); | 1580 level_info.type, rect.x(), rect.y(), rect.width(), rect.height()); |
| 1491 if (!cleared) | 1581 if (!cleared) |
| 1492 return false; | 1582 return false; |
| 1493 } | 1583 } |
| 1494 } | 1584 } |
| 1495 } | 1585 } |
| 1496 } | 1586 } |
| 1497 | 1587 |
| 1498 UpdateMipCleared(&info, info.width, info.height, | 1588 UpdateMipCleared(&level_info, level_info.width, level_info.height, |
| 1499 gfx::Rect(info.width, info.height)); | 1589 gfx::Rect(level_info.width, level_info.height), 0); |
| 1590 if (level_info.target == GL_TEXTURE_3D || |
| 1591 level_info.target == GL_TEXTURE_2D_ARRAY) { |
| 1592 for (int i = 1; i < level_info.depth; ++i) { |
| 1593 UpdateMipCleared(&level_info, level_info.width, level_info.height, |
| 1594 gfx::Rect(level_info.width, level_info.height), i); |
| 1595 } |
| 1596 } |
| 1500 return true; | 1597 return true; |
| 1501 } | 1598 } |
| 1502 | 1599 |
| 1503 void Texture::SetLevelImageInternal(GLenum target, | 1600 void Texture::SetLevelImageInternal(GLenum target, |
| 1504 GLint level, | 1601 GLint level, |
| 1602 GLint layer, |
| 1505 gl::GLImage* image, | 1603 gl::GLImage* image, |
| 1506 GLStreamTextureImage* stream_texture_image, | 1604 GLStreamTextureImage* stream_texture_image, |
| 1507 ImageState state) { | 1605 ImageState state) { |
| 1508 DCHECK(!stream_texture_image || stream_texture_image == image); | 1606 DCHECK(!stream_texture_image || stream_texture_image == image); |
| 1509 DCHECK_GE(level, 0); | 1607 DCHECK_GE(level, 0); |
| 1510 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1608 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1511 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); | 1609 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); |
| 1512 DCHECK_LT(static_cast<size_t>(level), | 1610 DCHECK_LT(static_cast<size_t>(level), |
| 1513 face_infos_[face_index].level_infos.size()); | 1611 face_infos_[face_index].level_infos.size()); |
| 1514 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1612 DCHECK_LT(static_cast<size_t>(layer), |
| 1515 DCHECK_EQ(info.target, target); | 1613 face_infos_[face_index].level_infos[level].layer_infos.size()); |
| 1516 DCHECK_EQ(info.level, level); | 1614 Texture::LevelInfo& level_info = face_infos_[face_index].level_infos[level]; |
| 1517 info.image = image; | 1615 DCHECK_EQ(level_info.target, target); |
| 1518 info.stream_texture_image = stream_texture_image; | 1616 DCHECK_EQ(level_info.level, level); |
| 1519 info.image_state = state; | 1617 |
| 1618 Texture::LayerInfo& layer_info = level_info.layer_infos[layer]; |
| 1619 layer_info.image = image; |
| 1620 layer_info.stream_texture_image = stream_texture_image; |
| 1621 layer_info.image_state = state; |
| 1520 | 1622 |
| 1521 UpdateCanRenderCondition(); | 1623 UpdateCanRenderCondition(); |
| 1522 UpdateHasImages(); | 1624 UpdateHasImages(); |
| 1523 UpdateEmulatingRGB(); | 1625 UpdateEmulatingRGB(); |
| 1524 } | 1626 } |
| 1525 | 1627 |
| 1526 void Texture::SetLevelImage(GLenum target, | 1628 void Texture::SetLevelImage(GLenum target, |
| 1527 GLint level, | 1629 GLint level, |
| 1630 GLint layer, |
| 1528 gl::GLImage* image, | 1631 gl::GLImage* image, |
| 1529 ImageState state) { | 1632 ImageState state) { |
| 1530 SetStreamTextureServiceId(0); | 1633 SetStreamTextureServiceId(0); |
| 1531 SetLevelImageInternal(target, level, image, nullptr, state); | 1634 SetLevelImageInternal(target, level, layer, image, nullptr, state); |
| 1532 } | 1635 } |
| 1533 | 1636 |
| 1534 void Texture::SetLevelStreamTextureImage(GLenum target, | 1637 void Texture::SetLevelStreamTextureImage(GLenum target, |
| 1535 GLint level, | 1638 GLint level, |
| 1639 GLint layer, |
| 1536 GLStreamTextureImage* image, | 1640 GLStreamTextureImage* image, |
| 1537 ImageState state, | 1641 ImageState state, |
| 1538 GLuint service_id) { | 1642 GLuint service_id) { |
| 1539 SetStreamTextureServiceId(service_id); | 1643 SetStreamTextureServiceId(service_id); |
| 1540 SetLevelImageInternal(target, level, image, image, state); | 1644 SetLevelImageInternal(target, level, layer, image, image, state); |
| 1541 } | 1645 } |
| 1542 | 1646 |
| 1543 void Texture::SetLevelImageState(GLenum target, GLint level, ImageState state) { | 1647 void Texture::SetLevelImageState(GLenum target, |
| 1648 GLint level, |
| 1649 GLint layer, |
| 1650 ImageState state) { |
| 1544 DCHECK_GE(level, 0); | 1651 DCHECK_GE(level, 0); |
| 1545 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1652 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1546 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); | 1653 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); |
| 1547 DCHECK_LT(static_cast<size_t>(level), | 1654 DCHECK_LT(static_cast<size_t>(level), |
| 1548 face_infos_[face_index].level_infos.size()); | 1655 face_infos_[face_index].level_infos.size()); |
| 1549 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1656 DCHECK_LT(static_cast<size_t>(layer), |
| 1550 DCHECK_EQ(info.target, target); | 1657 face_infos_[face_index].level_infos[level].layer_infos.size()); |
| 1551 DCHECK_EQ(info.level, level); | 1658 Texture::LevelInfo& level_info = face_infos_[face_index].level_infos[level]; |
| 1552 info.image_state = state; | 1659 DCHECK_EQ(level_info.target, target); |
| 1660 DCHECK_EQ(level_info.level, level); |
| 1661 Texture::LayerInfo& layer_info = level_info.layer_infos[layer]; |
| 1662 layer_info.image_state = state; |
| 1553 } | 1663 } |
| 1554 | 1664 |
| 1555 const Texture::LevelInfo* Texture::GetLevelInfo(GLint target, | 1665 const Texture::LevelInfo* Texture::GetLevelInfo(GLint target, |
| 1556 GLint level) const { | 1666 GLint level) const { |
| 1667 // TODO(yunchao): add TEXTURE_3D and TEXTURE_2D_ARRAY |
| 1557 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES && | 1668 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES && |
| 1558 target != GL_TEXTURE_RECTANGLE_ARB) { | 1669 target != GL_TEXTURE_RECTANGLE_ARB) { |
| 1559 return NULL; | 1670 return NULL; |
| 1560 } | 1671 } |
| 1561 | 1672 |
| 1562 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1673 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
| 1563 if (level >= 0 && face_index < face_infos_.size() && | 1674 if (level >= 0 && face_index < face_infos_.size() && |
| 1564 static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { | 1675 static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { |
| 1565 const LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1676 const LevelInfo& info = face_infos_[face_index].level_infos[level]; |
| 1566 if (info.target != 0) | 1677 if (info.target != 0) |
| 1567 return &info; | 1678 return &info; |
| 1568 } | 1679 } |
| 1569 return NULL; | 1680 return NULL; |
| 1570 } | 1681 } |
| 1571 | 1682 |
| 1572 gl::GLImage* Texture::GetLevelImage(GLint target, | 1683 gl::GLImage* Texture::GetLevelImage(GLint target, |
| 1573 GLint level, | 1684 GLint level, |
| 1685 GLint layer, |
| 1574 ImageState* state) const { | 1686 ImageState* state) const { |
| 1575 const LevelInfo* info = GetLevelInfo(target, level); | 1687 const LevelInfo* level_info = GetLevelInfo(target, level); |
| 1576 if (!info) | 1688 if (!level_info) |
| 1577 return nullptr; | 1689 return nullptr; |
| 1690 if (static_cast<size_t>(layer) >= level_info->layer_infos.size()) |
| 1691 return nullptr; |
| 1692 const LayerInfo& layer_info = level_info->layer_infos[layer]; |
| 1578 | 1693 |
| 1579 if (state) | 1694 if (state) |
| 1580 *state = info->image_state; | 1695 *state = layer_info.image_state; |
| 1581 return info->image.get(); | 1696 return layer_info.image.get(); |
| 1582 } | 1697 } |
| 1583 | 1698 |
| 1584 gl::GLImage* Texture::GetLevelImage(GLint target, GLint level) const { | 1699 gl::GLImage* Texture::GetLevelImage(GLint target, |
| 1585 return GetLevelImage(target, level, nullptr); | 1700 GLint level, |
| 1701 GLint layer) const { |
| 1702 return GetLevelImage(target, level, layer, nullptr); |
| 1586 } | 1703 } |
| 1587 | 1704 |
| 1588 GLStreamTextureImage* Texture::GetLevelStreamTextureImage(GLint target, | 1705 GLStreamTextureImage* Texture::GetLevelStreamTextureImage(GLint target, |
| 1589 GLint level) const { | 1706 GLint level, |
| 1590 const LevelInfo* info = GetLevelInfo(target, level); | 1707 GLint layer) const { |
| 1591 if (!info) | 1708 const LevelInfo* level_info = GetLevelInfo(target, level); |
| 1709 if (!level_info) |
| 1592 return nullptr; | 1710 return nullptr; |
| 1711 if (static_cast<size_t>(layer) >= level_info->layer_infos.size()) |
| 1712 return nullptr; |
| 1713 const LayerInfo& layer_info = level_info->layer_infos[layer]; |
| 1593 | 1714 |
| 1594 return info->stream_texture_image.get(); | 1715 return layer_info.stream_texture_image.get(); |
| 1595 } | 1716 } |
| 1596 | 1717 |
| 1597 void Texture::DumpLevelMemory(base::trace_event::ProcessMemoryDump* pmd, | 1718 void Texture::DumpLevelMemory(base::trace_event::ProcessMemoryDump* pmd, |
| 1598 uint64_t client_tracing_id, | 1719 uint64_t client_tracing_id, |
| 1599 const std::string& dump_name) const { | 1720 const std::string& dump_name) const { |
| 1600 for (uint32_t face_index = 0; face_index < face_infos_.size(); ++face_index) { | 1721 for (uint32_t face_index = 0; face_index < face_infos_.size(); ++face_index) { |
| 1601 const auto& level_infos = face_infos_[face_index].level_infos; | 1722 const auto& level_infos = face_infos_[face_index].level_infos; |
| 1602 for (uint32_t level_index = 0; level_index < level_infos.size(); | 1723 for (uint32_t level_index = 0; level_index < level_infos.size(); |
| 1603 ++level_index) { | 1724 ++level_index) { |
| 1604 // Skip levels with no size. Textures will have empty levels for all | 1725 // Skip levels with no size. Textures will have empty levels for all |
| 1605 // potential mip levels which are not in use. | 1726 // potential mip levels which are not in use. |
| 1606 if (!level_infos[level_index].estimated_size) | 1727 if (!level_infos[level_index].estimated_size) |
| 1607 continue; | 1728 continue; |
| 1608 | 1729 |
| 1609 // If a level has a GLImage, ask the GLImage to dump itself. | 1730 for (uint32_t layer_index = 0; |
| 1610 if (level_infos[level_index].image) { | 1731 layer_index < level_infos[level_index].layer_infos.size(); |
| 1611 level_infos[level_index].image->OnMemoryDump( | 1732 ++layer_index) { |
| 1612 pmd, client_tracing_id, | 1733 // If a level has a GLImage, ask the GLImage to dump itself. |
| 1613 base::StringPrintf("%s/face_%d/level_%d", dump_name.c_str(), | 1734 if (level_infos[level_index].layer_infos[layer_index].image) { |
| 1614 face_index, level_index)); | 1735 level_infos[level_index].layer_infos[layer_index].image->OnMemoryDump( |
| 1615 } | 1736 pmd, client_tracing_id, |
| 1737 base::StringPrintf("%s/face_%d/level_%d/layer_%d", |
| 1738 dump_name.c_str(), |
| 1739 face_index, level_index, layer_index)); |
| 1740 } |
| 1616 | 1741 |
| 1617 // If a level does not have a GLImage bound to it, then dump the | 1742 // If a level does not have a GLImage bound to it, then dump the |
| 1618 // texture allocation also as the storage is not provided by the | 1743 // texture allocation also as the storage is not provided by the |
| 1619 // GLImage in that case. | 1744 // GLImage in that case. |
| 1620 if (level_infos[level_index].image_state != BOUND) { | 1745 if (level_infos[level_index].layer_infos[layer_index].image_state |
| 1746 != BOUND) { |
| 1621 base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump( | 1747 base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump( |
| 1622 base::StringPrintf("%s/face_%d/level_%d", dump_name.c_str(), | 1748 base::StringPrintf("%s/face_%d/level_%d/layer_%d", |
| 1623 face_index, level_index)); | 1749 dump_name.c_str(), |
| 1750 face_index, level_index, layer_index)); |
| 1624 dump->AddScalar( | 1751 dump->AddScalar( |
| 1625 base::trace_event::MemoryAllocatorDump::kNameSize, | 1752 base::trace_event::MemoryAllocatorDump::kNameSize, |
| 1626 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | 1753 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| 1627 static_cast<uint64_t>(level_infos[level_index].estimated_size)); | 1754 static_cast<uint64_t>(level_infos[level_index].estimated_size)); |
| 1628 } | 1755 } |
| 1756 } |
| 1629 } | 1757 } |
| 1630 } | 1758 } |
| 1631 } | 1759 } |
| 1632 | 1760 |
| 1633 bool Texture::CanRenderTo(const FeatureInfo* feature_info, GLint level) const { | 1761 bool Texture::CanRenderTo(const FeatureInfo* feature_info, GLint level) const { |
| 1634 if (target_ == GL_TEXTURE_EXTERNAL_OES || target_ == 0) | 1762 if (target_ == GL_TEXTURE_EXTERNAL_OES || target_ == 0) |
| 1635 return false; | 1763 return false; |
| 1636 DCHECK_LT(0u, face_infos_.size()); | 1764 DCHECK_LT(0u, face_infos_.size()); |
| 1637 // In GLES2, cube completeness is not required for framebuffer completeness. | 1765 // In GLES2, cube completeness is not required for framebuffer completeness. |
| 1638 // However, it is required if command buffer is implemented on top of | 1766 // However, it is required if command buffer is implemented on top of |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 (level == 0 || feature_info_->feature_flags().npot_ok || | 2010 (level == 0 || feature_info_->feature_flags().npot_ok || |
| 1883 (!GLES2Util::IsNPOT(width) && | 2011 (!GLES2Util::IsNPOT(width) && |
| 1884 !GLES2Util::IsNPOT(height) && | 2012 !GLES2Util::IsNPOT(height) && |
| 1885 !GLES2Util::IsNPOT(depth))) && | 2013 !GLES2Util::IsNPOT(depth))) && |
| 1886 (target != GL_TEXTURE_CUBE_MAP || (width == height && depth == 1)) && | 2014 (target != GL_TEXTURE_CUBE_MAP || (width == height && depth == 1)) && |
| 1887 (target != GL_TEXTURE_2D || (depth == 1)); | 2015 (target != GL_TEXTURE_2D || (depth == 1)); |
| 1888 } | 2016 } |
| 1889 | 2017 |
| 1890 void TextureManager::SetTarget(TextureRef* ref, GLenum target) { | 2018 void TextureManager::SetTarget(TextureRef* ref, GLenum target) { |
| 1891 DCHECK(ref); | 2019 DCHECK(ref); |
| 1892 ref->texture()->SetTarget(target, MaxLevelsForTarget(target)); | 2020 GLint layers; |
| 2021 switch (target) { |
| 2022 case GL_TEXTURE_3D: |
| 2023 layers = max_3d_texture_size(); |
| 2024 break; |
| 2025 case GL_TEXTURE_2D_ARRAY: |
| 2026 layers = max_array_texture_layers(); |
| 2027 break; |
| 2028 default: |
| 2029 layers = 1; |
| 2030 } |
| 2031 ref->texture()->SetTarget(target, MaxLevelsForTarget(target), layers); |
| 1893 } | 2032 } |
| 1894 | 2033 |
| 1895 void TextureManager::SetLevelClearedRect(TextureRef* ref, | 2034 void TextureManager::SetLevelClearedRect(TextureRef* ref, |
| 1896 GLenum target, | 2035 GLenum target, |
| 1897 GLint level, | 2036 GLint level, |
| 2037 GLint layer, |
| 1898 const gfx::Rect& cleared_rect) { | 2038 const gfx::Rect& cleared_rect) { |
| 1899 DCHECK(ref); | 2039 DCHECK(ref); |
| 1900 ref->texture()->SetLevelClearedRect(target, level, cleared_rect); | 2040 ref->texture()->SetLevelClearedRect(target, level, layer, cleared_rect); |
| 1901 } | 2041 } |
| 1902 | 2042 |
| 1903 void TextureManager::SetLevelCleared(TextureRef* ref, | 2043 void TextureManager::SetLevelCleared(TextureRef* ref, |
| 1904 GLenum target, | 2044 GLenum target, |
| 1905 GLint level, | 2045 GLint level, |
| 2046 GLint layer, |
| 1906 bool cleared) { | 2047 bool cleared) { |
| 1907 DCHECK(ref); | 2048 DCHECK(ref); |
| 1908 ref->texture()->SetLevelCleared(target, level, cleared); | 2049 ref->texture()->SetLevelCleared(target, level, layer, cleared); |
| 1909 } | 2050 } |
| 1910 | 2051 |
| 1911 bool TextureManager::ClearRenderableLevels( | 2052 bool TextureManager::ClearRenderableLevels( |
| 1912 GLES2Decoder* decoder, TextureRef* ref) { | 2053 GLES2Decoder* decoder, TextureRef* ref) { |
| 1913 DCHECK(ref); | 2054 DCHECK(ref); |
| 1914 return ref->texture()->ClearRenderableLevels(decoder); | 2055 return ref->texture()->ClearRenderableLevels(decoder); |
| 1915 } | 2056 } |
| 1916 | 2057 |
| 1917 bool TextureManager::ClearTextureLevel( | 2058 bool TextureManager::ClearTextureLevel( |
| 1918 GLES2Decoder* decoder, TextureRef* ref, | 2059 GLES2Decoder* decoder, TextureRef* ref, |
| 1919 GLenum target, GLint level) { | 2060 GLenum target, GLint level) { |
| 1920 DCHECK(ref); | 2061 DCHECK(ref); |
| 1921 Texture* texture = ref->texture(); | 2062 Texture* texture = ref->texture(); |
| 1922 if (texture->num_uncleared_mips() == 0) { | 2063 if (texture->num_uncleared_mips() == 0) { |
| 1923 return true; | 2064 return true; |
| 1924 } | 2065 } |
| 1925 bool result = texture->ClearLevel(decoder, target, level); | 2066 bool result = texture->ClearLevel(decoder, target, level, 0); |
| 1926 texture->UpdateCleared(); | 2067 texture->UpdateCleared(); |
| 1927 return result; | 2068 return result; |
| 1928 } | 2069 } |
| 1929 | 2070 |
| 1930 void TextureManager::SetLevelInfo(TextureRef* ref, | 2071 void TextureManager::SetLevelInfo(TextureRef* ref, |
| 1931 GLenum target, | 2072 GLenum target, |
| 1932 GLint level, | 2073 GLint level, |
| 1933 GLenum internal_format, | 2074 GLenum internal_format, |
| 1934 GLsizei width, | 2075 GLsizei width, |
| 1935 GLsizei height, | 2076 GLsizei height, |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2107 base::bits::Log2Floor(std::max(std::max(width, height), depth)); | 2248 base::bits::Log2Floor(std::max(std::max(width, height), depth)); |
| 2108 default: | 2249 default: |
| 2109 return 1 + | 2250 return 1 + |
| 2110 base::bits::Log2Floor(std::max(width, height)); | 2251 base::bits::Log2Floor(std::max(width, height)); |
| 2111 } | 2252 } |
| 2112 } | 2253 } |
| 2113 | 2254 |
| 2114 void TextureManager::SetLevelImage(TextureRef* ref, | 2255 void TextureManager::SetLevelImage(TextureRef* ref, |
| 2115 GLenum target, | 2256 GLenum target, |
| 2116 GLint level, | 2257 GLint level, |
| 2258 GLint layer, |
| 2117 gl::GLImage* image, | 2259 gl::GLImage* image, |
| 2118 Texture::ImageState state) { | 2260 Texture::ImageState state) { |
| 2119 DCHECK(ref); | 2261 DCHECK(ref); |
| 2120 ref->texture()->SetLevelImage(target, level, image, state); | 2262 ref->texture()->SetLevelImage(target, level, layer, image, state); |
| 2121 } | 2263 } |
| 2122 | 2264 |
| 2123 void TextureManager::SetLevelStreamTextureImage(TextureRef* ref, | 2265 void TextureManager::SetLevelStreamTextureImage(TextureRef* ref, |
| 2124 GLenum target, | 2266 GLenum target, |
| 2125 GLint level, | 2267 GLint level, |
| 2268 GLint layer, |
| 2126 GLStreamTextureImage* image, | 2269 GLStreamTextureImage* image, |
| 2127 Texture::ImageState state, | 2270 Texture::ImageState state, |
| 2128 GLuint service_id) { | 2271 GLuint service_id) { |
| 2129 DCHECK(ref); | 2272 DCHECK(ref); |
| 2130 ref->texture()->SetLevelStreamTextureImage(target, level, image, state, | 2273 ref->texture()->SetLevelStreamTextureImage(target, level, layer, image, state, |
| 2131 service_id); | 2274 service_id); |
| 2132 } | 2275 } |
| 2133 | 2276 |
| 2134 void TextureManager::SetLevelImageState(TextureRef* ref, | 2277 void TextureManager::SetLevelImageState(TextureRef* ref, |
| 2135 GLenum target, | 2278 GLenum target, |
| 2136 GLint level, | 2279 GLint level, |
| 2280 GLint layer, |
| 2137 Texture::ImageState state) { | 2281 Texture::ImageState state) { |
| 2138 DCHECK(ref); | 2282 DCHECK(ref); |
| 2139 ref->texture()->SetLevelImageState(target, level, state); | 2283 ref->texture()->SetLevelImageState(target, level, layer, state); |
| 2140 } | 2284 } |
| 2141 | 2285 |
| 2142 size_t TextureManager::GetSignatureSize() const { | 2286 size_t TextureManager::GetSignatureSize() const { |
| 2143 return sizeof(TextureTag) + sizeof(TextureSignature); | 2287 return sizeof(TextureTag) + sizeof(TextureSignature); |
| 2144 } | 2288 } |
| 2145 | 2289 |
| 2146 void TextureManager::AddToSignature( | 2290 void TextureManager::AddToSignature( |
| 2147 TextureRef* ref, | 2291 TextureRef* ref, |
| 2148 GLenum target, | 2292 GLenum target, |
| 2149 GLint level, | 2293 GLint level, |
| 2294 GLint layer, |
| 2150 std::string* signature) const { | 2295 std::string* signature) const { |
| 2151 ref->texture()->AddToSignature(feature_info_.get(), target, level, signature); | 2296 ref->texture()->AddToSignature(feature_info_.get(), target, |
| 2297 level, layer, signature); |
| 2152 } | 2298 } |
| 2153 | 2299 |
| 2154 void TextureManager::UpdateSafeToRenderFrom(int delta) { | 2300 void TextureManager::UpdateSafeToRenderFrom(int delta) { |
| 2155 num_unsafe_textures_ += delta; | 2301 num_unsafe_textures_ += delta; |
| 2156 DCHECK_GE(num_unsafe_textures_, 0); | 2302 DCHECK_GE(num_unsafe_textures_, 0); |
| 2157 } | 2303 } |
| 2158 | 2304 |
| 2159 void TextureManager::UpdateUnclearedMips(int delta) { | 2305 void TextureManager::UpdateUnclearedMips(int delta) { |
| 2160 num_uncleared_mips_ += delta; | 2306 num_uncleared_mips_ += delta; |
| 2161 DCHECK_GE(num_uncleared_mips_, 0); | 2307 DCHECK_GE(num_uncleared_mips_, 0); |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2446 | 2592 |
| 2447 DoTexSubImageArguments sub_args = { | 2593 DoTexSubImageArguments sub_args = { |
| 2448 args.target, args.level, 0, 0, 0, args.width, args.height, args.depth, | 2594 args.target, args.level, 0, 0, 0, args.width, args.height, args.depth, |
| 2449 args.format, args.type, args.pixels, args.pixels_size, args.padding, | 2595 args.format, args.type, args.pixels, args.pixels_size, args.padding, |
| 2450 args.command_type == DoTexImageArguments::kTexImage3D | 2596 args.command_type == DoTexImageArguments::kTexImage3D |
| 2451 ? DoTexSubImageArguments::kTexSubImage3D | 2597 ? DoTexSubImageArguments::kTexSubImage3D |
| 2452 : DoTexSubImageArguments::kTexSubImage2D}; | 2598 : DoTexSubImageArguments::kTexSubImage2D}; |
| 2453 DoTexSubImageRowByRowWorkaround(texture_state, state, sub_args, | 2599 DoTexSubImageRowByRowWorkaround(texture_state, state, sub_args, |
| 2454 unpack_params); | 2600 unpack_params); |
| 2455 | 2601 |
| 2456 SetLevelCleared(texture_ref, args.target, args.level, true); | 2602 SetLevelCleared(texture_ref, args.target, |
| 2603 args.level, args.depth - 1, true); |
| 2457 return; | 2604 return; |
| 2458 } | 2605 } |
| 2459 } | 2606 } |
| 2460 | 2607 |
| 2461 if (texture_state->unpack_alignment_workaround_with_unpack_buffer && buffer) { | 2608 if (texture_state->unpack_alignment_workaround_with_unpack_buffer && buffer) { |
| 2462 uint32_t buffer_size = static_cast<uint32_t>(buffer->size()); | 2609 uint32_t buffer_size = static_cast<uint32_t>(buffer->size()); |
| 2463 if (buffer_size - args.pixels_size - ToGLuint(args.pixels) < args.padding) { | 2610 if (buffer_size - args.pixels_size - ToGLuint(args.pixels) < args.padding) { |
| 2464 // In ValidateTexImage(), we already made sure buffer size is no less | 2611 // In ValidateTexImage(), we already made sure buffer size is no less |
| 2465 // than offset + pixels_size. | 2612 // than offset + pixels_size. |
| 2466 ReserveTexImageToBeFilled(texture_state, state, framebuffer_state, | 2613 ReserveTexImageToBeFilled(texture_state, state, framebuffer_state, |
| 2467 function_name, texture_ref, args); | 2614 function_name, texture_ref, args); |
| 2468 | 2615 |
| 2469 DoTexSubImageArguments sub_args = { | 2616 DoTexSubImageArguments sub_args = { |
| 2470 args.target, args.level, 0, 0, 0, args.width, args.height, args.depth, | 2617 args.target, args.level, 0, 0, 0, args.width, args.height, args.depth, |
| 2471 args.format, args.type, args.pixels, args.pixels_size, args.padding, | 2618 args.format, args.type, args.pixels, args.pixels_size, args.padding, |
| 2472 args.command_type == DoTexImageArguments::kTexImage3D ? | 2619 args.command_type == DoTexImageArguments::kTexImage3D ? |
| 2473 DoTexSubImageArguments::kTexSubImage3D : | 2620 DoTexSubImageArguments::kTexSubImage3D : |
| 2474 DoTexSubImageArguments::kTexSubImage2D}; | 2621 DoTexSubImageArguments::kTexSubImage2D}; |
| 2475 DoTexSubImageWithAlignmentWorkaround(texture_state, state, sub_args); | 2622 DoTexSubImageWithAlignmentWorkaround(texture_state, state, sub_args); |
| 2476 | 2623 |
| 2477 SetLevelCleared(texture_ref, args.target, args.level, true); | 2624 SetLevelCleared(texture_ref, args.target, |
| 2625 args.level, args.depth - 1, true); |
| 2478 return; | 2626 return; |
| 2479 } | 2627 } |
| 2480 } | 2628 } |
| 2481 DoTexImage(texture_state, state, framebuffer_state, | 2629 DoTexImage(texture_state, state, framebuffer_state, |
| 2482 function_name, texture_ref, args); | 2630 function_name, texture_ref, args); |
| 2483 } | 2631 } |
| 2484 | 2632 |
| 2485 void TextureManager::ReserveTexImageToBeFilled( | 2633 void TextureManager::ReserveTexImageToBeFilled( |
| 2486 DecoderTextureState* texture_state, | 2634 DecoderTextureState* texture_state, |
| 2487 ContextState* state, | 2635 ContextState* state, |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2618 bool ok = texture->GetLevelSize(args.target, args.level, &tex_width, | 2766 bool ok = texture->GetLevelSize(args.target, args.level, &tex_width, |
| 2619 &tex_height, &tex_depth); | 2767 &tex_height, &tex_depth); |
| 2620 DCHECK(ok); | 2768 DCHECK(ok); |
| 2621 bool full_image; | 2769 bool full_image; |
| 2622 if (args.xoffset != 0 || args.yoffset != 0 || args.zoffset != 0 || | 2770 if (args.xoffset != 0 || args.yoffset != 0 || args.zoffset != 0 || |
| 2623 args.width != tex_width || args.height != tex_height || | 2771 args.width != tex_width || args.height != tex_height || |
| 2624 args.depth != tex_depth) { | 2772 args.depth != tex_depth) { |
| 2625 gfx::Rect cleared_rect; | 2773 gfx::Rect cleared_rect; |
| 2626 if (args.command_type == DoTexSubImageArguments::kTexSubImage2D && | 2774 if (args.command_type == DoTexSubImageArguments::kTexSubImage2D && |
| 2627 CombineAdjacentRects( | 2775 CombineAdjacentRects( |
| 2628 texture->GetLevelClearedRect(args.target, args.level), | 2776 texture->GetLevelClearedRect(args.target, args.level, |
| 2777 args.depth - 1), |
| 2629 gfx::Rect(args.xoffset, args.yoffset, args.width, args.height), | 2778 gfx::Rect(args.xoffset, args.yoffset, args.width, args.height), |
| 2630 &cleared_rect)) { | 2779 &cleared_rect)) { |
| 2631 DCHECK_GE(cleared_rect.size().GetArea(), | 2780 DCHECK_GE(cleared_rect.size().GetArea(), |
| 2632 texture->GetLevelClearedRect(args.target, args.level) | 2781 texture->GetLevelClearedRect(args.target, args.level, |
| 2782 args.depth - 1) |
| 2633 .size() | 2783 .size() |
| 2634 .GetArea()); | 2784 .GetArea()); |
| 2635 SetLevelClearedRect(texture_ref, args.target, args.level, cleared_rect); | 2785 SetLevelClearedRect(texture_ref, args.target, |
| 2786 args.level, args.depth - 1, cleared_rect); |
| 2636 } else { | 2787 } else { |
| 2637 // Otherwise clear part of texture level that is not already cleared. | 2788 // Otherwise clear part of texture level that is not already cleared. |
| 2638 if (!ClearTextureLevel(decoder, texture_ref, args.target, args.level)) { | 2789 if (!ClearTextureLevel(decoder, texture_ref, args.target, args.level)) { |
| 2639 ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, | 2790 ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, |
| 2640 function_name, "dimensions too big"); | 2791 function_name, "dimensions too big"); |
| 2641 return; | 2792 return; |
| 2642 } | 2793 } |
| 2643 } | 2794 } |
| 2644 full_image = false; | 2795 full_image = false; |
| 2645 } else { | 2796 } else { |
| 2646 SetLevelCleared(texture_ref, args.target, args.level, true); | 2797 SetLevelCleared(texture_ref, args.target, |
| 2798 args.level, args.depth - 1, true); |
| 2647 full_image = true; | 2799 full_image = true; |
| 2648 } | 2800 } |
| 2649 | 2801 |
| 2650 Buffer* buffer = state->bound_pixel_unpack_buffer.get(); | 2802 Buffer* buffer = state->bound_pixel_unpack_buffer.get(); |
| 2651 | 2803 |
| 2652 if (texture_state->unpack_overlapping_rows_separately_unpack_buffer && | 2804 if (texture_state->unpack_overlapping_rows_separately_unpack_buffer && |
| 2653 buffer) { | 2805 buffer) { |
| 2654 ContextState::Dimension dimension = | 2806 ContextState::Dimension dimension = |
| 2655 (args.command_type == DoTexSubImageArguments::kTexSubImage3D) | 2807 (args.command_type == DoTexSubImageArguments::kTexSubImage3D) |
| 2656 ? ContextState::k3D | 2808 ? ContextState::k3D |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3379 uint32_t TextureManager::GetServiceIdGeneration() const { | 3531 uint32_t TextureManager::GetServiceIdGeneration() const { |
| 3380 return current_service_id_generation_; | 3532 return current_service_id_generation_; |
| 3381 } | 3533 } |
| 3382 | 3534 |
| 3383 void TextureManager::IncrementServiceIdGeneration() { | 3535 void TextureManager::IncrementServiceIdGeneration() { |
| 3384 current_service_id_generation_++; | 3536 current_service_id_generation_++; |
| 3385 } | 3537 } |
| 3386 | 3538 |
| 3387 } // namespace gles2 | 3539 } // namespace gles2 |
| 3388 } // namespace gpu | 3540 } // namespace gpu |
| OLD | NEW |