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 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bits.h" | 11 #include "base/bits.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
14 #include "base/thread_task_runner_handle.h" | |
15 #include "base/trace_event/memory_dump_manager.h" | |
14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 16 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
15 #include "gpu/command_buffer/service/context_state.h" | 17 #include "gpu/command_buffer/service/context_state.h" |
16 #include "gpu/command_buffer/service/error_state.h" | 18 #include "gpu/command_buffer/service/error_state.h" |
17 #include "gpu/command_buffer/service/feature_info.h" | 19 #include "gpu/command_buffer/service/feature_info.h" |
18 #include "gpu/command_buffer/service/framebuffer_manager.h" | 20 #include "gpu/command_buffer/service/framebuffer_manager.h" |
19 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 21 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
20 #include "gpu/command_buffer/service/mailbox_manager.h" | 22 #include "gpu/command_buffer/service/mailbox_manager.h" |
21 #include "gpu/command_buffer/service/memory_tracking.h" | 23 #include "gpu/command_buffer/service/memory_tracking.h" |
22 #include "ui/gl/gl_implementation.h" | 24 #include "ui/gl/gl_implementation.h" |
25 #include "ui/gl/trace_util.h" | |
23 | 26 |
24 namespace gpu { | 27 namespace gpu { |
25 namespace gles2 { | 28 namespace gles2 { |
26 | 29 |
27 namespace { | 30 namespace { |
28 | 31 |
29 // This should contain everything to uniquely identify a Texture. | 32 // This should contain everything to uniquely identify a Texture. |
30 const char TextureTag[] = "|Texture|"; | 33 const char TextureTag[] = "|Texture|"; |
31 struct TextureSignature { | 34 struct TextureSignature { |
32 GLenum target_; | 35 GLenum target_; |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
276 DCHECK(textures_.empty()); | 279 DCHECK(textures_.empty()); |
277 | 280 |
278 // If this triggers, that means something is keeping a reference to | 281 // If this triggers, that means something is keeping a reference to |
279 // a Texture belonging to this. | 282 // a Texture belonging to this. |
280 CHECK_EQ(texture_count_, 0u); | 283 CHECK_EQ(texture_count_, 0u); |
281 | 284 |
282 DCHECK_EQ(0, num_unrenderable_textures_); | 285 DCHECK_EQ(0, num_unrenderable_textures_); |
283 DCHECK_EQ(0, num_unsafe_textures_); | 286 DCHECK_EQ(0, num_unsafe_textures_); |
284 DCHECK_EQ(0, num_uncleared_mips_); | 287 DCHECK_EQ(0, num_uncleared_mips_); |
285 DCHECK_EQ(0, num_images_); | 288 DCHECK_EQ(0, num_images_); |
289 | |
290 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | |
291 this); | |
286 } | 292 } |
287 | 293 |
288 void TextureManager::Destroy(bool have_context) { | 294 void TextureManager::Destroy(bool have_context) { |
289 have_context_ = have_context; | 295 have_context_ = have_context; |
290 textures_.clear(); | 296 textures_.clear(); |
291 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 297 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
292 default_textures_[ii] = NULL; | 298 default_textures_[ii] = NULL; |
293 } | 299 } |
294 | 300 |
295 if (have_context) { | 301 if (have_context) { |
(...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1317 FeatureInfo* feature_info, | 1323 FeatureInfo* feature_info, |
1318 GLint max_texture_size, | 1324 GLint max_texture_size, |
1319 GLint max_cube_map_texture_size, | 1325 GLint max_cube_map_texture_size, |
1320 GLint max_rectangle_texture_size, | 1326 GLint max_rectangle_texture_size, |
1321 GLint max_3d_texture_size, | 1327 GLint max_3d_texture_size, |
1322 bool use_default_textures) | 1328 bool use_default_textures) |
1323 : memory_tracker_managed_( | 1329 : memory_tracker_managed_( |
1324 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), | 1330 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), |
1325 memory_tracker_unmanaged_( | 1331 memory_tracker_unmanaged_( |
1326 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), | 1332 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), |
1333 memory_tracker_(memory_tracker), | |
1327 feature_info_(feature_info), | 1334 feature_info_(feature_info), |
1328 framebuffer_manager_(NULL), | 1335 framebuffer_manager_(NULL), |
1329 max_texture_size_(max_texture_size), | 1336 max_texture_size_(max_texture_size), |
1330 max_cube_map_texture_size_(max_cube_map_texture_size), | 1337 max_cube_map_texture_size_(max_cube_map_texture_size), |
1331 max_rectangle_texture_size_(max_rectangle_texture_size), | 1338 max_rectangle_texture_size_(max_rectangle_texture_size), |
1332 max_3d_texture_size_(max_3d_texture_size), | 1339 max_3d_texture_size_(max_3d_texture_size), |
1333 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, | 1340 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, |
1334 max_texture_size, | 1341 max_texture_size, |
1335 max_texture_size, | 1342 max_texture_size, |
1336 max_texture_size)), | 1343 max_texture_size)), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1368 if (feature_info_->feature_flags().oes_egl_image_external) { | 1375 if (feature_info_->feature_flags().oes_egl_image_external) { |
1369 default_textures_[kExternalOES] = CreateDefaultAndBlackTextures( | 1376 default_textures_[kExternalOES] = CreateDefaultAndBlackTextures( |
1370 GL_TEXTURE_EXTERNAL_OES, &black_texture_ids_[kExternalOES]); | 1377 GL_TEXTURE_EXTERNAL_OES, &black_texture_ids_[kExternalOES]); |
1371 } | 1378 } |
1372 | 1379 |
1373 if (feature_info_->feature_flags().arb_texture_rectangle) { | 1380 if (feature_info_->feature_flags().arb_texture_rectangle) { |
1374 default_textures_[kRectangleARB] = CreateDefaultAndBlackTextures( | 1381 default_textures_[kRectangleARB] = CreateDefaultAndBlackTextures( |
1375 GL_TEXTURE_RECTANGLE_ARB, &black_texture_ids_[kRectangleARB]); | 1382 GL_TEXTURE_RECTANGLE_ARB, &black_texture_ids_[kRectangleARB]); |
1376 } | 1383 } |
1377 | 1384 |
1385 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | |
1386 this, base::ThreadTaskRunnerHandle::Get()); | |
1387 | |
1378 return true; | 1388 return true; |
1379 } | 1389 } |
1380 | 1390 |
1381 scoped_refptr<TextureRef> | 1391 scoped_refptr<TextureRef> |
1382 TextureManager::CreateDefaultAndBlackTextures( | 1392 TextureManager::CreateDefaultAndBlackTextures( |
1383 GLenum target, | 1393 GLenum target, |
1384 GLuint* black_texture) { | 1394 GLuint* black_texture) { |
1385 static uint8 black[] = {0, 0, 0, 255}; | 1395 static uint8 black[] = {0, 0, 0, 255}; |
1386 | 1396 |
1387 // Sampling a texture not associated with any EGLImage sibling will return | 1397 // Sampling a texture not associated with any EGLImage sibling will return |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2020 : texture_state_(texture_state), | 2030 : texture_state_(texture_state), |
2021 begin_time_(base::TimeTicks::Now()) { | 2031 begin_time_(base::TimeTicks::Now()) { |
2022 } | 2032 } |
2023 | 2033 |
2024 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 2034 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
2025 texture_state_->texture_upload_count++; | 2035 texture_state_->texture_upload_count++; |
2026 texture_state_->total_texture_upload_time += | 2036 texture_state_->total_texture_upload_time += |
2027 base::TimeTicks::Now() - begin_time_; | 2037 base::TimeTicks::Now() - begin_time_; |
2028 } | 2038 } |
2029 | 2039 |
2040 bool TextureManager::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) { | |
2041 for (const auto& resource : textures_) { | |
2042 // Only dump memory info for textures actually owned by this TextureManager. | |
2043 DumpTextureRef(pmd, resource.second.get()); | |
2044 } | |
2045 | |
2046 // Also dump TextureManager internal textures, if allocated. | |
2047 for (int i = 0; i < kNumDefaultTextures; i++) { | |
2048 if (default_textures_[i]) { | |
2049 DumpTextureRef(pmd, default_textures_[i].get()); | |
2050 } | |
2051 } | |
2052 | |
2053 return true; | |
2054 } | |
2055 | |
2056 void TextureManager::DumpTextureRef(base::trace_event::ProcessMemoryDump* pmd, | |
2057 TextureRef* ref) { | |
2058 // TODO(ericrk): Trace image-backed textures. crbug.com/514914 | |
2059 if (ref->texture()->HasImages()) | |
2060 return; | |
2061 | |
2062 uint32_t size = ref->texture()->estimated_size(); | |
2063 | |
2064 // Ignore unallocated texture IDs. | |
2065 if (size == 0) | |
2066 return; | |
2067 | |
2068 std::string dump_name = | |
2069 base::StringPrintf("gl/textures/client_%d/texture_%d", | |
2070 memory_tracker_->ClientId(), ref->client_id()); | |
2071 base::trace_event::MemoryAllocatorDump* dump = | |
2072 pmd->CreateAllocatorDump(dump_name); | |
2073 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, | |
2074 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | |
2075 static_cast<uint64_t>(size)); | |
2076 | |
2077 // Add the |client_guid| which expresses shared ownership with the client | |
2078 // process. | |
2079 auto client_guid = gfx::GetGLTextureGUIDForTracing( | |
2080 memory_tracker_->ClientTracingId(), ref->client_id()); | |
2081 pmd->CreateSharedGlobalAllocatorDump(client_guid); | |
2082 pmd->AddOwnershipEdge(dump->guid(), client_guid); | |
2083 | |
2084 // Add a |service_guid| which expresses shared ownership between the various | |
2085 // |client_guid|s. | |
2086 auto service_guid = | |
2087 gfx::GetGLTextureGUIDForTracing(0, ref->texture()->service_id()); | |
piman
2015/08/03 21:36:21
This is fine as a first pass. For Android WebView,
ericrk
2015/08/03 22:11:04
Done.
| |
2088 pmd->CreateSharedGlobalAllocatorDump(service_guid); | |
2089 | |
2090 int importance = 0; // Default importance. | |
2091 // The link to the memory tracking |client_id| is given a higher importance | |
2092 // than other refs. | |
2093 if (ref == ref->texture()->memory_tracking_ref_) | |
2094 importance = 2; | |
2095 | |
2096 pmd->AddOwnershipEdge(client_guid, service_guid, importance); | |
2097 } | |
2098 | |
2030 } // namespace gles2 | 2099 } // namespace gles2 |
2031 } // namespace gpu | 2100 } // namespace gpu |
OLD | NEW |