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

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

Issue 11516014: Track managed memory usage in the command buffer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Resolve against HEAD Created 8 years 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 | Annotate | Revision Log
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 #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
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
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
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
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
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
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
OLDNEW
« gpu/command_buffer/service/memory_tracking.h ('K') | « gpu/command_buffer/service/texture_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698