Chromium Code Reviews| 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 |