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

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

Issue 2814583002: Service/ClientDiscardableManager (Closed)
Patch Set: feeedback Created 3 years, 7 months 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 <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 10 matching lines...) Expand all
21 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 21 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
22 #include "gpu/command_buffer/service/context_state.h" 22 #include "gpu/command_buffer/service/context_state.h"
23 #include "gpu/command_buffer/service/error_state.h" 23 #include "gpu/command_buffer/service/error_state.h"
24 #include "gpu/command_buffer/service/feature_info.h" 24 #include "gpu/command_buffer/service/feature_info.h"
25 #include "gpu/command_buffer/service/framebuffer_manager.h" 25 #include "gpu/command_buffer/service/framebuffer_manager.h"
26 #include "gpu/command_buffer/service/gl_stream_texture_image.h" 26 #include "gpu/command_buffer/service/gl_stream_texture_image.h"
27 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 27 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
28 #include "gpu/command_buffer/service/mailbox_manager.h" 28 #include "gpu/command_buffer/service/mailbox_manager.h"
29 #include "gpu/command_buffer/service/memory_tracking.h" 29 #include "gpu/command_buffer/service/memory_tracking.h"
30 #include "gpu/command_buffer/service/progress_reporter.h" 30 #include "gpu/command_buffer/service/progress_reporter.h"
31 #include "gpu/command_buffer/service/service_discardable_manager.h"
31 #include "ui/gl/gl_context.h" 32 #include "ui/gl/gl_context.h"
32 #include "ui/gl/gl_implementation.h" 33 #include "ui/gl/gl_implementation.h"
33 #include "ui/gl/gl_state_restorer.h" 34 #include "ui/gl/gl_state_restorer.h"
34 #include "ui/gl/gl_version_info.h" 35 #include "ui/gl/gl_version_info.h"
35 #include "ui/gl/trace_util.h" 36 #include "ui/gl/trace_util.h"
36 37
37 using base::trace_event::MemoryAllocatorDump; 38 using base::trace_event::MemoryAllocatorDump;
38 using base::trace_event::MemoryDumpLevelOfDetail; 39 using base::trace_event::MemoryDumpLevelOfDetail;
39 40
40 namespace gpu { 41 namespace gpu {
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 DCHECK_EQ(0, num_uncleared_mips_); 435 DCHECK_EQ(0, num_uncleared_mips_);
435 DCHECK_EQ(0, num_images_); 436 DCHECK_EQ(0, num_images_);
436 437
437 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( 438 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
438 this); 439 this);
439 } 440 }
440 441
441 void TextureManager::Destroy(bool have_context) { 442 void TextureManager::Destroy(bool have_context) {
442 have_context_ = have_context; 443 have_context_ = have_context;
443 444
445 // Retreive any outstanding unlocked textures from the discardable manager so
446 // we can clean them up here.
447 discardable_manager_->OnTextureManagerDestruction(this);
448
444 while (!textures_.empty()) { 449 while (!textures_.empty()) {
445 textures_.erase(textures_.begin()); 450 textures_.erase(textures_.begin());
446 if (progress_reporter_) 451 if (progress_reporter_)
447 progress_reporter_->ReportProgress(); 452 progress_reporter_->ReportProgress();
448 } 453 }
449 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { 454 for (int ii = 0; ii < kNumDefaultTextures; ++ii) {
450 default_textures_[ii] = NULL; 455 default_textures_[ii] = NULL;
451 if (progress_reporter_) 456 if (progress_reporter_)
452 progress_reporter_->ReportProgress(); 457 progress_reporter_->ReportProgress();
453 } 458 }
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1883 } 1888 }
1884 1889
1885 TextureManager::TextureManager(MemoryTracker* memory_tracker, 1890 TextureManager::TextureManager(MemoryTracker* memory_tracker,
1886 FeatureInfo* feature_info, 1891 FeatureInfo* feature_info,
1887 GLint max_texture_size, 1892 GLint max_texture_size,
1888 GLint max_cube_map_texture_size, 1893 GLint max_cube_map_texture_size,
1889 GLint max_rectangle_texture_size, 1894 GLint max_rectangle_texture_size,
1890 GLint max_3d_texture_size, 1895 GLint max_3d_texture_size,
1891 GLint max_array_texture_layers, 1896 GLint max_array_texture_layers,
1892 bool use_default_textures, 1897 bool use_default_textures,
1893 ProgressReporter* progress_reporter) 1898 ProgressReporter* progress_reporter,
1899 ServiceDiscardableManager* discardable_manager)
1894 : memory_type_tracker_(new MemoryTypeTracker(memory_tracker)), 1900 : memory_type_tracker_(new MemoryTypeTracker(memory_tracker)),
1895 memory_tracker_(memory_tracker), 1901 memory_tracker_(memory_tracker),
1896 feature_info_(feature_info), 1902 feature_info_(feature_info),
1897 framebuffer_manager_(NULL), 1903 framebuffer_manager_(NULL),
1898 max_texture_size_(max_texture_size), 1904 max_texture_size_(max_texture_size),
1899 max_cube_map_texture_size_(max_cube_map_texture_size), 1905 max_cube_map_texture_size_(max_cube_map_texture_size),
1900 max_rectangle_texture_size_(max_rectangle_texture_size), 1906 max_rectangle_texture_size_(max_rectangle_texture_size),
1901 max_3d_texture_size_(max_3d_texture_size), 1907 max_3d_texture_size_(max_3d_texture_size),
1902 max_array_texture_layers_(max_array_texture_layers), 1908 max_array_texture_layers_(max_array_texture_layers),
1903 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, 1909 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D,
1904 max_texture_size, 1910 max_texture_size,
1905 max_texture_size, 1911 max_texture_size,
1906 0)), 1912 0)),
1907 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP, 1913 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP,
1908 max_cube_map_texture_size, 1914 max_cube_map_texture_size,
1909 max_cube_map_texture_size, 1915 max_cube_map_texture_size,
1910 0)), 1916 0)),
1911 max_3d_levels_(ComputeMipMapCount(GL_TEXTURE_3D, 1917 max_3d_levels_(ComputeMipMapCount(GL_TEXTURE_3D,
1912 max_3d_texture_size, 1918 max_3d_texture_size,
1913 max_3d_texture_size, 1919 max_3d_texture_size,
1914 max_3d_texture_size)), 1920 max_3d_texture_size)),
1915 use_default_textures_(use_default_textures), 1921 use_default_textures_(use_default_textures),
1916 num_unsafe_textures_(0), 1922 num_unsafe_textures_(0),
1917 num_uncleared_mips_(0), 1923 num_uncleared_mips_(0),
1918 num_images_(0), 1924 num_images_(0),
1919 texture_count_(0), 1925 texture_count_(0),
1920 have_context_(true), 1926 have_context_(true),
1921 current_service_id_generation_(0), 1927 current_service_id_generation_(0),
1922 progress_reporter_(progress_reporter) { 1928 progress_reporter_(progress_reporter),
1929 discardable_manager_(discardable_manager) {
1923 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { 1930 for (int ii = 0; ii < kNumDefaultTextures; ++ii) {
1924 black_texture_ids_[ii] = 0; 1931 black_texture_ids_[ii] = 0;
1925 } 1932 }
1926 } 1933 }
1927 1934
1928 bool TextureManager::Initialize() { 1935 bool TextureManager::Initialize() {
1929 // Reset PIXEL_UNPACK_BUFFER to avoid unrelated GL error on some GL drivers. 1936 // Reset PIXEL_UNPACK_BUFFER to avoid unrelated GL error on some GL drivers.
1930 if (feature_info_->gl_version_info().is_es3_capable) { 1937 if (feature_info_->gl_version_info().is_es3_capable) {
1931 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); 1938 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
1932 } 1939 }
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
2104 GLenum type, 2111 GLenum type,
2105 const gfx::Rect& cleared_rect) { 2112 const gfx::Rect& cleared_rect) {
2106 DCHECK(gfx::Rect(width, height).Contains(cleared_rect)); 2113 DCHECK(gfx::Rect(width, height).Contains(cleared_rect));
2107 DCHECK(ref); 2114 DCHECK(ref);
2108 Texture* texture = ref->texture(); 2115 Texture* texture = ref->texture();
2109 2116
2110 texture->GetMemTracker()->TrackMemFree(texture->estimated_size()); 2117 texture->GetMemTracker()->TrackMemFree(texture->estimated_size());
2111 texture->SetLevelInfo(target, level, internal_format, width, height, depth, 2118 texture->SetLevelInfo(target, level, internal_format, width, height, depth,
2112 border, format, type, cleared_rect); 2119 border, format, type, cleared_rect);
2113 texture->GetMemTracker()->TrackMemAlloc(texture->estimated_size()); 2120 texture->GetMemTracker()->TrackMemAlloc(texture->estimated_size());
2121 discardable_manager_->OnTextureSizeChanged(ref->client_id(), this,
2122 texture->estimated_size());
2114 } 2123 }
2115 2124
2116 Texture* TextureManager::Produce(TextureRef* ref) { 2125 Texture* TextureManager::Produce(TextureRef* ref) {
2117 DCHECK(ref); 2126 DCHECK(ref);
2118 return ref->texture(); 2127 return ref->texture();
2119 } 2128 }
2120 2129
2121 TextureRef* TextureManager::Consume( 2130 TextureRef* TextureManager::Consume(
2122 GLuint client_id, 2131 GLuint client_id,
2123 Texture* texture) { 2132 Texture* texture) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2197 DCHECK(result.second); 2206 DCHECK(result.second);
2198 return ref.get(); 2207 return ref.get();
2199 } 2208 }
2200 2209
2201 TextureRef* TextureManager::GetTexture( 2210 TextureRef* TextureManager::GetTexture(
2202 GLuint client_id) const { 2211 GLuint client_id) const {
2203 TextureMap::const_iterator it = textures_.find(client_id); 2212 TextureMap::const_iterator it = textures_.find(client_id);
2204 return it != textures_.end() ? it->second.get() : NULL; 2213 return it != textures_.end() ? it->second.get() : NULL;
2205 } 2214 }
2206 2215
2216 scoped_refptr<TextureRef> TextureManager::TakeTexture(GLuint client_id) {
2217 auto it = textures_.find(client_id);
2218 if (it == textures_.end())
2219 return nullptr;
2220
2221 scoped_refptr<TextureRef> ref = it->second;
2222 textures_.erase(it);
2223 return ref;
2224 }
2225
2226 void TextureManager::ReturnTexture(scoped_refptr<TextureRef> texture_ref) {
2227 GLuint client_id = texture_ref->client_id();
2228 textures_.emplace(client_id, std::move(texture_ref));
2229 }
2230
2207 void TextureManager::RemoveTexture(GLuint client_id) { 2231 void TextureManager::RemoveTexture(GLuint client_id) {
2208 TextureMap::iterator it = textures_.find(client_id); 2232 TextureMap::iterator it = textures_.find(client_id);
2209 if (it != textures_.end()) { 2233 if (it != textures_.end()) {
2234 discardable_manager_->OnTextureDeleted(client_id, this);
ericrk 2017/05/10 21:36:03 Don't love doing this both here and in StopTrackin
2210 it->second->reset_client_id(); 2235 it->second->reset_client_id();
2211 textures_.erase(it); 2236 textures_.erase(it);
2212 } 2237 }
2213 } 2238 }
2214 2239
2215 void TextureManager::StartTracking(TextureRef* ref) { 2240 void TextureManager::StartTracking(TextureRef* ref) {
2216 Texture* texture = ref->texture(); 2241 Texture* texture = ref->texture();
2217 ++texture_count_; 2242 ++texture_count_;
2218 num_uncleared_mips_ += texture->num_uncleared_mips(); 2243 num_uncleared_mips_ += texture->num_uncleared_mips();
2219 if (!texture->SafeToRenderFrom()) 2244 if (!texture->SafeToRenderFrom())
(...skipping 16 matching lines...) Expand all
2236 if (texture->HasImages()) { 2261 if (texture->HasImages()) {
2237 DCHECK_NE(0, num_images_); 2262 DCHECK_NE(0, num_images_);
2238 --num_images_; 2263 --num_images_;
2239 } 2264 }
2240 if (!texture->SafeToRenderFrom()) { 2265 if (!texture->SafeToRenderFrom()) {
2241 DCHECK_NE(0, num_unsafe_textures_); 2266 DCHECK_NE(0, num_unsafe_textures_);
2242 --num_unsafe_textures_; 2267 --num_unsafe_textures_;
2243 } 2268 }
2244 num_uncleared_mips_ -= texture->num_uncleared_mips(); 2269 num_uncleared_mips_ -= texture->num_uncleared_mips();
2245 DCHECK_GE(num_uncleared_mips_, 0); 2270 DCHECK_GE(num_uncleared_mips_, 0);
2271
2272 if (ref->client_id())
2273 discardable_manager_->OnTextureDeleted(ref->client_id(), this);
2246 } 2274 }
2247 2275
2248 MemoryTypeTracker* TextureManager::GetMemTracker() { 2276 MemoryTypeTracker* TextureManager::GetMemTracker() {
2249 return memory_type_tracker_.get(); 2277 return memory_type_tracker_.get();
2250 } 2278 }
2251 2279
2252 Texture* TextureManager::GetTextureForServiceId(GLuint service_id) const { 2280 Texture* TextureManager::GetTextureForServiceId(GLuint service_id) const {
2253 // This doesn't need to be fast. It's only used during slow queries. 2281 // This doesn't need to be fast. It's only used during slow queries.
2254 for (TextureMap::const_iterator it = textures_.begin(); 2282 for (TextureMap::const_iterator it = textures_.begin();
2255 it != textures_.end(); ++it) { 2283 it != textures_.end(); ++it) {
(...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after
3687 uint32_t TextureManager::GetServiceIdGeneration() const { 3715 uint32_t TextureManager::GetServiceIdGeneration() const {
3688 return current_service_id_generation_; 3716 return current_service_id_generation_;
3689 } 3717 }
3690 3718
3691 void TextureManager::IncrementServiceIdGeneration() { 3719 void TextureManager::IncrementServiceIdGeneration() {
3692 current_service_id_generation_++; 3720 current_service_id_generation_++;
3693 } 3721 }
3694 3722
3695 } // namespace gles2 3723 } // namespace gles2
3696 } // namespace gpu 3724 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698