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 // When created from InProcessCommandBuffer, we won't have a |memory_tracker_| |
| 1386 // so don't register a dump provider. |
| 1387 if (memory_tracker_) { |
| 1388 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| 1389 this, base::ThreadTaskRunnerHandle::Get()); |
| 1390 } |
| 1391 |
1378 return true; | 1392 return true; |
1379 } | 1393 } |
1380 | 1394 |
1381 scoped_refptr<TextureRef> | 1395 scoped_refptr<TextureRef> |
1382 TextureManager::CreateDefaultAndBlackTextures( | 1396 TextureManager::CreateDefaultAndBlackTextures( |
1383 GLenum target, | 1397 GLenum target, |
1384 GLuint* black_texture) { | 1398 GLuint* black_texture) { |
1385 static uint8 black[] = {0, 0, 0, 255}; | 1399 static uint8 black[] = {0, 0, 0, 255}; |
1386 | 1400 |
1387 // Sampling a texture not associated with any EGLImage sibling will return | 1401 // 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), | 2034 : texture_state_(texture_state), |
2021 begin_time_(base::TimeTicks::Now()) { | 2035 begin_time_(base::TimeTicks::Now()) { |
2022 } | 2036 } |
2023 | 2037 |
2024 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 2038 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
2025 texture_state_->texture_upload_count++; | 2039 texture_state_->texture_upload_count++; |
2026 texture_state_->total_texture_upload_time += | 2040 texture_state_->total_texture_upload_time += |
2027 base::TimeTicks::Now() - begin_time_; | 2041 base::TimeTicks::Now() - begin_time_; |
2028 } | 2042 } |
2029 | 2043 |
| 2044 bool TextureManager::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) { |
| 2045 for (const auto& resource : textures_) { |
| 2046 // Only dump memory info for textures actually owned by this TextureManager. |
| 2047 DumpTextureRef(pmd, resource.second.get()); |
| 2048 } |
| 2049 |
| 2050 // Also dump TextureManager internal textures, if allocated. |
| 2051 for (int i = 0; i < kNumDefaultTextures; i++) { |
| 2052 if (default_textures_[i]) { |
| 2053 DumpTextureRef(pmd, default_textures_[i].get()); |
| 2054 } |
| 2055 } |
| 2056 |
| 2057 return true; |
| 2058 } |
| 2059 |
| 2060 void TextureManager::DumpTextureRef(base::trace_event::ProcessMemoryDump* pmd, |
| 2061 TextureRef* ref) { |
| 2062 // TODO(ericrk): Trace image-backed textures. crbug.com/514914 |
| 2063 if (ref->texture()->HasImages()) |
| 2064 return; |
| 2065 |
| 2066 uint32_t size = ref->texture()->estimated_size(); |
| 2067 |
| 2068 // Ignore unallocated texture IDs. |
| 2069 if (size == 0) |
| 2070 return; |
| 2071 |
| 2072 std::string dump_name = |
| 2073 base::StringPrintf("gl/textures/client_%d/texture_%d", |
| 2074 memory_tracker_->ClientId(), ref->client_id()); |
| 2075 base::trace_event::MemoryAllocatorDump* dump = |
| 2076 pmd->CreateAllocatorDump(dump_name); |
| 2077 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
| 2078 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| 2079 static_cast<uint64_t>(size)); |
| 2080 |
| 2081 // Add the |client_guid| which expresses shared ownership with the client |
| 2082 // process. |
| 2083 auto client_guid = gfx::GetGLTextureGUIDForTracing( |
| 2084 memory_tracker_->ClientTracingId(), ref->client_id()); |
| 2085 pmd->CreateSharedGlobalAllocatorDump(client_guid); |
| 2086 pmd->AddOwnershipEdge(dump->guid(), client_guid); |
| 2087 |
| 2088 // Add a |service_guid| which expresses shared ownership between the various |
| 2089 // |client_guid|s. |
| 2090 // TODO(ericrk): May need to ensure uniqueness using GLShareGroup and |
| 2091 // potentially cross-share-group sharing via EGLImages. crbug.com/512534 |
| 2092 auto service_guid = |
| 2093 gfx::GetGLTextureGUIDForTracing(0, ref->texture()->service_id()); |
| 2094 pmd->CreateSharedGlobalAllocatorDump(service_guid); |
| 2095 |
| 2096 int importance = 0; // Default importance. |
| 2097 // The link to the memory tracking |client_id| is given a higher importance |
| 2098 // than other refs. |
| 2099 if (ref == ref->texture()->memory_tracking_ref_) |
| 2100 importance = 2; |
| 2101 |
| 2102 pmd->AddOwnershipEdge(client_guid, service_guid, importance); |
| 2103 } |
| 2104 |
2030 } // namespace gles2 | 2105 } // namespace gles2 |
2031 } // namespace gpu | 2106 } // namespace gpu |
OLD | NEW |