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 #include "base/bits.h" | 6 #include "base/bits.h" |
7 #include "base/stringprintf.h" | 7 #include "base/stringprintf.h" |
8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
9 #include "gpu/command_buffer/service/feature_info.h" | 9 #include "gpu/command_buffer/service/feature_info.h" |
10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 have_context_ = have_context; | 75 have_context_ = have_context; |
76 texture_infos_.clear(); | 76 texture_infos_.clear(); |
77 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 77 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
78 default_textures_[ii] = NULL; | 78 default_textures_[ii] = NULL; |
79 } | 79 } |
80 | 80 |
81 if (have_context) { | 81 if (have_context) { |
82 glDeleteTextures(arraysize(black_texture_ids_), black_texture_ids_); | 82 glDeleteTextures(arraysize(black_texture_ids_), black_texture_ids_); |
83 } | 83 } |
84 | 84 |
85 DCHECK_EQ(0u, mem_represented_); | 85 DCHECK_EQ(0u, memory_tracker_managed_->GetMemRepresented()); |
86 UpdateMemRepresented(); | 86 DCHECK_EQ(0u, memory_tracker_unmanaged_->GetMemRepresented()); |
87 memory_tracker_managed_->UpdateMemRepresented(); | |
88 memory_tracker_unmanaged_->UpdateMemRepresented(); | |
87 } | 89 } |
88 | 90 |
89 TextureManager::TextureInfo::TextureInfo(TextureManager* manager, | 91 TextureManager::TextureInfo::TextureInfo(TextureManager* manager, |
90 GLuint service_id) | 92 GLuint service_id) |
91 : manager_(manager), | 93 : manager_(manager), |
92 service_id_(service_id), | 94 service_id_(service_id), |
93 deleted_(false), | 95 deleted_(false), |
94 cleared_(true), | 96 cleared_(true), |
95 num_uncleared_mips_(0), | 97 num_uncleared_mips_(0), |
96 target_(0), | 98 target_(0), |
97 min_filter_(GL_NEAREST_MIPMAP_LINEAR), | 99 min_filter_(GL_NEAREST_MIPMAP_LINEAR), |
98 mag_filter_(GL_LINEAR), | 100 mag_filter_(GL_LINEAR), |
99 wrap_s_(GL_REPEAT), | 101 wrap_s_(GL_REPEAT), |
100 wrap_t_(GL_REPEAT), | 102 wrap_t_(GL_REPEAT), |
101 usage_(GL_NONE), | 103 usage_(GL_NONE), |
104 tracking_pool_(MemoryTracker::Unmanaged), | |
102 max_level_set_(-1), | 105 max_level_set_(-1), |
103 texture_complete_(false), | 106 texture_complete_(false), |
104 cube_complete_(false), | 107 cube_complete_(false), |
105 npot_(false), | 108 npot_(false), |
106 has_been_bound_(false), | 109 has_been_bound_(false), |
107 framebuffer_attachment_count_(0), | 110 framebuffer_attachment_count_(0), |
108 owned_(true), | 111 owned_(true), |
109 stream_texture_(false), | 112 stream_texture_(false), |
110 immutable_(false), | 113 immutable_(false), |
111 estimated_size_(0) { | 114 estimated_size_(0) { |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
681 } | 684 } |
682 } | 685 } |
683 return 0; | 686 return 0; |
684 } | 687 } |
685 | 688 |
686 TextureManager::TextureManager( | 689 TextureManager::TextureManager( |
687 MemoryTracker* memory_tracker, | 690 MemoryTracker* memory_tracker, |
688 FeatureInfo* feature_info, | 691 FeatureInfo* feature_info, |
689 GLint max_texture_size, | 692 GLint max_texture_size, |
690 GLint max_cube_map_texture_size) | 693 GLint max_cube_map_texture_size) |
691 : texture_memory_tracker_(new MemoryTypeTracker(memory_tracker)), | 694 : memory_tracker_managed_( |
695 new MemoryTypeTracker(memory_tracker, MemoryTracker::Managed)), | |
696 memory_tracker_unmanaged_( | |
697 new MemoryTypeTracker(memory_tracker, MemoryTracker::Unmanaged)), | |
692 feature_info_(feature_info), | 698 feature_info_(feature_info), |
693 max_texture_size_(max_texture_size), | 699 max_texture_size_(max_texture_size), |
694 max_cube_map_texture_size_(max_cube_map_texture_size), | 700 max_cube_map_texture_size_(max_cube_map_texture_size), |
695 max_levels_(ComputeMipMapCount(max_texture_size, | 701 max_levels_(ComputeMipMapCount(max_texture_size, |
696 max_texture_size, | 702 max_texture_size, |
697 max_texture_size)), | 703 max_texture_size)), |
698 max_cube_map_levels_(ComputeMipMapCount(max_cube_map_texture_size, | 704 max_cube_map_levels_(ComputeMipMapCount(max_cube_map_texture_size, |
699 max_cube_map_texture_size, | 705 max_cube_map_texture_size, |
700 max_cube_map_texture_size)), | 706 max_cube_map_texture_size)), |
701 num_unrenderable_textures_(0), | 707 num_unrenderable_textures_(0), |
702 num_unsafe_textures_(0), | 708 num_unsafe_textures_(0), |
703 num_uncleared_mips_(0), | 709 num_uncleared_mips_(0), |
704 texture_info_count_(0), | 710 texture_info_count_(0), |
705 mem_represented_(0), | |
706 have_context_(true) { | 711 have_context_(true) { |
707 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 712 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
708 black_texture_ids_[ii] = 0; | 713 black_texture_ids_[ii] = 0; |
709 } | 714 } |
710 } | 715 } |
711 | 716 |
712 void TextureManager::UpdateMemRepresented() { | |
713 texture_memory_tracker_->UpdateMemRepresented(mem_represented_); | |
714 } | |
715 | |
716 bool TextureManager::Initialize() { | 717 bool TextureManager::Initialize() { |
717 UpdateMemRepresented(); | 718 memory_tracker_managed_->UpdateMemRepresented(); |
719 memory_tracker_unmanaged_->UpdateMemRepresented(); | |
718 | 720 |
719 // TODO(gman): The default textures have to be real textures, not the 0 | 721 // TODO(gman): The default textures have to be real textures, not the 0 |
720 // texture because we simulate non shared resources on top of shared | 722 // texture because we simulate non shared resources on top of shared |
721 // resources and all contexts that share resource share the same default | 723 // resources and all contexts that share resource share the same default |
722 // texture. | 724 // texture. |
723 default_textures_[kTexture2D] = CreateDefaultAndBlackTextures( | 725 default_textures_[kTexture2D] = CreateDefaultAndBlackTextures( |
724 GL_TEXTURE_2D, &black_texture_ids_[kTexture2D]); | 726 GL_TEXTURE_2D, &black_texture_ids_[kTexture2D]); |
725 default_textures_[kCubeMap] = CreateDefaultAndBlackTextures( | 727 default_textures_[kCubeMap] = CreateDefaultAndBlackTextures( |
726 GL_TEXTURE_CUBE_MAP, &black_texture_ids_[kCubeMap]); | 728 GL_TEXTURE_CUBE_MAP, &black_texture_ids_[kCubeMap]); |
727 | 729 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
899 if (!info->CanRender(feature_info_)) { | 901 if (!info->CanRender(feature_info_)) { |
900 DCHECK_NE(0, num_unrenderable_textures_); | 902 DCHECK_NE(0, num_unrenderable_textures_); |
901 --num_unrenderable_textures_; | 903 --num_unrenderable_textures_; |
902 } | 904 } |
903 if (!info->SafeToRenderFrom()) { | 905 if (!info->SafeToRenderFrom()) { |
904 DCHECK_NE(0, num_unsafe_textures_); | 906 DCHECK_NE(0, num_unsafe_textures_); |
905 --num_unsafe_textures_; | 907 --num_unsafe_textures_; |
906 } | 908 } |
907 num_uncleared_mips_ -= info->num_uncleared_mips(); | 909 num_uncleared_mips_ -= info->num_uncleared_mips(); |
908 DCHECK_GE(num_uncleared_mips_, 0); | 910 DCHECK_GE(num_uncleared_mips_, 0); |
909 mem_represented_ -= info->estimated_size(); | 911 |
912 GetMemTracker(info->tracking_pool_)->TrackMemFree(info->estimated_size()); | |
910 info->SetLevelInfo( | 913 info->SetLevelInfo( |
911 feature_info_, target, level, internal_format, width, height, depth, | 914 feature_info_, target, level, internal_format, width, height, depth, |
912 border, format, type, cleared); | 915 border, format, type, cleared); |
913 mem_represented_ += info->estimated_size(); | 916 GetMemTracker(info->tracking_pool_)->TrackMemAlloc(info->estimated_size()); |
914 UpdateMemRepresented(); | 917 GetMemTracker(info->tracking_pool_)->UpdateMemRepresented(); |
915 | 918 |
916 num_uncleared_mips_ += info->num_uncleared_mips(); | 919 num_uncleared_mips_ += info->num_uncleared_mips(); |
917 if (!info->CanRender(feature_info_)) { | 920 if (!info->CanRender(feature_info_)) { |
918 ++num_unrenderable_textures_; | 921 ++num_unrenderable_textures_; |
919 } | 922 } |
920 if (!info->SafeToRenderFrom()) { | 923 if (!info->SafeToRenderFrom()) { |
921 ++num_unsafe_textures_; | 924 ++num_unsafe_textures_; |
922 } | 925 } |
923 } | 926 } |
924 | 927 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1056 if (!info->CanRender(feature_info_)) { | 1059 if (!info->CanRender(feature_info_)) { |
1057 DCHECK_NE(0, num_unrenderable_textures_); | 1060 DCHECK_NE(0, num_unrenderable_textures_); |
1058 --num_unrenderable_textures_; | 1061 --num_unrenderable_textures_; |
1059 } | 1062 } |
1060 if (!info->SafeToRenderFrom()) { | 1063 if (!info->SafeToRenderFrom()) { |
1061 DCHECK_NE(0, num_unsafe_textures_); | 1064 DCHECK_NE(0, num_unsafe_textures_); |
1062 --num_unsafe_textures_; | 1065 --num_unsafe_textures_; |
1063 } | 1066 } |
1064 num_uncleared_mips_ -= info->num_uncleared_mips(); | 1067 num_uncleared_mips_ -= info->num_uncleared_mips(); |
1065 DCHECK_GE(num_uncleared_mips_, 0); | 1068 DCHECK_GE(num_uncleared_mips_, 0); |
1066 mem_represented_ -= info->estimated_size(); | 1069 GetMemTracker(info->tracking_pool_)->TrackMemFree(info->estimated_size()); |
1067 bool result = info->MarkMipmapsGenerated(feature_info_); | 1070 bool result = info->MarkMipmapsGenerated(feature_info_); |
1068 mem_represented_ += info->estimated_size(); | 1071 GetMemTracker(info->tracking_pool_)->TrackMemAlloc(info->estimated_size()); |
1069 UpdateMemRepresented(); | 1072 GetMemTracker(info->tracking_pool_)->UpdateMemRepresented(); |
1070 | 1073 |
1071 num_uncleared_mips_ += info->num_uncleared_mips(); | 1074 num_uncleared_mips_ += info->num_uncleared_mips(); |
1072 if (!info->CanRender(feature_info_)) { | 1075 if (!info->CanRender(feature_info_)) { |
1073 ++num_unrenderable_textures_; | 1076 ++num_unrenderable_textures_; |
1074 } | 1077 } |
1075 if (!info->SafeToRenderFrom()) { | 1078 if (!info->SafeToRenderFrom()) { |
1076 ++num_unsafe_textures_; | 1079 ++num_unsafe_textures_; |
1077 } | 1080 } |
1078 return result; | 1081 return result; |
1079 } | 1082 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1119 if (!texture->CanRender(feature_info_)) { | 1122 if (!texture->CanRender(feature_info_)) { |
1120 DCHECK_NE(0, num_unrenderable_textures_); | 1123 DCHECK_NE(0, num_unrenderable_textures_); |
1121 --num_unrenderable_textures_; | 1124 --num_unrenderable_textures_; |
1122 } | 1125 } |
1123 if (!texture->SafeToRenderFrom()) { | 1126 if (!texture->SafeToRenderFrom()) { |
1124 DCHECK_NE(0, num_unsafe_textures_); | 1127 DCHECK_NE(0, num_unsafe_textures_); |
1125 --num_unsafe_textures_; | 1128 --num_unsafe_textures_; |
1126 } | 1129 } |
1127 num_uncleared_mips_ -= texture->num_uncleared_mips(); | 1130 num_uncleared_mips_ -= texture->num_uncleared_mips(); |
1128 DCHECK_GE(num_uncleared_mips_, 0); | 1131 DCHECK_GE(num_uncleared_mips_, 0); |
1129 mem_represented_ -= texture->estimated_size(); | 1132 GetMemTracker(texture->tracking_pool_)->TrackMemFree( |
1130 UpdateMemRepresented(); | 1133 texture->estimated_size()); |
1134 GetMemTracker(texture->tracking_pool_)->UpdateMemRepresented(); | |
1135 } | |
1136 | |
1137 MemoryTypeTracker* TextureManager::GetMemTracker( | |
1138 MemoryTracker::Pool tracking_pool) { | |
1139 switch(tracking_pool) { | |
1140 case MemoryTracker::Managed: | |
greggman
2012/12/12 07:17:47
style: case is indented from switch
ccameron
2012/12/12 21:12:33
Done.
| |
1141 return memory_tracker_managed_.get(); | |
1142 break; | |
1143 case MemoryTracker::Unmanaged: | |
1144 return memory_tracker_unmanaged_.get(); | |
1145 break; | |
1146 default: | |
1147 break; | |
1148 } | |
1149 NOTREACHED(); | |
1150 return NULL; | |
1131 } | 1151 } |
1132 | 1152 |
1133 bool TextureManager::GetClientId(GLuint service_id, GLuint* client_id) const { | 1153 bool TextureManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
1134 // This doesn't need to be fast. It's only used during slow queries. | 1154 // This doesn't need to be fast. It's only used during slow queries. |
1135 for (TextureInfoMap::const_iterator it = texture_infos_.begin(); | 1155 for (TextureInfoMap::const_iterator it = texture_infos_.begin(); |
1136 it != texture_infos_.end(); ++it) { | 1156 it != texture_infos_.end(); ++it) { |
1137 if (it->second->service_id() == service_id) { | 1157 if (it->second->service_id() == service_id) { |
1138 *client_id = it->first; | 1158 *client_id = it->first; |
1139 return true; | 1159 return true; |
1140 } | 1160 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1173 void TextureManager::AddToSignature( | 1193 void TextureManager::AddToSignature( |
1174 TextureInfo* info, | 1194 TextureInfo* info, |
1175 GLenum target, | 1195 GLenum target, |
1176 GLint level, | 1196 GLint level, |
1177 std::string* signature) const { | 1197 std::string* signature) const { |
1178 info->AddToSignature(feature_info_.get(), target, level, signature); | 1198 info->AddToSignature(feature_info_.get(), target, level, signature); |
1179 } | 1199 } |
1180 | 1200 |
1181 } // namespace gles2 | 1201 } // namespace gles2 |
1182 } // namespace gpu | 1202 } // namespace gpu |
OLD | NEW |