Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: gpu/command_buffer/service/texture_manager.cc

Issue 2208733002: Command buffer: clear rect for a specific layer/level of the uncleared texture for CopyTexSubImage3D (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do not assign a default value 0 to layer, UpdateMipCleared for all layers for 3D texture Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/texture_manager.h ('k') | gpu/command_buffer/service/texture_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698