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

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

Issue 1425943002: Revert of Fix WebGL 2 texture renderability check. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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 <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 } 418 }
419 419
420 Texture::FaceInfo::~FaceInfo() { 420 Texture::FaceInfo::~FaceInfo() {
421 } 421 }
422 422
423 Texture::CanRenderCondition Texture::GetCanRenderCondition() const { 423 Texture::CanRenderCondition Texture::GetCanRenderCondition() const {
424 if (target_ == 0) 424 if (target_ == 0)
425 return CAN_RENDER_ALWAYS; 425 return CAN_RENDER_ALWAYS;
426 426
427 if (target_ != GL_TEXTURE_EXTERNAL_OES) { 427 if (target_ != GL_TEXTURE_EXTERNAL_OES) {
428 if (face_infos_.empty() || 428 if (face_infos_.empty()) {
429 static_cast<size_t>(base_level_) >= face_infos_[0].level_infos.size()) {
430 return CAN_RENDER_NEVER; 429 return CAN_RENDER_NEVER;
431 } 430 }
432 const Texture::LevelInfo& first_face = 431
433 face_infos_[0].level_infos[base_level_]; 432 const Texture::LevelInfo& first_face = face_infos_[0].level_infos[0];
434 if (first_face.width == 0 || 433 if (first_face.width == 0 ||
435 first_face.height == 0 || 434 first_face.height == 0 ||
436 first_face.depth == 0) { 435 first_face.depth == 0) {
437 return CAN_RENDER_NEVER; 436 return CAN_RENDER_NEVER;
438 } 437 }
439 } 438 }
440 439
441 bool needs_mips = NeedsMips(); 440 bool needs_mips = NeedsMips();
442 if (needs_mips) { 441 if (needs_mips) {
443 if (!texture_complete()) 442 if (!texture_complete())
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 mailbox_manager_ = mailbox_manager; 525 mailbox_manager_ = mailbox_manager;
527 } 526 }
528 527
529 bool Texture::MarkMipmapsGenerated( 528 bool Texture::MarkMipmapsGenerated(
530 const FeatureInfo* feature_info) { 529 const FeatureInfo* feature_info) {
531 if (!CanGenerateMipmaps(feature_info)) { 530 if (!CanGenerateMipmaps(feature_info)) {
532 return false; 531 return false;
533 } 532 }
534 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 533 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
535 const Texture::FaceInfo& face_info = face_infos_[ii]; 534 const Texture::FaceInfo& face_info = face_infos_[ii];
536 const Texture::LevelInfo& level0_info = face_info.level_infos[base_level_]; 535 const Texture::LevelInfo& level0_info = face_info.level_infos[0];
537 GLsizei width = level0_info.width; 536 GLsizei width = level0_info.width;
538 GLsizei height = level0_info.height; 537 GLsizei height = level0_info.height;
539 GLsizei depth = level0_info.depth; 538 GLsizei depth = level0_info.depth;
540 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : 539 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D :
541 GLES2Util::IndexToGLFaceTarget(ii); 540 GLES2Util::IndexToGLFaceTarget(ii);
542 541
543 const GLsizei num_mips = face_info.num_mip_levels; 542 const GLsizei num_mips = face_info.num_mip_levels;
544 for (GLsizei level = base_level_ + 1; 543 for (GLsizei level = 1; level < num_mips; ++level) {
545 level < base_level_ + num_mips; ++level) {
546 width = std::max(1, width >> 1); 544 width = std::max(1, width >> 1);
547 height = std::max(1, height >> 1); 545 height = std::max(1, height >> 1);
548 depth = std::max(1, depth >> 1); 546 depth = std::max(1, depth >> 1);
549 SetLevelInfo(feature_info, target, level, level0_info.internal_format, 547 SetLevelInfo(feature_info, target, level, level0_info.internal_format,
550 width, height, depth, level0_info.border, level0_info.format, 548 width, height, depth, level0_info.border, level0_info.format,
551 level0_info.type, gfx::Rect(width, height)); 549 level0_info.type, gfx::Rect(width, height));
552 } 550 }
553 } 551 }
554 552
555 return true; 553 return true;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 if (face_index != 0) { 633 if (face_index != 0) {
636 complete &= (width == first_face.width && 634 complete &= (width == first_face.width &&
637 height == first_face.height && 635 height == first_face.height &&
638 internal_format == first_face.internal_format && 636 internal_format == first_face.internal_format &&
639 format == first_face.format && 637 format == first_face.format &&
640 type == first_face.type); 638 type == first_face.type);
641 } 639 }
642 return complete; 640 return complete;
643 } 641 }
644 642
645 bool Texture::TextureMipComplete(const Texture::LevelInfo& base_level_face, 643 bool Texture::TextureMipComplete(const Texture::LevelInfo& level0_face,
646 GLenum target, 644 GLenum target,
647 GLint level_diff, 645 GLint level,
648 GLenum internal_format, 646 GLenum internal_format,
649 GLsizei width, 647 GLsizei width,
650 GLsizei height, 648 GLsizei height,
651 GLsizei depth, 649 GLsizei depth,
652 GLenum format, 650 GLenum format,
653 GLenum type) { 651 GLenum type) {
654 bool complete = (target != 0); 652 bool complete = (target != 0);
655 if (level_diff > 0) { 653 if (level != 0) {
656 const GLsizei mip_width = std::max(1, base_level_face.width >> level_diff); 654 const GLsizei mip_width = std::max(1, level0_face.width >> level);
657 const GLsizei mip_height = 655 const GLsizei mip_height = std::max(1, level0_face.height >> level);
658 std::max(1, base_level_face.height >> level_diff); 656 const GLsizei mip_depth = std::max(1, level0_face.depth >> level);
659 const GLsizei mip_depth = std::max(1, base_level_face.depth >> level_diff);
660 657
661 complete &= (width == mip_width && 658 complete &= (width == mip_width &&
662 height == mip_height && 659 height == mip_height &&
663 depth == mip_depth && 660 depth == mip_depth &&
664 internal_format == base_level_face.internal_format && 661 internal_format == level0_face.internal_format &&
665 format == base_level_face.format && 662 format == level0_face.format &&
666 type == base_level_face.type); 663 type == level0_face.type);
667 } 664 }
668 return complete; 665 return complete;
669 } 666 }
670 667
671 void Texture::SetLevelClearedRect(GLenum target, 668 void Texture::SetLevelClearedRect(GLenum target,
672 GLint level, 669 GLint level,
673 const gfx::Rect& cleared_rect) { 670 const gfx::Rect& cleared_rect) {
674 DCHECK_GE(level, 0); 671 DCHECK_GE(level, 0);
675 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 672 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
676 DCHECK_LT(static_cast<size_t>(face_index), 673 DCHECK_LT(static_cast<size_t>(face_index),
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 int delta = has_images ? +1 : -1; 765 int delta = has_images ? +1 : -1;
769 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 766 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
770 (*it)->manager()->UpdateNumImages(delta); 767 (*it)->manager()->UpdateNumImages(delta);
771 } 768 }
772 769
773 void Texture::IncAllFramebufferStateChangeCount() { 770 void Texture::IncAllFramebufferStateChangeCount() {
774 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 771 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
775 (*it)->manager()->IncFramebufferStateChangeCount(); 772 (*it)->manager()->IncFramebufferStateChangeCount();
776 } 773 }
777 774
778 void Texture::UpdateBaseLevel(GLint base_level) {
779 if (base_level_ == base_level)
780 return;
781 base_level_ = base_level;
782
783 UpdateNumMipLevels();
784 }
785
786 void Texture::UpdateMaxLevel(GLint max_level) {
787 if (max_level_ == max_level)
788 return;
789 max_level_ = max_level;
790
791 UpdateNumMipLevels();
792 }
793
794 void Texture::UpdateNumMipLevels() {
795 if (face_infos_.empty())
796 return;
797
798 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
799 Texture::FaceInfo& face_info = face_infos_[ii];
800 if (static_cast<size_t>(base_level_) >= face_info.level_infos.size())
801 continue;
802 const Texture::LevelInfo& info = face_info.level_infos[base_level_];
803 face_info.num_mip_levels = std::min(
804 std::max(0, max_level_ - base_level_ + 1),
805 TextureManager::ComputeMipMapCount(
806 target_, info.width, info.height, info.depth));
807 }
808
809 // mipmap-completeness needs to be re-evaluated.
810 texture_mips_dirty_ = true;
811 }
812
813 void Texture::SetLevelInfo(const FeatureInfo* feature_info, 775 void Texture::SetLevelInfo(const FeatureInfo* feature_info,
814 GLenum target, 776 GLenum target,
815 GLint level, 777 GLint level,
816 GLenum internal_format, 778 GLenum internal_format,
817 GLsizei width, 779 GLsizei width,
818 GLsizei height, 780 GLsizei height,
819 GLsizei depth, 781 GLsizei depth,
820 GLint border, 782 GLint border,
821 GLenum format, 783 GLenum format,
822 GLenum type, 784 GLenum type,
(...skipping 13 matching lines...) Expand all
836 // Update counters only if any attributes have changed. Counters are 798 // Update counters only if any attributes have changed. Counters are
837 // comparisons between the old and new values so it must be done before any 799 // comparisons between the old and new values so it must be done before any
838 // assignment has been done to the LevelInfo. 800 // assignment has been done to the LevelInfo.
839 if (info.target != target || 801 if (info.target != target ||
840 info.internal_format != internal_format || 802 info.internal_format != internal_format ||
841 info.width != width || 803 info.width != width ||
842 info.height != height || 804 info.height != height ||
843 info.depth != depth || 805 info.depth != depth ||
844 info.format != format || 806 info.format != format ||
845 info.type != type) { 807 info.type != type) {
846 if (level == base_level_) { 808 if (level == 0) {
847 // Calculate the mip level count. 809 // Calculate the mip level count.
848 face_infos_[face_index].num_mip_levels = std::min( 810 face_infos_[face_index].num_mip_levels =
849 std::max(0, max_level_ - base_level_ + 1), 811 TextureManager::ComputeMipMapCount(target_, width, height, depth);
850 TextureManager::ComputeMipMapCount(target_, width, height, depth));
851 812
852 // Update NPOT face count for the first level. 813 // Update NPOT face count for the first level.
853 bool prev_npot = TextureIsNPOT(info.width, info.height, info.depth); 814 bool prev_npot = TextureIsNPOT(info.width, info.height, info.depth);
854 bool now_npot = TextureIsNPOT(width, height, depth); 815 bool now_npot = TextureIsNPOT(width, height, depth);
855 if (prev_npot != now_npot) 816 if (prev_npot != now_npot)
856 num_npot_faces_ += now_npot ? 1 : -1; 817 num_npot_faces_ += now_npot ? 1 : -1;
857 818
858 // Signify that level 0 has been changed, so they need to be reverified. 819 // Signify that level 0 has been changed, so they need to be reverified.
859 texture_level0_dirty_ = true; 820 texture_level0_dirty_ = true;
860 } 821 }
861 822
862 // Signify that at least one of the mips has changed. 823 // Signify that at least one of the mips has changed.
863 texture_mips_dirty_ = true; 824 texture_mips_dirty_ = true;
864 } 825 }
865 826
866 info.target = target; 827 info.target = target;
867 info.level = level; 828 info.level = level;
868 info.internal_format = internal_format; 829 info.internal_format = internal_format;
869 info.depth = depth; 830 info.depth = depth;
870 info.border = border; 831 info.border = border;
871 info.format = format; 832 info.format = format;
872 info.type = type; 833 info.type = type;
873 info.image = 0; 834 info.image = 0;
874 info.image_state = UNBOUND; 835 info.image_state = UNBOUND;
875 836
876 UpdateMipCleared(&info, width, height, cleared_rect); 837 UpdateMipCleared(&info, width, height, cleared_rect);
877 838
878 estimated_size_ -= info.estimated_size; 839 estimated_size_ -= info.estimated_size;
879 GLES2Util::ComputeImageDataSizes( 840 GLES2Util::ComputeImageDataSizes(
880 width, height, depth, format, type, 4, &info.estimated_size, NULL, NULL); 841 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL);
881 estimated_size_ += info.estimated_size; 842 estimated_size_ += info.estimated_size;
882 843
883 max_level_set_ = std::max(max_level_set_, level); 844 max_level_set_ = std::max(max_level_set_, level);
884 Update(feature_info); 845 Update(feature_info);
885 UpdateCleared(); 846 UpdateCleared();
886 UpdateCanRenderCondition(); 847 UpdateCanRenderCondition();
887 UpdateHasImages(); 848 UpdateHasImages();
888 if (IsAttachedToFramebuffer()) { 849 if (IsAttachedToFramebuffer()) {
889 // TODO(gman): If textures tracked which framebuffers they were attached to 850 // TODO(gman): If textures tracked which framebuffers they were attached to
890 // we could just mark those framebuffers as not complete. 851 // we could just mark those framebuffers as not complete.
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 case GL_TEXTURE_COMPARE_MODE: 979 case GL_TEXTURE_COMPARE_MODE:
1019 if (!feature_info->validators()->texture_compare_mode.IsValid(param)) { 980 if (!feature_info->validators()->texture_compare_mode.IsValid(param)) {
1020 return GL_INVALID_ENUM; 981 return GL_INVALID_ENUM;
1021 } 982 }
1022 compare_mode_ = param; 983 compare_mode_ = param;
1023 break; 984 break;
1024 case GL_TEXTURE_BASE_LEVEL: 985 case GL_TEXTURE_BASE_LEVEL:
1025 if (param < 0) { 986 if (param < 0) {
1026 return GL_INVALID_VALUE; 987 return GL_INVALID_VALUE;
1027 } 988 }
1028 UpdateBaseLevel(param); 989 base_level_ = param;
1029 break; 990 break;
1030 case GL_TEXTURE_MAX_LEVEL: 991 case GL_TEXTURE_MAX_LEVEL:
1031 if (param < 0) { 992 if (param < 0) {
1032 return GL_INVALID_VALUE; 993 return GL_INVALID_VALUE;
1033 } 994 }
1034 UpdateMaxLevel(param); 995 max_level_ = param;
1035 break; 996 break;
1036 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 997 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1037 if (param < 1) { 998 if (param < 1) {
1038 return GL_INVALID_VALUE; 999 return GL_INVALID_VALUE;
1039 } 1000 }
1040 break; 1001 break;
1041 case GL_TEXTURE_USAGE_ANGLE: 1002 case GL_TEXTURE_USAGE_ANGLE:
1042 if (!feature_info->validators()->texture_usage.IsValid(param)) { 1003 if (!feature_info->validators()->texture_usage.IsValid(param)) {
1043 return GL_INVALID_ENUM; 1004 return GL_INVALID_ENUM;
1044 } 1005 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 return GL_INVALID_ENUM; 1048 return GL_INVALID_ENUM;
1088 } 1049 }
1089 return GL_NO_ERROR; 1050 return GL_NO_ERROR;
1090 } 1051 }
1091 1052
1092 void Texture::Update(const FeatureInfo* feature_info) { 1053 void Texture::Update(const FeatureInfo* feature_info) {
1093 // Update npot status. 1054 // Update npot status.
1094 // Assume GL_TEXTURE_EXTERNAL_OES textures are npot, all others 1055 // Assume GL_TEXTURE_EXTERNAL_OES textures are npot, all others
1095 npot_ = (target_ == GL_TEXTURE_EXTERNAL_OES) || (num_npot_faces_ > 0); 1056 npot_ = (target_ == GL_TEXTURE_EXTERNAL_OES) || (num_npot_faces_ > 0);
1096 1057
1097 if (face_infos_.empty() || 1058 if (face_infos_.empty()) {
1098 static_cast<size_t>(base_level_) >= face_infos_[0].level_infos.size()) {
1099 texture_complete_ = false; 1059 texture_complete_ = false;
1100 cube_complete_ = false; 1060 cube_complete_ = false;
1101 return; 1061 return;
1102 } 1062 }
1103 1063
1104 // Update texture_complete and cube_complete status. 1064 // Update texture_complete and cube_complete status.
1105 const Texture::FaceInfo& first_face = face_infos_[0]; 1065 const Texture::FaceInfo& first_face = face_infos_[0];
1106 const Texture::LevelInfo& first_level = first_face.level_infos[base_level_]; 1066 const Texture::LevelInfo& first_level = first_face.level_infos[0];
1107 const GLsizei levels_needed = first_face.num_mip_levels; 1067 const GLsizei levels_needed = first_face.num_mip_levels;
1108 1068
1109 texture_complete_ = 1069 texture_complete_ =
1110 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0; 1070 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0;
1111 cube_complete_ = (face_infos_.size() == 6) && 1071 cube_complete_ = (face_infos_.size() == 6) &&
1112 (first_level.width == first_level.height); 1072 (first_level.width == first_level.height);
1113 1073
1114 if (first_level.width == 0 || first_level.height == 0) { 1074 if (first_level.width == 0 || first_level.height == 0) {
1115 texture_complete_ = false; 1075 texture_complete_ = false;
1116 } else if (first_level.type == GL_FLOAT && 1076 } else if (first_level.type == GL_FLOAT &&
1117 !feature_info->feature_flags().enable_texture_float_linear && 1077 !feature_info->feature_flags().enable_texture_float_linear &&
1118 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST || 1078 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST ||
1119 mag_filter_ != GL_NEAREST)) { 1079 mag_filter_ != GL_NEAREST)) {
1120 texture_complete_ = false; 1080 texture_complete_ = false;
1121 } else if (first_level.type == GL_HALF_FLOAT_OES && 1081 } else if (first_level.type == GL_HALF_FLOAT_OES &&
1122 !feature_info->feature_flags().enable_texture_half_float_linear && 1082 !feature_info->feature_flags().enable_texture_half_float_linear &&
1123 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST || 1083 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST ||
1124 mag_filter_ != GL_NEAREST)) { 1084 mag_filter_ != GL_NEAREST)) {
1125 texture_complete_ = false; 1085 texture_complete_ = false;
1126 } 1086 }
1127 1087
1128 if (cube_complete_ && texture_level0_dirty_) { 1088 if (cube_complete_ && texture_level0_dirty_) {
1129 texture_level0_complete_ = true; 1089 texture_level0_complete_ = true;
1130 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 1090 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
1131 const Texture::LevelInfo& face_base_level = 1091 const Texture::LevelInfo& level0 = face_infos_[ii].level_infos[0];
1132 face_infos_[ii].level_infos[base_level_];
1133 if (!TextureFaceComplete(first_level, 1092 if (!TextureFaceComplete(first_level,
1134 ii, 1093 ii,
1135 face_base_level.target, 1094 level0.target,
1136 face_base_level.internal_format, 1095 level0.internal_format,
1137 face_base_level.width, 1096 level0.width,
1138 face_base_level.height, 1097 level0.height,
1139 face_base_level.depth, 1098 level0.depth,
1140 face_base_level.format, 1099 level0.format,
1141 face_base_level.type)) { 1100 level0.type)) {
1142 texture_level0_complete_ = false; 1101 texture_level0_complete_ = false;
1143 break; 1102 break;
1144 } 1103 }
1145 } 1104 }
1146 texture_level0_dirty_ = false; 1105 texture_level0_dirty_ = false;
1147 } 1106 }
1148 cube_complete_ &= texture_level0_complete_; 1107 cube_complete_ &= texture_level0_complete_;
1149 1108
1150 if (texture_complete_ && texture_mips_dirty_) { 1109 if (texture_complete_ && texture_mips_dirty_) {
1151 texture_mips_complete_ = true; 1110 texture_mips_complete_ = true;
1152 for (size_t ii = 0; 1111 for (size_t ii = 0;
1153 ii < face_infos_.size() && texture_mips_complete_; 1112 ii < face_infos_.size() && texture_mips_complete_;
1154 ++ii) { 1113 ++ii) {
1155 const Texture::FaceInfo& face_info = face_infos_[ii]; 1114 const Texture::FaceInfo& face_info = face_infos_[ii];
1156 const Texture::LevelInfo& base_level_info = 1115 const Texture::LevelInfo& level0 = face_info.level_infos[0];
1157 face_info.level_infos[base_level_];
1158 for (GLsizei jj = 1; jj < levels_needed; ++jj) { 1116 for (GLsizei jj = 1; jj < levels_needed; ++jj) {
1159 const Texture::LevelInfo& level_info = 1117 const Texture::LevelInfo& level_info = face_infos_[ii].level_infos[jj];
1160 face_infos_[ii].level_infos[base_level_ + jj]; 1118 if (!TextureMipComplete(level0,
1161 if (!TextureMipComplete(base_level_info,
1162 level_info.target, 1119 level_info.target,
1163 jj, // level - base_level_ 1120 jj,
1164 level_info.internal_format, 1121 level_info.internal_format,
1165 level_info.width, 1122 level_info.width,
1166 level_info.height, 1123 level_info.height,
1167 level_info.depth, 1124 level_info.depth,
1168 level_info.format, 1125 level_info.format,
1169 level_info.type)) { 1126 level_info.type)) {
1170 texture_mips_complete_ = false; 1127 texture_mips_complete_ = false;
1171 break; 1128 break;
1172 } 1129 }
1173 } 1130 }
1174 } 1131 }
1175 texture_mips_dirty_ = false; 1132 texture_mips_dirty_ = false;
1176 } 1133 }
1177 texture_complete_ &= texture_mips_complete_; 1134 texture_complete_ &= texture_mips_complete_;
1178 } 1135 }
1179 1136
1180 bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) { 1137 bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) {
1181 DCHECK(decoder); 1138 DCHECK(decoder);
1182 if (cleared_) { 1139 if (cleared_) {
1183 return true; 1140 return true;
1184 } 1141 }
1185 1142
1186 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 1143 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
1187 const Texture::FaceInfo& face_info = face_infos_[ii]; 1144 const Texture::FaceInfo& face_info = face_infos_[ii];
1188 for (GLint jj = base_level_; 1145 for (GLint jj = 0; jj < face_info.num_mip_levels; ++jj) {
1189 jj < base_level_ + face_info.num_mip_levels; ++jj) {
1190 const Texture::LevelInfo& info = face_info.level_infos[jj]; 1146 const Texture::LevelInfo& info = face_info.level_infos[jj];
1191 if (info.target != 0) { 1147 if (info.target != 0) {
1192 if (!ClearLevel(decoder, info.target, jj)) { 1148 if (!ClearLevel(decoder, info.target, jj)) {
1193 return false; 1149 return false;
1194 } 1150 }
1195 } 1151 }
1196 } 1152 }
1197 } 1153 }
1198 UpdateSafeToRenderFrom(true); 1154 UpdateSafeToRenderFrom(true);
1199 return true; 1155 return true;
1200 } 1156 }
1201 1157
1202 gfx::Rect Texture::GetLevelClearedRect(GLenum target, GLint level) const { 1158 gfx::Rect Texture::GetLevelClearedRect(GLenum target, GLint level) const {
1203 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1159 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1204 if (face_index >= face_infos_.size() || 1160 if (face_index >= face_infos_.size() ||
1205 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1161 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1206 return gfx::Rect(); 1162 return gfx::Rect();
1207 } 1163 }
1208 1164
1209 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1165 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1210 1166
1211 return info.cleared_rect; 1167 return info.cleared_rect;
1212 } 1168 }
1213 1169
1214 bool Texture::IsLevelCleared(GLenum target, GLint level) const { 1170 bool Texture::IsLevelCleared(GLenum target, GLint level) const {
1215 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1171 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1216 if (face_index >= face_infos_.size() || 1172 if (face_index >= face_infos_.size() ||
1217 level < base_level_ ||
1218 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1173 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1219 return true; 1174 return true;
1220 } 1175 }
1221 1176
1222 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1177 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1223 1178
1224 return info.cleared_rect == gfx::Rect(info.width, info.height); 1179 return info.cleared_rect == gfx::Rect(info.width, info.height);
1225 } 1180 }
1226 1181
1227 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { 1182 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) {
1228 if (texture_max_anisotropy_initialized_) 1183 if (texture_max_anisotropy_initialized_)
1229 return; 1184 return;
1230 texture_max_anisotropy_initialized_ = true; 1185 texture_max_anisotropy_initialized_ = true;
1231 GLfloat params[] = { 1.0f }; 1186 GLfloat params[] = { 1.0f };
1232 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); 1187 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params);
1233 } 1188 }
1234 1189
1235 bool Texture::ClearLevel( 1190 bool Texture::ClearLevel(
1236 GLES2Decoder* decoder, GLenum target, GLint level) { 1191 GLES2Decoder* decoder, GLenum target, GLint level) {
1237 DCHECK(decoder); 1192 DCHECK(decoder);
1238 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1193 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1239 if (face_index >= face_infos_.size() || 1194 if (face_index >= face_infos_.size() ||
1240 level < base_level_ ||
1241 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1195 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1242 return true; 1196 return true;
1243 } 1197 }
1244 1198
1245 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1199 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1246 1200
1247 DCHECK(target == info.target); 1201 DCHECK(target == info.target);
1248 1202
1249 if (info.target == 0 || 1203 if (info.target == 0 ||
1250 info.cleared_rect == gfx::Rect(info.width, info.height) || 1204 info.cleared_rect == gfx::Rect(info.width, info.height) ||
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 pmd->AddOwnershipEdge(client_guid, service_guid, importance); 2163 pmd->AddOwnershipEdge(client_guid, service_guid, importance);
2210 2164
2211 // Dump all sub-levels held by the texture. They will appear below the main 2165 // Dump all sub-levels held by the texture. They will appear below the main
2212 // gl/textures/client_X/texture_Y dump. 2166 // gl/textures/client_X/texture_Y dump.
2213 ref->texture()->DumpLevelMemory(pmd, memory_tracker_->ClientTracingId(), 2167 ref->texture()->DumpLevelMemory(pmd, memory_tracker_->ClientTracingId(),
2214 dump_name); 2168 dump_name);
2215 } 2169 }
2216 2170
2217 } // namespace gles2 2171 } // namespace gles2
2218 } // namespace gpu 2172 } // 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