| 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::kUnmanaged), |
| 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 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 } | 688 } |
| 686 } | 689 } |
| 687 return 0; | 690 return 0; |
| 688 } | 691 } |
| 689 | 692 |
| 690 TextureManager::TextureManager( | 693 TextureManager::TextureManager( |
| 691 MemoryTracker* memory_tracker, | 694 MemoryTracker* memory_tracker, |
| 692 FeatureInfo* feature_info, | 695 FeatureInfo* feature_info, |
| 693 GLint max_texture_size, | 696 GLint max_texture_size, |
| 694 GLint max_cube_map_texture_size) | 697 GLint max_cube_map_texture_size) |
| 695 : texture_memory_tracker_(new MemoryTypeTracker(memory_tracker)), | 698 : memory_tracker_managed_( |
| 699 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), |
| 700 memory_tracker_unmanaged_( |
| 701 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), |
| 696 feature_info_(feature_info), | 702 feature_info_(feature_info), |
| 697 max_texture_size_(max_texture_size), | 703 max_texture_size_(max_texture_size), |
| 698 max_cube_map_texture_size_(max_cube_map_texture_size), | 704 max_cube_map_texture_size_(max_cube_map_texture_size), |
| 699 max_levels_(ComputeMipMapCount(max_texture_size, | 705 max_levels_(ComputeMipMapCount(max_texture_size, |
| 700 max_texture_size, | 706 max_texture_size, |
| 701 max_texture_size)), | 707 max_texture_size)), |
| 702 max_cube_map_levels_(ComputeMipMapCount(max_cube_map_texture_size, | 708 max_cube_map_levels_(ComputeMipMapCount(max_cube_map_texture_size, |
| 703 max_cube_map_texture_size, | 709 max_cube_map_texture_size, |
| 704 max_cube_map_texture_size)), | 710 max_cube_map_texture_size)), |
| 705 num_unrenderable_textures_(0), | 711 num_unrenderable_textures_(0), |
| 706 num_unsafe_textures_(0), | 712 num_unsafe_textures_(0), |
| 707 num_uncleared_mips_(0), | 713 num_uncleared_mips_(0), |
| 708 texture_info_count_(0), | 714 texture_info_count_(0), |
| 709 mem_represented_(0), | |
| 710 have_context_(true) { | 715 have_context_(true) { |
| 711 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 716 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
| 712 black_texture_ids_[ii] = 0; | 717 black_texture_ids_[ii] = 0; |
| 713 } | 718 } |
| 714 } | 719 } |
| 715 | 720 |
| 716 void TextureManager::UpdateMemRepresented() { | |
| 717 texture_memory_tracker_->UpdateMemRepresented(mem_represented_); | |
| 718 } | |
| 719 | |
| 720 bool TextureManager::Initialize() { | 721 bool TextureManager::Initialize() { |
| 721 UpdateMemRepresented(); | 722 memory_tracker_managed_->UpdateMemRepresented(); |
| 723 memory_tracker_unmanaged_->UpdateMemRepresented(); |
| 722 | 724 |
| 723 // TODO(gman): The default textures have to be real textures, not the 0 | 725 // TODO(gman): The default textures have to be real textures, not the 0 |
| 724 // texture because we simulate non shared resources on top of shared | 726 // texture because we simulate non shared resources on top of shared |
| 725 // resources and all contexts that share resource share the same default | 727 // resources and all contexts that share resource share the same default |
| 726 // texture. | 728 // texture. |
| 727 default_textures_[kTexture2D] = CreateDefaultAndBlackTextures( | 729 default_textures_[kTexture2D] = CreateDefaultAndBlackTextures( |
| 728 GL_TEXTURE_2D, &black_texture_ids_[kTexture2D]); | 730 GL_TEXTURE_2D, &black_texture_ids_[kTexture2D]); |
| 729 default_textures_[kCubeMap] = CreateDefaultAndBlackTextures( | 731 default_textures_[kCubeMap] = CreateDefaultAndBlackTextures( |
| 730 GL_TEXTURE_CUBE_MAP, &black_texture_ids_[kCubeMap]); | 732 GL_TEXTURE_CUBE_MAP, &black_texture_ids_[kCubeMap]); |
| 731 | 733 |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 if (!info->CanRender(feature_info_)) { | 907 if (!info->CanRender(feature_info_)) { |
| 906 DCHECK_NE(0, num_unrenderable_textures_); | 908 DCHECK_NE(0, num_unrenderable_textures_); |
| 907 --num_unrenderable_textures_; | 909 --num_unrenderable_textures_; |
| 908 } | 910 } |
| 909 if (!info->SafeToRenderFrom()) { | 911 if (!info->SafeToRenderFrom()) { |
| 910 DCHECK_NE(0, num_unsafe_textures_); | 912 DCHECK_NE(0, num_unsafe_textures_); |
| 911 --num_unsafe_textures_; | 913 --num_unsafe_textures_; |
| 912 } | 914 } |
| 913 num_uncleared_mips_ -= info->num_uncleared_mips(); | 915 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 914 DCHECK_GE(num_uncleared_mips_, 0); | 916 DCHECK_GE(num_uncleared_mips_, 0); |
| 915 mem_represented_ -= info->estimated_size(); | 917 |
| 918 GetMemTracker(info->tracking_pool_)->TrackMemFree(info->estimated_size()); |
| 916 info->SetLevelInfo( | 919 info->SetLevelInfo( |
| 917 feature_info_, target, level, internal_format, width, height, depth, | 920 feature_info_, target, level, internal_format, width, height, depth, |
| 918 border, format, type, cleared); | 921 border, format, type, cleared); |
| 919 mem_represented_ += info->estimated_size(); | 922 GetMemTracker(info->tracking_pool_)->TrackMemAlloc(info->estimated_size()); |
| 920 UpdateMemRepresented(); | 923 GetMemTracker(info->tracking_pool_)->UpdateMemRepresented(); |
| 921 | 924 |
| 922 num_uncleared_mips_ += info->num_uncleared_mips(); | 925 num_uncleared_mips_ += info->num_uncleared_mips(); |
| 923 if (!info->CanRender(feature_info_)) { | 926 if (!info->CanRender(feature_info_)) { |
| 924 ++num_unrenderable_textures_; | 927 ++num_unrenderable_textures_; |
| 925 } | 928 } |
| 926 if (!info->SafeToRenderFrom()) { | 929 if (!info->SafeToRenderFrom()) { |
| 927 ++num_unsafe_textures_; | 930 ++num_unsafe_textures_; |
| 928 } | 931 } |
| 929 } | 932 } |
| 930 | 933 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1062 if (!info->CanRender(feature_info_)) { | 1065 if (!info->CanRender(feature_info_)) { |
| 1063 DCHECK_NE(0, num_unrenderable_textures_); | 1066 DCHECK_NE(0, num_unrenderable_textures_); |
| 1064 --num_unrenderable_textures_; | 1067 --num_unrenderable_textures_; |
| 1065 } | 1068 } |
| 1066 if (!info->SafeToRenderFrom()) { | 1069 if (!info->SafeToRenderFrom()) { |
| 1067 DCHECK_NE(0, num_unsafe_textures_); | 1070 DCHECK_NE(0, num_unsafe_textures_); |
| 1068 --num_unsafe_textures_; | 1071 --num_unsafe_textures_; |
| 1069 } | 1072 } |
| 1070 num_uncleared_mips_ -= info->num_uncleared_mips(); | 1073 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 1071 DCHECK_GE(num_uncleared_mips_, 0); | 1074 DCHECK_GE(num_uncleared_mips_, 0); |
| 1072 mem_represented_ -= info->estimated_size(); | 1075 GetMemTracker(info->tracking_pool_)->TrackMemFree(info->estimated_size()); |
| 1073 bool result = info->MarkMipmapsGenerated(feature_info_); | 1076 bool result = info->MarkMipmapsGenerated(feature_info_); |
| 1074 mem_represented_ += info->estimated_size(); | 1077 GetMemTracker(info->tracking_pool_)->TrackMemAlloc(info->estimated_size()); |
| 1075 UpdateMemRepresented(); | 1078 GetMemTracker(info->tracking_pool_)->UpdateMemRepresented(); |
| 1076 | 1079 |
| 1077 num_uncleared_mips_ += info->num_uncleared_mips(); | 1080 num_uncleared_mips_ += info->num_uncleared_mips(); |
| 1078 if (!info->CanRender(feature_info_)) { | 1081 if (!info->CanRender(feature_info_)) { |
| 1079 ++num_unrenderable_textures_; | 1082 ++num_unrenderable_textures_; |
| 1080 } | 1083 } |
| 1081 if (!info->SafeToRenderFrom()) { | 1084 if (!info->SafeToRenderFrom()) { |
| 1082 ++num_unsafe_textures_; | 1085 ++num_unsafe_textures_; |
| 1083 } | 1086 } |
| 1084 return result; | 1087 return result; |
| 1085 } | 1088 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1125 if (!texture->CanRender(feature_info_)) { | 1128 if (!texture->CanRender(feature_info_)) { |
| 1126 DCHECK_NE(0, num_unrenderable_textures_); | 1129 DCHECK_NE(0, num_unrenderable_textures_); |
| 1127 --num_unrenderable_textures_; | 1130 --num_unrenderable_textures_; |
| 1128 } | 1131 } |
| 1129 if (!texture->SafeToRenderFrom()) { | 1132 if (!texture->SafeToRenderFrom()) { |
| 1130 DCHECK_NE(0, num_unsafe_textures_); | 1133 DCHECK_NE(0, num_unsafe_textures_); |
| 1131 --num_unsafe_textures_; | 1134 --num_unsafe_textures_; |
| 1132 } | 1135 } |
| 1133 num_uncleared_mips_ -= texture->num_uncleared_mips(); | 1136 num_uncleared_mips_ -= texture->num_uncleared_mips(); |
| 1134 DCHECK_GE(num_uncleared_mips_, 0); | 1137 DCHECK_GE(num_uncleared_mips_, 0); |
| 1135 mem_represented_ -= texture->estimated_size(); | 1138 GetMemTracker(texture->tracking_pool_)->TrackMemFree( |
| 1136 UpdateMemRepresented(); | 1139 texture->estimated_size()); |
| 1140 GetMemTracker(texture->tracking_pool_)->UpdateMemRepresented(); |
| 1141 } |
| 1142 |
| 1143 MemoryTypeTracker* TextureManager::GetMemTracker( |
| 1144 MemoryTracker::Pool tracking_pool) { |
| 1145 switch(tracking_pool) { |
| 1146 case MemoryTracker::kManaged: |
| 1147 return memory_tracker_managed_.get(); |
| 1148 break; |
| 1149 case MemoryTracker::kUnmanaged: |
| 1150 return memory_tracker_unmanaged_.get(); |
| 1151 break; |
| 1152 default: |
| 1153 break; |
| 1154 } |
| 1155 NOTREACHED(); |
| 1156 return NULL; |
| 1137 } | 1157 } |
| 1138 | 1158 |
| 1139 bool TextureManager::GetClientId(GLuint service_id, GLuint* client_id) const { | 1159 bool TextureManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
| 1140 // This doesn't need to be fast. It's only used during slow queries. | 1160 // This doesn't need to be fast. It's only used during slow queries. |
| 1141 for (TextureInfoMap::const_iterator it = texture_infos_.begin(); | 1161 for (TextureInfoMap::const_iterator it = texture_infos_.begin(); |
| 1142 it != texture_infos_.end(); ++it) { | 1162 it != texture_infos_.end(); ++it) { |
| 1143 if (it->second->service_id() == service_id) { | 1163 if (it->second->service_id() == service_id) { |
| 1144 *client_id = it->first; | 1164 *client_id = it->first; |
| 1145 return true; | 1165 return true; |
| 1146 } | 1166 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1179 void TextureManager::AddToSignature( | 1199 void TextureManager::AddToSignature( |
| 1180 TextureInfo* info, | 1200 TextureInfo* info, |
| 1181 GLenum target, | 1201 GLenum target, |
| 1182 GLint level, | 1202 GLint level, |
| 1183 std::string* signature) const { | 1203 std::string* signature) const { |
| 1184 info->AddToSignature(feature_info_.get(), target, level, signature); | 1204 info->AddToSignature(feature_info_.get(), target, level, signature); |
| 1185 } | 1205 } |
| 1186 | 1206 |
| 1187 } // namespace gles2 | 1207 } // namespace gles2 |
| 1188 } // namespace gpu | 1208 } // namespace gpu |
| OLD | NEW |